论文无忧网提供:计算机毕业论文范文|计算机毕业设计|计算机毕业论文
栏目导航 ASP Java Web .NET VB6.0 JAVA VC VF DELPHI PB 计算机网络 计算机科学与技术 PHP 安卓APP 其他 C# 代写论文
当前位置: > 计算机 > 计算机科学与技术 >

虚拟实验平台的网络化改进方向-教师管理模块(论文+程序)

3.3.2 数据库连接控件ADO介绍

ADO是ActiveX数据对象(ActiveX Data Object),这是Microsoft开发数据库应用程序的面向对象的新接口。ADO访问数据库是通过访问OLE DB数据提供程序来进行的,提供了一种对OLE DB数据提供程序的简单高层访问接口。ADO技术简化了OLE DB的操作,OLE DB的程序中使用了大量的COM接口,而ADO封装了这些接口。所以,ADO是一种高层的访问技术。ADO技术基于通用对象模型(COM),它提供了多种语言的访问技术,同时,由于ADO提供了访问自动化接口,所以,ADO可以用描述的脚本语言来访问VBScript,VCScript等。在VC中可以使用VC6提供的ActiveX控件开发应用程序,还可以用ADO对象开发应用程序。使用ADO对象开发应用程序可以使程序开发者更容易地控制对数据库的访问,从而产生符合用户需求的数据库访问程序。

http://www.paper51.com

使用ADO对象开发应用程序也类似其它技术,需产生与数据源的连接,创建记录等步骤,但与其它访问技术不同的是,ADO技术对对象之间的层次和顺序关系要求不是太严格。在程序开发过程中,不必选建立连接,然后才能产生记录对象等。可以在使用记录的地方直接使用记录对象,在创建记录对象的同时,程序自动建立了与数据源的连接。这种模型有力的简化了程序设计,增强了程序的灵活性。

http://www.paper51.com

以下利用ADO控件类ADOConn的主要函数实现:

http://www.paper51.com

void  ADOConn::OnInitADOConn(CStringm_ip)  copyright paper51.com

// 初始化—连接数据库 copyright paper51.com

{// 初始化OLE/COM库环境 copyright paper51.com

CoInitialize(NULL); 内容来自www.paper51.com

try copyright paper51.com

{// 创建Connection对象 http://www.paper51.com

m_pConnection.CreateInstance("ADODB.Connection");

paper51.com

// 设置连接字符串,必须是BSTR型或者_bstr_t类型    _bstr_t strConnect="Provider=SQLOLEDB;Server="+m_ip+";Database=SY;uid=sa;pwd=985723"; 

内容来自www.paper51.com

m_pConnection->Open(strConnect,"","",adModeUnknown); paper51.com

} 内容来自www.paper51.com

// 捕捉异常

paper51.com

catch(_com_errore) http://www.paper51.com

{// 显示错误信息

内容来自论文无忧网 www.paper51.com

AfxMessageBox(e.Description()); 内容来自www.paper51.com

}

paper51.com

} http://www.paper51.com

// 执行查询

copyright paper51.com

_RecordsetPtr&  ADOConn::GetRecordSet(_bstr_t bstrSQL)

copyright paper51.com

{ try

内容来自www.paper51.com

{// 连接数据库,如果Connection对象为空,则重新连接数据库

内容来自www.paper51.com

if(m_pConnection==NULL)

内容来自论文无忧网 www.paper51.com

OnInitADOConn();

内容来自www.paper51.com

// 创建记录集对象 http://www.paper51.com

m_pRecordset.CreateInstance(__uuidof(Recordset));

paper51.com

// 取得表中的记录

内容来自论文无忧网 www.paper51.com

m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 内容来自论文无忧网 www.paper51.com

}

内容来自论文无忧网 www.paper51.com

// 捕捉异常 http://www.paper51.com

catch(_com_errore)

http://www.paper51.com

{ // 显示错误信息

http://www.paper51.com

AfxMessageBox(e.Description());

http://www.paper51.com

}

paper51.com

// 返回记录集 http://www.paper51.com

return m_pRecordset;

http://www.paper51.com

}

copyright paper51.com

// 执行SQL语句,Insert Update _variant_t 内容来自www.paper51.com

BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)

copyright paper51.com

{ try 内容来自www.paper51.com

{// 是否已经连接数据库

copyright paper51.com

if(m_pConnection == NULL)

http://www.paper51.com

OnInitADOConn();

http://www.paper51.com

// Connection对象的Execute方法:(_bstr_tCommandText,

内容来自论文无忧网 www.paper51.com

// VARIANT * RecordsAffected,long Options ) copyright paper51.com

// 其中CommandText是命令字串,通常是SQL命令。 copyright paper51.com

// 参数RecordsAffected是操作完成后所影响的行数, 内容来自论文无忧网 www.paper51.com

// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名 http://www.paper51.com

// adCmdProc-存储过程;adCmdUnknown-未知

内容来自www.paper51.com

m_pConnection->Execute(bstrSQL,NULL,adCmdText); copyright paper51.com

return true;

内容来自论文无忧网 www.paper51.com

} http://www.paper51.com

catch(_com_errore)

内容来自www.paper51.com

{  AfxMessageBox(e.Description()); http://www.paper51.com

return false; 内容来自论文无忧网 www.paper51.com

} paper51.com

}

