客户/服务器远程数据传输处理本领[VC/C++编程]
本文“客户/服务器远程数据传输处理本领[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在实际的MIS系统中,远程数据库拜候大多通过Modem衔接,出于通信费用及速度方面的考虑,常常采取先将数据保存在本地,然后集合传送到远端的办法.远程数据传送可以有多种筹划,最常见的是先将要传送的数据打包成文件,在操纵文件传输情势传送到目的地,在目的地对数据恢复后增添到本地数据库中.这种办法普各处利用于证券交易系统,其长处是速度快,并且可事前对数据压缩,更大限度地节俭传送时间及费用.但这种筹划也有其不足之处:由于操纵文件传输机制,无法操纵数据库本身的特点如完好性约束、数据一致性、回滚机制等,因此在对比复杂的数据库系统中较少采取.另一种办法是直接将两头处理成"客户/服务器"情势,将数据传送当作是向Server提交数据.由于这种筹划充分操纵了数据库服务器的特点,并且实际操作基本与局域网方法一致,因此本文将具体介绍这种筹划.别的本文的部份内容是基于Delphi/CBuilder的.
由于传输速度的缘由,当传送大量数据时绝对不赞成逐条记录地向服务器提交数据,而应批量地向Server提交,Delphi/CBuilder中供应了一个TBatchMove控件专门用于批量传送数据,操纵它可极大削减网络负担,提高传送速度.遗憾的是,TBatchMove控件只供应了简单的错误掌握功效,没有供应显示传送进度、用户终止传送等重要功效.但是TBatchMove所依靠的BDE却供应了一种"回调机制"可以完成上述两个功效.所谓"回调"历程是这样的:当BDE履行某种操作时,比方从一张表向另一张表拷贝大量数据的历程中,每过一段时间(如需求显示拷贝进度时),BDE会调用一段你自己写的函数(回调函数),以帮忙你更完好地掌握程序.这种做法有点想DLPHI中的Event(事件)及事件处理函数--某个具体的操作行动会让VCL触发某个事件,从而调用一段你写好的事件处理函数,差别的事件会触发差别的处理函数.
为了让BDE能精确地与你的函数协同工作,你必须事前"注册"你的函数,让BDE知道某个事件发生时应调用(回调)你的某段代码.BDE供应了一个DbiRegisterCallBack注册函数,不幸的是,BDE的联机帮忙中的阐明不能合适于Delphi/CBuilder,按照该阐明编写的程序根本不能通过编译!笔者通过实践找到了精确利用BDE回调函数的办法,下面将具体介绍该机制的利用.BDE回调机制包含以下几个步骤:
1)按BDE的预定格局编写你的回调函数
2)调用DbiRegisterCallBack函数注册你的回调函数,这样当你履行相关数据库操作时就自然地触发你的回调函数.
3)履行相关数据库操作,比方BatchMove1->Exectue();
4)注销该回调函数
此中最关键的是精确注册你的回调函数,因此先介绍第二步.(注册与注销都调用同一函数,只是最后一个参数略有差别)
首先你应知道在哪类"事件"发生时调用你的回调函数,其次你应懂得与该事件相关的参数及数据构造--这一切都发生在调用DbiRegisterCallBack函数注册时,所以下面先介绍DbiRegisterCallBack的精确用法及阐明:
在原BDE帮忙中该函数的原形(C)是这样的
DBIResult DBIFN DbiRegisterCallBack (hCursor, ecbType, iClientData, iCbBufLen, pCbBuf, pfCb);
要利用该函数必须include头文件,问题是Delphi/CBuilder中根本没有供应当文件,取而代之的是"BDE.HPP",但是在包含进该文件后程序仍旧不能编译通过,因为该文件中没有DBIFN等的阐明.一个简单的办法是在代码中去掉DBIFN.函数中各参数注释以下:hCursor是一个BDE中对象的句柄,假如这个参数为NULL,则表示注册的回调函数合适于全部BDE任务;第二个参数ecbType是指回调函数的触发条件的类别,有很多种范例可以挑选,此中cbGENPROGRESS表示当需求显示一个长操作的进度时触发这个回调函数;第三个参数iClientData是传送给回调函数的某个数据构造的指针,在我们的例子中为NULL;第四个参数iCbBufLen是指回调Buffer的大小,该大小随第二个参数的差别而差别,比方sizeof(CBPROGRESSDesc);第五个参数pCbBuf是回调Buffer的指针,该指针范例随第二个参数改变,比方cbGENPROGRESS的数据构造是CBPROGRESSDesc;最后一个参数是回调函数的地址指针,当该参数为NULL时表示注销该范例的回调函数.关于回调函数将在稍后具体介绍.下面是注册履行长操作时显示进度的回调函数的格局:
int rst= DbiRegisterCallBack (NULL,
//合适于任何进程
cbGENPROGRESS, //回调范例:显示长操作的进度
NULL, //没有数据
sizeof(CBPROGRESSDesc), //数据构造的大小
&aCBBuf, //数据的内存地址
ApiCallBackFun //回调函数的地址
);
接下来就应当完成第一步:编写回调函数
在C中,回调函数应以下声明:
CBRType__stdcallApiCallBackFun(
CBTyp eecbType,//回调范例
int iClientData,//回调数据(指针)
void *pCbInfo//回调数据构造指针
)
第一个参数是回调范例;第二个参数是回调数据,其注释同DbiRegisterCallBack的第三个参数;第三个是回调数据的指针,该数据的构造随回调范例的差别而差别.比方进度指导cbGENPROGRESS的数据构造是CBPROGRESSDesc,其定义以下:
struct CBPROGRESSDesc {
short iPercentDone; //进度的百分比
char szMsg[128]; //进度的文本信息
};
该构造的两个域同时只有一个起作用,第一个表示操作的进度百分比,当其为-1时表示第二个域起作用.第二个域用字符串表示进度信息,其格局为<String><:><Value>,比方:RecordsCopied:125
以上是“客户/服务器远程数据传输处理本领[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |