在多线程中打开clientdataset时如何传参数? ( 积分: 200 )

  • 主题发起人 主题发起人 bobiy
  • 开始时间 开始时间
B

bobiy

Unregistered / Unconfirmed
GUEST, unregistred user!
我参照
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1468856
的例子写了一个测试程序,没有参数的时候可以.但传参数确不知该怎么写了.
我的代码:
Params:=vararrayof([3,'2005-03-02']);
FNewData:=AppServer.AS_GetRecords (ClientDataSet2.ProviderName,-1,RecsOut,MetaDataOption,'select * from jh where jhid=:jhid and rq=:rq',Params,OwnerData);
不用多线程的时候,可以取到数据,但在多线程中就取不到数据了,我想应该是
Params:=vararrayof([3,'2005-03-02']);这句有问题.
请各位帮忙解决!
谢谢
 
我参照
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1468856
的例子写了一个测试程序,没有参数的时候可以.但传参数确不知该怎么写了.
我的代码:
Params:=vararrayof([3,'2005-03-02']);
FNewData:=AppServer.AS_GetRecords (ClientDataSet2.ProviderName,-1,RecsOut,MetaDataOption,'select * from jh where jhid=:jhid and rq=:rq',Params,OwnerData);
不用多线程的时候,可以取到数据,但在多线程中就取不到数据了,我想应该是
Params:=vararrayof([3,'2005-03-02']);这句有问题.
请各位帮忙解决!
谢谢
 
每人知道吗?还是我的问题太肤浅??
 
建议你把数据放在VARIANT类型的变量里,
传过去后再处理
我每次都是那么传的,应该可以
 
TOpenThread = class(TThread)
private
FCDS: TClientDataSet;
FDCOMC:TDCOMConnection;
Fjhid,Frq:String
protected
procedure Execute;
override;
procedure UpdateCDS;
public
constructor Create(jhid,rq:String);
end;

constructor TOpenThread.Create(Create(jhid,rq:String);
begin
FreeOnTerminate := True;
Fjhid:=jhid;
Frq:=rq;
inherited Create(False);
end;

procedure TOpenThread.Execute;
begin
OleCheck(CoInitialize(nil));
try
FDCOMC:=TDCOMConnection.Create(nil);
FDCOMC.ComputerName:='127.0.0.1';
FDCOMC.ServerGUID:='{xxxx}';
FDCOMC.ServerName:='xxx';
FCDS:=TClientDataSet.Create(nil);
FCDS.CommandText:='select * from jh where jhid=:jhid and rq=:rq';
FCDS.ProviderName:='dsp1';
FCDS.RemoteServer:=FDCOMC;
FCDS.Params[0].DataType:=ftString;
FCDS.Params[0].ParamType:=ptInput;
FCDS.Params[0].Value:=Fjhid;
FCDS.Params[1].DataType:=ftDateTime;
FCDS.Params[1].ParamType:=ptInput;
FCDS.Params[1].Value:=StrToDateTime(Frq);
FDCOMC.Open;
FCDS.Open;
Synchronize(UpdateCDS);
finally
FCDS.Close;
FDCOMC.Close;
FreeAndNil(FCDS);
FreeAndNil(FDCOMC);
CoUninitialize;
end;
end;

procedure TOpenThread.UpdateCDS;
begin
Form1.CDS1.Data:=FCDS.Data;
end;

用这个线程吧,可以得到数据。还真不知道你是错在哪,不知道原因。还有如果不是特殊情况,最好不要Marshal接口,因为你之所以要用线程就是想多个线程之间不受影响的工作,如果你又Marshal接口的话就是多个线程共用一个连接那你采用多线程又有什么意思呢,所以最好是每个线程都有自己的连接这样才能有效率的获取数据,我想这也是你使用多线程的初衷吧。我以前写过一个多线程操作一个数据表的程序,那样确实提高了很多速度
 
问题解决了,谢谢KillAll2004
 
后退
顶部