http://www.paper51.com

void ADOConn::ExitConnect() http://www.paper51.com

{// 关闭记录集和连接 copyright paper51.com

if (m_pRecordset!= NULL) 内容来自论文无忧网 www.paper51.com

m_pRecordset->Close(); 内容来自www.paper51.com

m_pConnection->Close();

copyright paper51.com

// 释放环境 内容来自论文无忧网 www.paper51.com

::CoUninitialize(); 内容来自www.paper51.com

}

http://www.paper51.com

3.3.3 对数据库操作实现

http://www.paper51.com

与数据库连接主要是通过CDatabaseInterface类调用ADO控件类的函数来实现 内容来自论文无忧网 www.paper51.com

其中主要的操作函数包括以下:

paper51.com

注册处理:

内容来自www.paper51.com

Register(CString password, ULONG&id, CString &name) 内容来自www.paper51.com

登陆处理:

paper51.com

Login(CString password, ULONG id, CString &name)

http://www.paper51.com

得到用户ID: 内容来自论文无忧网 www.paper51.com

GetUserByID(ULONG id,LPUSER &pUser,POSITION&position)

copyright paper51.com

验证用户密码:

内容来自www.paper51.com

bool CDatabaseInterface::ChkUser(int id, CString pwd)

http://www.paper51.com

3.4 数据分析模块

copyright paper51.com

3.4.1 提供基本网络事件处理功能类CCommandProcessor

内容来自论文无忧网 www.paper51.com

class CCommandProcessor 

paper51.com

{public: 内容来自www.paper51.com

CCommandProcessor(); 内容来自论文无忧网 www.paper51.com

virtual ~CCommandProcessor(); copyright paper51.com

public: paper51.com

ULONG     m_my_id;

内容来自www.paper51.com

CString       m_my_name; copyright paper51.com

DATA      ReadData; 内容来自www.paper51.com

DATA      SendData;

copyright paper51.com

CString       m_strLogMessage;

内容来自www.paper51.com

//服务器IP和PORT 内容来自www.paper51.com

CString       SERVER_IP; 内容来自论文无忧网 www.paper51.com

CListBox    *m_pList;

paper51.com

public: 内容来自论文无忧网 www.paper51.com

BOOL  Compose_Send_Cmd_Quit();

http://www.paper51.com

Void   Compose_Send_Cmd_Login(ULONG id,CString password);

http://www.paper51.com

Void   Compose_Send_Cmd_Register(CStringpassword); copyright paper51.com

void   DataAnalysis();

http://www.paper51.com

protected: http://www.paper51.com

void   Net_Event_Server_Quit();

paper51.com

void   Net_Event_Error(); http://www.paper51.com

int    GetUserFromUserListByID(ULONGid); paper51.com

void   Net_Event_Login_User(); 内容来自www.paper51.com

void   Net_Event_Login_Notify();

内容来自www.paper51.com

void   Net_Event_Quit_Notify(); copyright paper51.com

void   Net_Event_Login(); copyright paper51.com

void   Net_Event_Register(); http://www.paper51.com

void   OnNetEvent();

内容来自论文无忧网 www.paper51.com

protected: copyright paper51.com

void   ExtractLongToChar(charszData[4],ULONG lData);

http://www.paper51.com

void   PutCharToLong(charszData[4],ULONG&lData); paper51.com

protected:

http://www.paper51.com

virtual  void   OnChatEvent()=0; http://www.paper51.com

}; http://www.paper51.com

基类提供基本的网络事件处理功能:

内容来自www.paper51.com

(1) 注册 内容来自www.paper51.com

(2) 登陆 paper51.com

登陆包括: paper51.com

登陆 paper51.com

② 登陆通知 内容来自www.paper51.com

登陆返回信息

内容来自www.paper51.com

(3) 通出

内容来自论文无忧网 www.paper51.com

通出包括:

内容来自www.paper51.com

退出

paper51.com

② 退出通知 内容来自www.paper51.com

这些功能的基本格式如下:

copyright paper51.com

enum tagCmdGroup

http://www.paper51.com

{CMD_GROUP_NET_EVENT,           //基本网络命令组

http://www.paper51.com

 CMD_GROUP_TRANS_EVENT    //实验信息传输命令组

copyright paper51.com

}; paper51.com

//命令号定义及命令格式 copyright paper51.com

enum tagCMD_NET_EVENT

copyright paper51.com

