关于MTS和ADO的问题讨论。(200分)

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

DSM2000

Unregistered / Unconfirmed
GUEST, unregistred user!
在用MTS和ADO开发多层应用时遇到问题:
1.当用方法返回一个结果集(_RecordSet)时,类型表中没有_RecordSet类型,
应用Microsoft ActiveX Data Object Recordset 2.1 Library后可用
_Recordset *类型,在其后再加*(_Recordset **)可用作返回参数,但
编译不能通过,在XXX_TLB文件的uses中加入ADOint则编译能通过,返回
的结果集也有效,但每次改变接口时,XXX_TLB文件的uses都会自动构造,
必须手动增加ADOint。不知我的做法正确吗? 有没有别的方法可在接口
函数中返回ADO结果集(_RecordSet)。
2.在用MTS做多层应用开发时,系统构架如下:在服务端有一堆实体对象,分别
代表一个实体(基本上是数据表的体现);服务端还有一些控制对象,对实
对象进行协调控制,数据从实体对象取得,经控制对象处理后,通过接口
返回到客户端,做法是通过Data(OleVariant)传递数据,客户端用
ClientDataset接收数据,但问题是往往从实体对象得到的数据不能直接
作为客户端的显示,但在控制对象中又不能合成Data属性,有人有这方面的
经验吗?请指教。
 
最近也在烦这个东西,关注
 
1._recordset是一个接口,你说的返回ADO结果集是真的返回了ado结果集,还是返回的指向ado结果集的接口,也就是说真正的结果集数据是在server还是client?
2.用data(olevariant)返回数据,在客户端是会有问题,midas好像是在返回前把数据封装成datapack(我推测可能是一个记录数组),在客户端再进行解包,然后生成记录集以在数据感知控件里显示。
 
apartment:
1.我是这样做的,在服务端建立MTSDataModal,用TADOConnection连接数据库,
通过接口方法返回结果集,其返回值是_RecordSet型的。客户端用CoMyClass的
CreateRemote(ServerName) 取得接口,把返回的结果集赋值到ADODataSet的
RecordSet属性,然后ADODataSet连接到DataSetProvider,DataSetProvider
连接到ClientDataSet,ClientDataSet然后用DBGrid显示,按我上面提到的
方法是能得到结果集的,看上去传送的应该是结果集本身,但我在接口方法中
把Connection关闭掉后,运行会出现堆栈错误,从这现象看,传送的又象是指针。
这把我弄得很迷糊,请指点。
2.我个人觉得,midas虽然是可以开发多层应用,不过它还是没有脱离传统得结构化
编程,想在midas中应用OOP好象比较困难。另外,能否自己构造Data属性。您知道
Data属性得结构吗?
 
1.我认为返回的是接口指针,不过你可以通过这个接口指针去取得数据。
2.我认为midas是borland只是一种基于COM/DCOM的技术,它提供一系列功能以帮助
开发者开发三层结构应用,当然,你完全可以不用midas去实现三层应用,不过你要取
得MIDAS那样的效率和稳定性,可能要花一番功夫。
以上只是个人观点,希望各位高手参加讨论!
 
“从实体对象得到的数据不能直接作为客户端的显示”是为什么?你直接使用
data来传递不就完了吗?你可以将你的数据传递的代码贴来看看!
 
zc:
不好意思,我说得不是很清楚。
“从实体对象得到的数据不能直接作为客户端的显示”,并不是指技术上不能
显示,而是指逻辑上行不同。因为从实体对象得到的数据基本上是单张表的数据集,
而现实情况中,现实于客户端的数据是多表查询的结果,这种结果不能用从多个实体
对象得到的数据合成。若用一复杂SQL语句生成data属性,理论上是可以得到任何
的结果集,但这跟面向对象好象又有点矛盾,因为实体对象根本没起到作用。我的
困惑就在如何用delphi的控件开发真正的多层应用。
 
继续关注...
请教DSM2000,按第一种方法真的可以获得RecordSet接口吗?EXE本地服务器好像还可以
对付一下,但DLL服务器好像还是不行。
对于第二个问题,我采用AppendData首先加入一个数据集,对于第二个数据集中的字段一律
将FieldKind设为fkInternalCalc,然后再逐条加入。方法比较笨一些,那位有更好的办法?
 
langer:
第一种方法是可以得到_RecordSet接口的,不过要在XXX_TLB文件里引用ADOIni。
把数据集修改后,FieldKind设为fkInternalCalc的字段会在Delta属性中出现吗?
我试过fkCalculated类型的,但字段不在Delta中出现。
 
DSM2000:
1、将ADOInt更名后覆盖导入的ADO_TLB文件好像更好一些,你的方法我原来也试过,但
两种方法在跨进程时都回出现错误甚至死机。
2、使用fkInternalCalc真的不可以吗?我没在COM条件下试验,如果真是这样的话我的
包装类就不用继续写下去了!谢谢你的提醒,回头一定试一下!
 
继续关注...
对于第二个问题,我找到了一个名为xQuery的构件可以解决,可惜忘了在哪儿下载的了。
xQuery主要针对多个打开的数据集进行查询,而不是到后台数据库查询,由于完全是在
内存中操作所以速度很快,但不支持直接更新。
 
1.传送的是Recordset的Interface.
2.Recordset的cursor type = adUseClient.
3.在把Connection关闭前执行Recordset的AddRef方法.
 
附加功能 将问题提前
 
DSM2000:
手动在uses里增加ADOint有点牵强,正确的作法应该是:
1.打开菜单View->Type Library
2.选中Library Name,也就是左边树的根节点
3.选中右边User页签
4.鼠标右键,选中Show All Type Libraries
5.找到并选中相应的ADO Library,如Microsoft ActiveX Data Objects Recordset 2.6 Library
6.鼠标右键,选回Show Selected
现在就可以光明正大的用Recordset接口了!!!!!!
你的接口甚至可以从Recordset接口继承,就像继承IAppserver一样,更不用说在方法的参数里用到Recordset类型了!!!
如果真用这样的方式来继承接口,那它是没有"实现"的,因为接口只是接口,
可以看到Delphi生成了这个接口的许多空函数,
不过你可以通过"包容"的方式来模拟组件继承。
这个方法有的时候非常管用,特别是在做Event Object时……
 
DSM2000:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部