移動clientdataset時出現Variant or safe array is locked |
缺席
|
huangbh57
一般會員 發表:28 回覆:21 積分:9 註冊:2004-10-11 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
huangbh57
一般會員 發表:28 回覆:21 積分:9 註冊:2004-10-11 發送簡訊給我 |
我設計的一個一個表單為dll文件,按書上所說TClientdataset的packetrecord不為-1(已設為10),且fetchondemand為false(已設為false)時為無狀態對象,當我的TDataSetProvider的poArrowcommandtext為true時,打開兩個dll文件,且記錄多于10個時就會出錯:adoquery:Cannot perform this operation on an open dataset'
於是我改用下面方法:
procedure TFm.clientdataset1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
var
LastValue: OleVariant;
KeyFields:string;
begin
KeyFields:='po1;po2';
if masterdataset.Active then
begin
CDSClone.CloneCursor(masterdataset, True);
CDSClone.Last;
LastValue := VarArrayOf([CDSClone.fieldbyname('po1').AsString,CDSClone.fieldbyname('po2').AsString]);
CDSClone.Close;
end else
LastValue := NULL;
OwnerData := VarArrayOf([sql語句,KeyFields,LastValue]);
end;
在TDataSetProvider:
procedure TSpring.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
try
adoQuery.Close;
adoQuery.SQL.Text := OwnerData[0];
if not VarIsNull(OwnerData[2]) and not VarIsEmpty(OwnerData[2]) then
begin
adoQuery.Open;
if not MasterQuery.Locate(OwnerData[1],OwnerData[2], []) then
exit;
adoQuery.Next;
end;
finally
OwnerData := NULL;
end;
end;
同時打開兩個dll表單,當執行clientdataset1.GetNextPacket時,就出現:variant or safe array is locked,三層結構不知怎麼寫才能服務於多客戶,且取數時是一批一批的取到客戶端,而且能打開多個表單,實在是急!!!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |