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;
或把服务器设为状态服务器
要实现无状态取得下一个包可以使用下面的代码
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
就這幾個組件裡面還存在什麼玄機?屬性都是一樣的設置,測試工程能用、正式工程有異常。
所以我想問題可能是客戶端的問題,或者是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;
或把服务器设为状态服务器
要实现无状态取得下一个包可以使用下面的代码
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
就這幾個組件裡面還存在什麼玄機?屬性都是一樣的設置,測試工程能用、正式工程有異常。
所以我想問題可能是客戶端的問題,或者是AppServer與Client之間搭配的問題。
其中,
AppServer 無非就是:
一個 TAdoConnection,
兩個 TAdoDataSet(主從表),
一個 TDataSource 主從表的橋梁,
一個 TDataSetProvider
Client就是:
一個 TDcomConnection,
兩個 TMyClientDataSet(主從表)(注意:TMy...,考濾到以後的靈性,做了個組件直接繼承TClientDataSet,其屬性、方法、事件都沒改),
兩個 TDataSource
就這幾個組件裡面還存在什麼玄機?屬性都是一樣的設置,測試工程能用、正式工程有異常。
#4
測試工程比較簡單,窗體沒用到繼承,正式工程從TForm到最後窗體繼承了 五六次。TMyClientDataSet是放在最後那個窗體,也就是說沒在窗體中繼承。