{//PASSWORD[N]

paper51.com

//HEAD+N++PASSWORD copyright paper51.com

CMD_NET_EVENT_REGISTER,      //注册 内容来自论文无忧网 www.paper51.com

//ID[4]+PASSWORD[N]

copyright paper51.com

CMD_NET_EVENT_LOGIN,        //登陆

paper51.com

//ID[4]+PASSWORD[N] paper51.com

CMD_NET_EVENT_LOGIN_NOTIFY,    //登陆通知

copyright paper51.com

//ID[4]+PASSWORD[N] copyright paper51.com

CMD_NET_EVENT_LOGIN_USER,  //登陆返回其它相关用户信息 paper51.com

//ID[4]

http://www.paper51.com

CMD_NET_EVENT_QUIT,          //退出 内容来自www.paper51.com

//ID[4] 内容来自论文无忧网 www.paper51.com

CMD_NET_EVENT_QUIT_NOTIFY,       //退出通知(通知其它相关用户这个退出信息) 内容来自www.paper51.com

//ID[4] 内容来自论文无忧网 www.paper51.com

CMD_NET_EVENT_TIMEOUT,

内容来自www.paper51.com

//发生错误:错误内容[n]

内容来自www.paper51.com

CMD_NET_EVENT_ERROR,             //发生网络基本事件错误时,返回错误信息内容

http://www.paper51.com

//无数据内容 内容来自www.paper51.com

CMD_NET_EVENT_SERVER_QUIT //服务器关掉了,通知所有在线用户

http://www.paper51.com

}; 内容来自www.paper51.com

enum tagCMD_TRANS_EVENT http://www.paper51.com

{ //发送方ID[4]+接收方ID[4]+信息内容

http://www.paper51.com

   CMD_TRANS_EVENT_TRANS          //实验信息传输命令 内容来自www.paper51.com

}; 内容来自论文无忧网 www.paper51.com

3.4.2 提供其它应用层功能类 CCrealCmdProcessor 内容来自论文无忧网 www.paper51.com

子类提供其它应用层功能,例如实验文件传输等。每一项功能,都需要在基类中加入一个相应的虚函数,这个虚函数由子类重载,填入代码。

copyright paper51.com

class CRealCmdProcessor : public CCommandProcessor 

内容来自论文无忧网 www.paper51.com

{ paper51.com

public:

内容来自www.paper51.com

CRealCmdProcessor(); http://www.paper51.com

virtual ~CRealCmdProcessor();

内容来自论文无忧网 www.paper51.com

public: 内容来自www.paper51.com

BOOL Compose_Send_Cmd_Trans(CString content); 内容来自论文无忧网 www.paper51.com

private:

paper51.com

void TransEvent_Trans();        //虚函数申明 http://www.paper51.com

virtual void OnTranstEvent();   

paper51.com

};

http://www.paper51.com

3.4.3 服务器如何分配最佳节点

paper51.com

假设系统的网络拓扑结构入下图:

http://www.paper51.com

内容来自www.paper51.com

图3 模拟网络拓扑图 copyright paper51.com

假设有3个客户端A、B、C分别处在3个不同的局域网中,网络拓扑结构如图3所示。其中线上的数字表示通信时延。为简化模型,这里我们不考虑通信时延的方向性。

paper51.com

假设客户端A向服务器发出下载一个实验电路图及相应的器件DLL的请求信息,这类请求很耗服务器资源。如果客户端B和C也有A需要的实验电路图及相应的器件DLL的话,为了减轻服务器的负担,此时可以不由服务器直接向A提供相关信息,而由其他客户端(例如B或C)通过P2P通信的方式来满足A的需求。

内容来自www.paper51.com

对A来说,与A通信效率最高的其他客户端是最佳选择。如图3所示的网络拓扑结构,我们可以直观看出,客户端B和C都可与A通信,但B与A通信的延时更小。如何实现让B来与A通信呢?首先是如何选出B? paper51.com

要选出B,先要知道整个网络的拓扑结构。作为客户端, A自身不便于得到整个网络的拓扑结构,但服务器可以得到网络结构。所以,可以由服务器来执行挑选。服务器用什么算法来实现挑选?我们可以把网络拓扑结构图看成一个带权值的无向图(简化模型是无向图),问题就变成在无向图中找出两个顶点之间的最短权值路径。结合我们的应用,最后选择了Floyed算法。在3.4.4节中有介绍此算法的原理以及实现。 paper51.com

服务器获取网络拓扑的思路是:先让客户端通过Tracert命令联接服务器,得到该客户端到达服务器所要经过的各路由器节点以及每到一站需要的时间等一些信息。然后客户端将其路由信息传给服务器,服务器将各客户端的这些路由信息保存到数据库中,从而可以得到各客户端与服务器之间的大体网络拓扑结构。这将作为Floyed算法的必要的输入信息

copyright paper51.com

------分隔线----------------------------
联系方式