如何在COM中返回数据集?

echowoods 2005-01-12 04:50:18

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

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

这样做是否可以!

客户端如何调用这个数据集?
...全文
153 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
YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。利用YOLOv4训练完自己的数据集后,如何向大众展示并提供落地的服务呢?  本课程将提供相应的解决方案,具体讲述使用Web应用程序框架Flask进行YOLOv4的Web应用部署。用户可通过客户端浏览器上传图片,经服务器处理后返回图片检测数据并在浏览器绘制检测结果。  本课程的YOLOv4使用AlexyAB/darknet,在Ubuntu系统上做项目演示,并提供在Windows系统上的部署方式文档。 本项目采取前后端分离的系统架构和开发方式,减少前后端的耦合。课程包括:YOLOv4的Flask部署系统架构、YOLOv4的安装及动态链接库的编译、 Flask的安装、YOLOv4的检测API接口python代码、 Flask的服务程序的python代码、前端html代码、CSS代码、Javascript代码、系统部署演示、生产环境部署建议、Windows系统上部署的区别等。 除本课程外,本人推出了有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《YOLOv4目标检测实战:训练自己的数据集》(Ubuntu版) 《YOLOv4目标检测实战:人脸口罩佩戴识别》(Ubuntu版) 《YOLOv4目标检测实战:国交通标志识别》(Ubuntu版) 《YOLOv4目标检测:原理与源码解析》(Ubuntu版) 《YOLOv4-tiny目标检测实战:训练自己的数据集》(Ubuntu版) 《Windows版YOLOv4目标检测实战:训练自己的数据集》 《Windows版YOLOv4目标检测实战:人脸口罩佩戴识别》 《Windows版YOLOv4目标检测实战:国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》 《Windows版YOLOv4-tiny目标检测实战:训练自己的数据集

5,389

社区成员

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

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