clientdataset.GetNextPacket 得到的是重復包

时间:2022-07-27 00:38:57
異常:
http://wufanglu.diy.myrice.com/tmp/Q02.gif


如圖所示,參數為:
FetchOnDemand=False
PacketRecords=5

啟動時顯示的是5條記錄,這是正常的,
但點擊按鈕執行 GetNextPacket 後得到的是重復的記錄,而不是後面的五條。

用了這麼久,還是頭一次“見鬼”,在客戶端建了n個test,結果都是正常的,說明AppServer那邊沒問題。

環境:Delphi7+MSSQL, 三層,AppServer中的是 AdoDataSet。

4 个解决方案

#1


因为你的服务器是无状态的
要实现无状态取得下一个包可以使用下面的代码
procedure TPooledRDM.DataSetProvider1BeforeGetRecords(Sender: TObject;
  var OwnerData: OleVariant);
begin
  try
    Query1.Close;
    Query1.SQL.Text := OwnerData[0];
    if not VarIsNull(OwnerData[1]) and not VarIsEmpty(OwnerData[1]) then
    begin
      Query1.Open;
      if not Query1.Locate(Query1.Fields[0].FieldName, OwnerData[1], []) then
        raise Exception.Create('Record not found');
      Query1.Next;
    end;
  finally
    OwnerData := NULL;
  end;
end;

或把服务器设为状态服务器

#2


先謝了,
再問,怎麼設為狀態服務器?

#3


如果說我那是服務器的問題,但我試了用測試的程序可以正常的操作。
所以我想問題可能是客戶端的問題,或者是AppServer與Client之間搭配的問題。

其中,
AppServer 無非就是:
一個 TAdoConnection, 
兩個 TAdoDataSet(主從表),
一個 TDataSource 主從表的橋梁,
一個 TDataSetProvider
Client就是:
一個 TDcomConnection,
兩個 TMyClientDataSet(主從表)(注意:TMy...,考濾到以後的靈性,做了個組件直接繼承TClientDataSet,其屬性、方法、事件都沒改), 
兩個 TDataSource

就這幾個組件裡面還存在什麼玄機?屬性都是一樣的設置,測試工程能用、正式工程有異常。

#4


測試工程比較簡單,窗體沒用到繼承,正式工程從TForm到最後窗體繼承了 五六次。TMyClientDataSet是放在最後那個窗體,也就是說沒在窗體中繼承。

#1


因为你的服务器是无状态的
要实现无状态取得下一个包可以使用下面的代码
procedure TPooledRDM.DataSetProvider1BeforeGetRecords(Sender: TObject;
  var OwnerData: OleVariant);
begin
  try
    Query1.Close;
    Query1.SQL.Text := OwnerData[0];
    if not VarIsNull(OwnerData[1]) and not VarIsEmpty(OwnerData[1]) then
    begin
      Query1.Open;
      if not Query1.Locate(Query1.Fields[0].FieldName, OwnerData[1], []) then
        raise Exception.Create('Record not found');
      Query1.Next;
    end;
  finally
    OwnerData := NULL;
  end;
end;

或把服务器设为状态服务器

#2


先謝了,
再問,怎麼設為狀態服務器?

#3


如果說我那是服務器的問題,但我試了用測試的程序可以正常的操作。
所以我想問題可能是客戶端的問題,或者是AppServer與Client之間搭配的問題。

其中,
AppServer 無非就是:
一個 TAdoConnection, 
兩個 TAdoDataSet(主從表),
一個 TDataSource 主從表的橋梁,
一個 TDataSetProvider
Client就是:
一個 TDcomConnection,
兩個 TMyClientDataSet(主從表)(注意:TMy...,考濾到以後的靈性,做了個組件直接繼承TClientDataSet,其屬性、方法、事件都沒改), 
兩個 TDataSource

就這幾個組件裡面還存在什麼玄機?屬性都是一樣的設置,測試工程能用、正式工程有異常。

#4


測試工程比較簡單,窗體沒用到繼承,正式工程從TForm到最後窗體繼承了 五六次。TMyClientDataSet是放在最後那個窗體,也就是說沒在窗體中繼承。