怎么把 TADOConnection 传入com中(100分)

  • 主题发起人 smart_jun
  • 开始时间
S

smart_jun

Unregistered / Unconfirmed
GUEST, unregistred user!
现在的项目中有许多com形式的dll文件。原来每个dll文件都有一个 TADOConnection。这样做太浪费数据库资源了。现在想把所有dll文件中的 TADOConnection 提出来,共用一个TADOConnection ,但现在不知道怎么把对象传入com中 请大侠不吝赐教。
 
连接的管理是"数据服务层"的事,所有中间层对象都是通过"数据服务层"提供的连接取得数据的.你原来的每个dll文件都有连接当然不对.
 
改为bpl可以共享连接
 
就是再做一个数据库连接池com组件啊解决楼主的问题.
 
我对“com形式的dll文件”没有什么概念,我说点肤浅看法,别笑话我啊:
1、TADOConnection 是 Delphi 的一个类,将类作为参数传入 dll 中是件比较费力的事情。
2、如果用 ADO 接口代替 TADOConnection(Import ActiveX),实际上还是要生成一个类——TConnection。
3、我想用原生 ADO 接口是不是会好些。例如,原本在 dll 中的一些功能函数可以声明成如下的样子:
procedure GetData(Connection: Variant);
var
rst: OleVariant;
begin
rst := CreateOleObject('ADODB.Recordset');
rst.Open(sql, Connection, adOpenStatic, adLockOptimistic, adCmdText);
...
rst := Unassigned;
end;
4、而你所谓的那个“共用的TADOConnection”,可以在调用 dll 的主程序中生成,然后作为参数传递给各个 dll。
var
cnn: OleVariant;
procedure CreateConnection;
begin
cnn := CreateOleObject('ADODB.Connection');
cnn.CursorLocation := adUseServer;
cnn.IsolationLevel := adXactCursorStability;
cnn.Mode := adModeReadWrite;
cnn.Provider := 'SQLOLEDB.1';
if cnn.State <> adStateClosed then
cnn.Close;
cnn.ConnectionString :=
'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=' +
db + ';Data Source=' + srv + ';Connect Timeout=10;' +
'Use Procedure for Prepare=1';
cnn.Open(cnn.ConnectionString, uid, pwd, adConnectUnspecified);
end;
或者,更简单点,直接使用 ADOConnection.ConnectionObject,这样可以照常使用 Delphi 的 ADOConnection 组件,只是向 dll 传递参数时用 ADOConnection.ConnectionObject 而不是直接传递 TADOConnection 类。
5、说的不对别笑话我啊,我对 Com 一无所知。
 
楼主的做法是。。反实践的
有点经验的人都不会去这么设计。只有李伟那个写书的为了码字才提出”多个模块共用一个连接“
统一 TADOConnection 的初始化字符串就够了
 
“统一 TADOConnection 的初始化字符串就够了”
是会创建多个数据库连接
 
回楼上
可以卖硬件赚一笔,卖数据库服务器软件再赚一笔
统一 TADOConnection 的初始化字符串连接到操作系统管理的odbc数据源,在操作系统中配置管理连接池,就很好。每个模块退出的时候关闭连接就可以了。一次只使一个模块处于激活状态。。。。
自己写垃圾代码管理数据库连接,谁那么大牛啊?delphi的midas 的pooler例子有谁在用啊?
 
楼主的做法是。。反实践的
有点经验的人都不会去这么设计。只有李伟那个写书的为了码字才提出”多个模块共用一个连接“
统一 TADOConnection 的初始化字符串就够了
///////////////////////////////////
我用过啊,delphi下面有一个例子啊,好像在demos/SharedConn中
 
pooler例子是经典,不能用是个人水平问题.
 
实际项目直接套用pooler例子会死的很惨
有activex/com+经典吗?
小公司就是小公司。中间件的成功依靠的是规模,用的人多,bug就发现早,进步快,成功机会大。
孙yy老大说过borland是数据库杀手,poradox/interbase/bde/midas........在borland之手都半死不活的
多个连接问题。。。数据库采用版本控制机制可以达到很好的“并发连接”,只要使用好合适的事务隔离度,小项目firebird/mysql足够了,摆不平的话换用mssql/oracle也是百搭(除非忽悠客户);
 
Pooler示例用的是DCOM,直接使用当然效率不高。
 通过研究Pooler示例,理解Pooling原理,理解Pooling架构。然后通过使用COM+技术实现出来,效果就完全不一样了。
 要学会举一反三,搞懂它的原理,那么你就会游刃有余了。
 
DLL在处理共享时非常不灵活,Lz应该把ADOC这种持久性的的类的连接写死在各个公支DLL里。
 

Similar threads

顶部