如何在COM中返回数据集?

echowoods 2005-01-12 04:50:18

我在COM中建了一个ADO查询,COM方法中如何返回一个记录集?

我定义了函数返回 类型为OleVariant,
把数据集赋给Result。
即 result:=adoquery.recordset.

这样做是否可以!

客户端如何调用这个数据集?
...全文
154 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiirii 2005-01-13
  • 打赏
  • 举报
回复
另外的:
Create OleVariant from a Dataset


procedure CreateVarArrayFromDataset(var varResultSet: OleVariant;
ADataset : TDataset);
var
m : Integer;
nRecords, nColumns, nCurRec : Integer;
begin
nRecords := -1;
nColumns := -1;

try
{ Create the array... }
{ Set size to 0..m-1 where m equals the number of columns. }
nColumns := Max(0, ADataset.FieldCount-1);

{ Each item is an array of size (0..n) where n equals the }
{ number of records.}
{ Entry 0 is where we store the column name. }

nRecords := Max(0, ADataset.RecordCount);

varResultSet := VarArrayCreate([0, nColumns, 0, nRecords],
varVariant);

for m := 0 to nColumns do
varResultSet[m, 0] := ADataset.Fields[m].DisplayLabel;

{ Populate from result set. }
ADataset.First;
nCurRec := 1; { Current record number. }
while not ADataset.Eof do begin
{ Put in field values. }
for m := 0 to nColumns do
varResultSet[m, nCurRec] := ADataset.Fields[m].Value;

ADataset.Next;
Inc(nCurRec);
end;
except
on E: Exception do
raise Exception.Create('CreateVarArrayFromDataset() - ' +
IntToStr(nRecords) +
' rec,'+IntToStr(nColumns)
+'cols,'+E.Message);
end;
end;
aiirii 2005-01-13
  • 打赏
  • 举报
回复
Delphi提供了RemoteDataModule向导来帮你产生COM程序的结构.
由于Delphi的程序具有传送DataSet的特殊机制,所以Delphi也实现了一个接口叫做IProvider(即TDataSetProvider),来帮助应用程序服务器上的COM程序发送DataSet数据.
(3)前台程序与NT服务器上的COM程序是通过DCOM的机制互相沟通
前台的应用程序是通过MIDAS.DLL和应用程序服务器相互沟通,前台的MIDAS.DLL会把接收到的应用程序服务器发过来的数据包再还原成DataSet,丢给前台程序中的TClientDataSet组件.
注:前台程序必须提供相应的TClientData组件来和应用程序服务器上的每个IProvider(即TDataSetProvider)对应.用户修改前台数据时,修改的只是Cache(缓存)在前台的Dataset,最后

要通过TClientData.ApplyUpdate方法来把前台变动的数据写回到后台数据库中.
sunkevin 2005-01-13
  • 打赏
  • 举报
回复
在COM中最好用ClientDataSet控件,函数的result := ClientDataSet1.data;
由其它的ClientDataSet控件接收此函数的返回值
ClientDataSet2.data := result;
wozhuchuanwei 2005-01-13
  • 打赏
  • 举报
回复
function TYxCy_SupplySystemMain.SelectTable(
const TableName: WideString): OleVariant;
begin
try
with AQ_SelectTable do
begin
Close;
SQL.Text:='SELECT * FROM '+TableName;
Open;
Result:=DSP_SelectTable.Data;
end;
AQ_SelectTable.Close;
SetComplete;
except
SetAbort;
end;
end;

这样就可以返回表格了!
前台用CDS接受就可以了!
echowoods 2005-01-13
  • 打赏
  • 举报
回复
up
halfdream 2005-01-13
  • 打赏
  • 举报
回复
aiirii的话不错,不过有个地方要修正一下。。
IProvider是DELPHI4时候MIDAS所使用来传数据集包的,保留它一定程度是为了兼容性,
从DELPHI5开始,改用了IAppserver,数据集不再使用单独的接口,增加了效率(可见李维《D5分布式多层 基础篇)

另外,远程调用参数可以直接传ADO的recordset接口,这种传递方式是当没法使用MIDAS时候可以用的方式。

echowoods 2005-01-13
  • 打赏
  • 举报
回复

问题己解决,谢谢各位,结贴
wozhuchuanwei 2005-01-13
  • 打赏
  • 举报
回复
中间层:
ADOConnection->ADOQuery->DataSetProvider
过程:
function TYxCy_SupplySystemMain.SelectTable(
const TableName: WideString): OleVariant;
begin
try
with AQ_SelectTable do
begin
Close;
SQL.Text:='SELECT * FROM '+TableName;
Open;
Result:=DSP_SelectTable.Data;
end;
AQ_SelectTable.Close;
SetComplete;
except
SetAbort;
end;
end;

客户端:
DCOMConnection->ClientDataSet->DataSource
vision2000 2005-01-12
  • 打赏
  • 举报
回复
dddddd

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