如何在com对象中传递对象,如TADOTable?(50分)

  • 主题发起人 主题发起人 donkey
  • 开始时间 开始时间
D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说在com对象中我创建了一个TADOTable,在外部有一个TADOConnection,我想把ADOTable
的connection属性设置成外部的TAdoConnection,如何作?
 
外部是怎么意思?
在不同的com对象里。。。。。。。。。。?
 
可以把TAdoConnection的connectionstring属性传进来就行了.
 
在程序间传递Delphi的对象是不行的。
但可以传递ADOTable的_RecordSet对象,
因为ADOtable其实是对COM对象_RecordSet
的封装而已。
 
比如说我的每一个com对象中含有一个ADOTable,但是我希望他们共享一个
ADOConnection,这样就必须把connection传递到com对象里面去,怎么作?
 
你可以把 connection 的连接参数传给 com 中的 table.
 
在COM端直接建立一个文本,记录你的CONNECTION STRING 。
然后直接在读进来设置就好了。
不用传来传去的吧。。
我就是这样子的。。
 
传一个连接字串当然很简单,但是实际效果有很大差别:
如果有三个com对象,照你们说的传递连接字串的话,相当于数据库上有三个连接;
如果仅仅传递ADOConnection的话,才一个连接!特别是对于有连接数限制的数据库,如SQL
server,当对象多的时候,就会导致无法连接.如果是网络的话,同时服务的客户数有很大的
限制!
 
如果仅仅传递ADOConnection的话,才一个连接!
~~~是这样的吗?
 
对!所以要传递对象
 
顺便问一下:
我要这么传行不行?如何传。答对了给100.不够还可以加。
var
CpkData:TCpkData;
ICp:ICpkToDB;
Data,Ret_Message:OleVariant;
begin

with CpkDatado
begin
LINE:='P12';
STATION:='ICT1';
MODEL:='MODELNAME';
CRT:='CRT';
ITEM_NAME:='BU,BU,';
ITEM_VALUE:='1.2,1.3,';
SERIAL_NUM:='0000';
end;
ICp:=CoCpkToDB.CreateRemote('Q');
ICp.WriteToDB(CpkData,Ret_Message);
// 如何传这个TCpkData类型的数据?参数类型为:OLEVARIANT

end;


 
variant类型是不能传递delphi对象的
 
在不同程序间传递对象是不可能的,因为他们根本就不在一个进程空间。如果是一个进程空间的话,
肯定可以的,你就传递指针好了。
 
TO lhzzj:
怎么传呢?能详细点吗?
 
todo
nkey:
http://expert.csdn.net/Expert/topic/1246/1246125.xml?temp=.2468988
看看这个。。
“如果仅仅传递ADOConnection的话,才一个连接!”
好像这么说有点问题。。。
 
不同程序之间我想也可以穿对象,呵呵,但是要涉及到什么列集和散剂,而且我想的话2个程序
最好都是用同一种便宜起开发出来的,否则不能识别对象。但是我认为目前还没有能
实现传递对象,如果是COM对象到是可能,因为COM就是用代理和存根对象来实现跨进程
通讯
 
我看了,支持的是我的结论呀,而且ADOConection控件的目的正在于此.不知老兄说的是哪
一句有问题?
 
传递一个对象(如ADOTable)可不是一个好主意,你知道把这个对象传递到远端后它能干什
么吗?比如说你的A机上的一个ADOTable已经打开了一个表,这时想把这个ADOTable传递到
B机上(呕,我说到DCOM上去了,但这样考虑也许更有扩展性一点),但B机上并没有ADOTable
的实例,它该怎么办呢?太复杂了……我们最终需要的实际上不是跨进程(或跨计算机)操纵
另一个对象,而是要获取某个对象所能提供的数据。我们考虑这个修改一下结构好吗,将传递
ADO数据集对象变为传递该数据集所获得的数据,方法定义(MIDL)为:
HRESULT _stdcall GetMyData([in] BSTR KeyValue, [out] VARIANT * ReturnData, [out, retval] long * Result );
客户端通过把KeyValue传给服务器,服务器处理后将数据写到ReturnData里,这样事情就
变得清楚、简单多了。这样的好处是我们的接口不用考虑该采用哪种数据引擎,服务器和客
户在业务逻辑方面也就不会纠缠不清了。
 
COM+中有数据库接池缓冲功能
A对象对ADOConnection连接断了,
B对象新建的ADOConnection,数据库接缓冲池中取一个连接就是了,实际还是用的一个连接,
传递对象本来就不是合理的设计方案
如果这样你可以设计一个C对象,A和B共用C对象,
看看COM的书对你有帮助.
 
Sachow兄说的有道理,我就是这样干的,用delphi写com对象供调用.
问题在于,returndata怎么定义,是使用variant array吗?
 
后退
顶部