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
|