三层应用,
服务器:有一个方法
procedure Tlisten.sql(var sql: OleVariant; out record_: OleVariant);
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sql);
adoquery1.Open;
record_:=adoquery1.Recordset;
except on exception do begin sql:='error on server' end
end;
end;
客户端
var sql,re:olevariant;
sql:=edit3.Text;
socketconnection1.AppServer.sql(sql,re);
adodataset1.Recordset:=Iunknown(re) as _Recordset;为什么运行总说oleaut32.dll访问内存错误????
用clientdataset.commandtext就没有问题,
调用不返回数据集合的服务器方法也正常.
用单独程序直接连数据库,使用上述语句也可以
在ASP下调用返回数据集的方法也行!!!
为什么啊????救救我吧.......................
服务器:有一个方法
procedure Tlisten.sql(var sql: OleVariant; out record_: OleVariant);
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sql);
adoquery1.Open;
record_:=adoquery1.Recordset;
except on exception do begin sql:='error on server' end
end;
end;
客户端
var sql,re:olevariant;
sql:=edit3.Text;
socketconnection1.AppServer.sql(sql,re);
adodataset1.Recordset:=Iunknown(re) as _Recordset;为什么运行总说oleaut32.dll访问内存错误????
用clientdataset.commandtext就没有问题,
调用不返回数据集合的服务器方法也正常.
用单独程序直接连数据库,使用上述语句也可以
在ASP下调用返回数据集的方法也行!!!
为什么啊????救救我吧.......................
test.sql(sql,re);
要么直接返回一个OleVariant形的数组?
我觉得出错的关键是把OleVariant转换成结口后出的错。
function Tlisten.sql(var sql: OleVariant);OleVariant
...
Result:=adoquery1.Recordset;
...
ClientDataSet1.Data:=ClientDataSet1.DataRequest;
然后,写与ClientDataSet1相关连的TDataSetProvider控件的OnDataRequest事件中代码:
function TMoLongData.DataSetProvider1DataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
With ADOQuery1 do
begin
Close;
SQL.Add('Select * From TableName');
Open;
end;
Result:=DataSetProvider1.Data;
end;
虽然你没有正面回答我的问题,但是你的方法给了我解决这个问题的提示!!!
真的很感谢你!!!
有空用MSN多联系呀[email protected]
真的要吐血了?ado的RECORDSET是OLEVARIANT,
但不能返回到客户的CLIENTDATSET呀,都没有瞧清原型,
反正都是OLEVARIANT,就去RESULT,那有这样的事呀.
简直就是张冠李戴了,真的要吐血了.
Procedure CopyData(sourceDa:TDataset;destDa:Tclientdataset);
var i:integer;
begin
if not SourceDa.active Then exit;
if not createda(sourceda,Destda) then exit;
sourceDa.First;
while not sourceDa.eof do begin
DestDa.Append;
for i:=0 to SourceDa.fieldcount-1 do begin
Destda.fields[i].value:=sourceDa.fields[i].value;
end;
DestDa.post;
sourceDa.next;
end;
end;Function getdata(sqlstr:string):olevariant;
begin
adoq1.close;
adoq1.sql.text:=sqlstr;
adoq1.open;
copydata(adoq1,clientdatasettmp);//clientdatasettmp是一个临时用的clientdataset控件
result:=clientdataset1.data;
end;client直接CLIENTDATASET.data:=getdata即OK;