三层结构中间件与数据库的连接,难啊,高手请进啊~分数要多少给多少~进来者有分 ( 积分: 200 )

  • 主题发起人 主题发起人 zhouye
  • 开始时间 开始时间
Z

zhouye

Unregistered / Unconfirmed
GUEST, unregistred user!
BS系统,客户端采用的是socketConnection连接,中间层用的adoConnection跟Sqlserver2000数据库连接。不过现在数据库的安全性,要由别人写dll来操作数据库,也就是我的中间件不能直接操作数据库,最后的目的就是发送commandTxt给dll,然后dll返回数据,怎么实现啊,关键就是那个跟dll打交道的问题~~~分数好说,很急~~希望各位高手给出意见,小弟再次先谢过了,分数不是问题,进来者有分~~
 
BS系统,客户端采用的是socketConnection连接,中间层用的adoConnection跟Sqlserver2000数据库连接。不过现在数据库的安全性,要由别人写dll来操作数据库,也就是我的中间件不能直接操作数据库,最后的目的就是发送commandTxt给dll,然后dll返回数据,怎么实现啊,关键就是那个跟dll打交道的问题~~~分数好说,很急~~希望各位高手给出意见,小弟再次先谢过了,分数不是问题,进来者有分~~
 
你说的dll是指什么东西?他负责数据库的操作,你的中间件干吗的?
 
因为我原来做的是三层结构,现在别人不要我们直接连接数据库,说是只能提供dll接口,然后让他们操作数据库和返回数据,我们现在就在想如何实施~,不知道哪里可以插入那个dll借口,或者取代某一部分?
 
更数据库连接的组件用Com+,性能十分优越,稳定型好.
Com+在此提供接口函数以次来操作数据库.
业务外观层可以通过DComConnection连接Com+,管理到事务的更新.
 
以下是动态调用Lindo线性规划dll链接库的范例,请参考!
var
LindoDllHandle :THandle;
ILINDO :Procedure;
Stdcall;
INIT :Procedure;
Stdcall;
LUNOPN :Procedure(Lunit: PLongint;
Lfname: PLongint;
ByValKfname: Pchar;
Inrout: PLongint;
Notfmt: PLongint;
Lutrmi: PLongint;
Lutrmo: PLongint);
Stdcall;
CAPOUT :Procedure(Dunit: PLongint);
Stdcall;
QUIET :Procedure(j: PLongint);
Stdcall;
DEFROW :Procedure(Idir: PLongint;
Rhs: PSingle;
Idrow: PLongint;
Trouble: PLongint);
Stdcall;
APPCOL :Procedure(ByValKname: Pchar;
Nonz: PLongint;
Value: PSingle;
Idrow: PLongint;
Trouble: PLongint);
Stdcall;
GO :Procedure(Limgo: PLongint;
Istat: PLongint);
Stdcall;
REPROW :Procedure(i: PLongint;
Primal: PSingle;
Dual: PSingle);
Stdcall;
REPVAR :Procedure(i: PLongint;
Primal: PSingle;
Dual: PSingle);
Stdcall;
LSEXIT :Procedure;
Stdcall;
MAKINT :Procedure(i: PLongint);
Stdcall;
begin
//动态载入 "
LNDDLL32.DLL "
文件
str := GetCurrentDir;
str := str + '/LNDDLL32.DLL';
LindoDllHandle := loadlibrary(Pchar(str));
if LindoDllHandle<32 then
begin
Application.MessageBox('代码结构载入失败!',PChar('系统提示'),MB_ICONWARNING+MB_OK);
exit;
end;
@ILINDO := GetProcAddress(LindoDllHandle,'ILINDO_STD');
@INIT := GetProcAddress(LindoDllHandle,'INIT_STD');
@LUNOPN := GetProcAddress(LindoDllHandle,'LUNOPNX_STD');
@CAPOUT := GetProcAddress(LindoDllHandle,'CAPOUT_STD');
@QUIET := GetProcAddress(LindoDllHandle,'QUIET_STD');
@DEFROW := GetProcAddress(LindoDllHandle,'DEFROW_STD');
@APPCOL := GetProcAddress(LindoDllHandle,'APPCOLX_STD');
@GO := GetProcAddress(LindoDllHandle,'GO_STD');
@REPROW := GetProcAddress(LindoDllHandle,'REPROW_STD');
@REPVAR := GetProcAddress(LindoDllHandle,'REPVAR_STD');
@LSEXIT := GetProcAddress(LindoDllHandle,'LSEXIT_STD');
@MAKINT := GetProcAddress(LindoDllHandle,'MAKINT_STD');
FreeLibrary(LindoDllHandle);
end;
 
关键是别人说不允许我们连接数据库,只能用那个dll,然后用那个dll对数据库进行操作,估计com+跟我中间层用的adoconnection差不多,还是直接连接数据库的吧~
我对com+几乎不懂~
dll是别人用vc编写的,我们只能调用它的接口,因此不能直接操作数据库,包括用户名、权限什么的都不能给我,要是我们自己写dll,干脆就把adoconnection放到dll里面就行了
 
现在考虑是否可以给dll一个commandText,就是dataset从datasetProvider那里得到的命令,然后让dll进行数据库命令操作,返回的数据保存为一个xml文件,然后我用dataset的loadfromfile读取。
不过这样效率不知道怎样,毕竟xml需要解释。我的程序是1s执行一次,也就是1s进行一个4四五十k的文件读写,不知道能够干的过来
 
既然dll是别人提供的,那你就不用考虑怎么提交命令,怎么取得结果了,这些都是作这个dll的人要考虑的问题了。
你要作的其实就是按照它的方法调用dll的函数就完了,效率主要由dll决定的
 
樓上說得對﹐找提供dll的人﹐要他告訴你如何調用﹗東西是他做的﹐肯定知道怎么用。
 
不是啊,是别人要我们提要求,除了连接数据库和操作数据库由它来完成,其他什么要求都要我们提,接口也得我们提出来。包括怎么获得它返回的数据库数据也要我们来定义接口。
现在大概知道的是他们用.net做的dll,应该也有数据集这个概念的,不过不知道.net里面的recordset跟delphi里面的dataset获取的数据是不是格式差不多的
 
混合语言编程了 不是很懂 听课
 
那我觉得用xml文档返回数据集比较方便了。但是返回的XML文档不一定存成文件,你可以用字符串返回用TXMLDOCUMENT控件载入数据。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部