开发存取数据的COM+组件
首先在DELPHI集成开发环境中点选File|New|Other...菜单,并且选择ActiveX Library以建立ActiveX Dll应用程序。
接着在Multitier页中选择建立Transactional DataModule以便在ActiveX Dll中建立COM+数据模块,以准备使用数据存取控件来建立连接和存取数据库。
点选了Transactional DataModule图标之后,DELPHI会询问程序员这个控件的CoClass Name特性值,以及这个COM+控件使用的线程模型和支持的交易模式,在此,设定CoClass Name为MyCom,并且选择使用Apartment以支持交易模式等特性。
点选上图的“OK”按钮之后,Delphi会建立一个空白的MTS数据模块,我们接着必须在这个数据模块中加入存取数据库的组件。
现在在这个数据模块中加入TADOConnection组件并连接到Delphi附带的BCDemos这个数据库, 再放入TADODataSet,注意,这里的CommandText最好为空,即不连接到任何表中。接着放入TDataSetProvider,设定他的DataSet特性值为刚才加入的TADODataSet,再设定它的poAllowCommandText特性值为True,以便让客户端能够使用动态SQL命令来存取数据。最后放入TClientDataSet,设定它的ProviderName特性值为刚才加入的TDataSetProvider。这样做的目的是为了让这个COM+组件能把表中数据以XML的形式传递给客户端。
最后让我们为这个COM+组件输出两个方法QueryMyData和UpdateMyData,可以让客户端调用来查询数据以及更新客户端改动的数据并放回数据表中,这可以用Delphi的TypeLibrary编辑器来完成。点选View|TypeLibrary菜单激活TypeLibrary编辑器,并在IMyCom接口中加入这两个方法。自己设定参数,最后刷新。
在MyCom单元中实现这两个方法。
procedure TMycom.QueryMyData(const data1: WideString;
var data2: WideString);
begin
clientdataset1.Active:=false;
clientdataset1.CommandText:= data1;
clientdataset1.Active:=true;
data2:=widestring(clientdataset1.XMLData);
end;
procedure TMycom.UpdateMyData(const sqlcommand: WideString;var errorcount: Integer);
begin
clientdataset1.Active:=false;
clientdataset1.CommandText:= sqlcommand;
clientdataset1.Active:=true;
errorcount:=clientdataset1.ApplyUpdates(0);
end;
最后在MyCom的OnActivate和OnDeactivate事件中设置TADODataSet的属性,
procedure Tmycom.MtsDataModuleActivate(Sender: TObject);
begin
adodataset1.Active:=true;
end;
procedure Tmycom.MtsDataModuleDeactivate(Sender: TObject);
begin
adodataset1.Active:=false;
end;
现在COM+组件已经完成,现在需要注册它并且导入类库。点击Run|Register ActiveX Server,会弹出注册成功信息,F9运行程序,会在工程的目录下生成一个DLL文件。然后选中Project|Import Type Library会弹出Import Type Library窗体,点击Add按钮,选择刚才生成的DLL文件,在palette page项中添入你想将控件添加到的页中,(如果改也不存在,自动创建)。然后点击Install按钮,在弹出的Install窗体中选择into new package,选择保存路径,会出现包的编辑窗口,如果选择Compile,会在工具页中增加新控件,如果选择Remove,删除_TLB结尾的文件(pas、dcr)会从此包删除控件。
_______________________________________________________________________________________________
________________________________________________________________________________________________
开发服务器端COM模块
-----------------------------------------------------------------------------------------------
新建一工程,点选File|New|Other...菜单,在Multitier页中选择建立Remote DataModule以便在项目中建立COM数据模块,以准备调用数据存取控件中的自定义函数,放上新建立的COM+组件MyCom1
建立COM的函数,方法同上,命为ServerQuery和ServerUpdate,在实现的部分调用数据存取控件中的自定义函数。
procedure Tservercom.serverquery(const data1: WideString;var data2: WideString);
begin
mycom1.QueryMyData(data1,data2);
end;
procedure Tservercom.serverupdata(const sqlcommand: WideString;var errorcount: Integer);
begin
mycom1.UpdateMyData(data1,data2);
end;
最后注册COM服务器,方法同上,但不会生成DLL文件,也不需要导入类库,因为不是控件了。
_______________________________________________________________________________________________
开发客户端应用程序
-----------------------------------------------
新建一工程,添加以下控件
ClientDataSet1:什么都不用设;
DataSource1:DataSet设成ClientDataSet1;
DBGrid1:DataSource设成DataSource1;
Button1,Button2,:Edit1:自己看着设吧;
SocketConnection:Host或Adress设成服务器程序所在的机器,端口号设成服务器端打开的scktsrvr程序中 的端口号(C:/Program Files/Borland/Delphi6/Bin),ServerName选择开发服务器端 COM模块注册的服务器;
在Button1Click事件中添加代码,功能是实现通过文本框的SQL命令远程查询服务器端的数据库:
procedure TForm1.Button1Click(Sender: TObject);
var s:widestring;
begin
socketconnection1.Connected:=true;
socketconnection1.AppServer.ServerQuery(edit1.Text,s);
clientdataset1.Active:=false;
clientdataset1.XMLData:=s;
clientdataset1.Active:=true;
end;
在Button2Click事件中添加代码,功能是提交对服务器端的数据库更改,并显示错误数:
procedure TForm1.Button2Click(Sender: TObject);
var errorcount:integer;
begin
socketconnection1.Connected:=true;
socketconnection1.AppServer.Update(clientdataset1.xmldata,errorcount);
showmessage('错误数:'+inttostr(errorcount));
end;
________________________________________________________________________________________________
运行时,服务器首先打开scktsrvr进行端口监听,此时客户端可以远程访问服务器,如果想进一步加强服务器的函数功能,只需升级COM+组件(改变函数)即可;如果想改变函数的数目或参数需要删除旧版本、重新注册、导入新版本。