日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ADOQuery代替ClientDataSet做3-Tier系统

發布時間:2025/3/14 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADOQuery代替ClientDataSet做3-Tier系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ADOQuery代替ClientDataSet做3-Tier系統
2005-09-06 13:41:00
3-Tier的系統我們一般用Midas的TClientDataSet,它搭配BDE的TQuery效率還可以,畢竟是一家的;但搭配TADOQuery就慢了很多,大概9倍,因為不曉得人家的資料存儲格式,只能一個Field一個Field讀出來再用TDataSetProvider打包成Data:OLEVariant;
ADO2.5提供了一個_Stream組件,配合BatchUpdate,可以做到TClientDataSet的功能,它的效率可以達到與TClientDataSet+TQuery一樣:
1.Client給SQL到Server,Server用TADOQuery獲取資料,然后Save到_Stream,返回;
2.Client用_Stream接收Server返回資料,給TADOQuery,用戶可以隨意增/刪/改;
3.Client把用戶修改后的資料Save到_Stream,傳給Server(我現在還沒辦法只把異動資料存到_Stream,它把沒有修改的資料也Save進去了,因為在WAN上跑時資料量對效率影響大;一種方法是存為XML格式,再用XML?DOM組件去解析,把沒修改的資料刪掉,看各位還有更好的方法沒有?);
4.Server用_Stream接收Client的修改資料,給TADOQuery,把FilterGroup設為fgPendingRecords,可以分析資料的增/刪/改情況,處理企業邏輯,最后調用UpdateBatch保存資料。
5.Client在Call?Server保存成功后,也調用UpdateBatch,使資料與實際一致,因為TADOQuery沒有聯接Connection,因此UpdateBatch相當于TClientDataSet的ClearChangeLog?
Server端的代碼(Com+):
?
function?TEOStudent.ReadADOData(const?ASQL:?WideString):?OLEVariant;
var
??AStream:_Stream;
??MS1:TMemoryStream;
??V:OLEVariant;
??P:Pointer;
begin
??try
????ADOConnection.Close;
????ADOQuery.Close;
????ADOQuery.SQL.Text:=ASQL;
????ADOQuery.Open;
????AStream:=CoStream.Create;
????OLEVariant(ADOQuery.Recordset).Save(AStream,adPersistADTG);
????ADOQuery.Close;
????AStream.Position:=0;
????V:=AStream.Read(AStream.Size);
????MS1:=TMemoryStream.Create;
????try
??????P:=VarArrayLock(V);
??????try
????????MS1.Size:=VarArrayHighBound(V,1)+1;
????????Move(P^,MS1.Memory^,MS1.Size);
??????finally
????????VarArrayUnLock(V);
??????end;
??????Result:=VarArrayCreate([0,MS1.Size-1],varByte);
??????P:=VarArrayLock(Result);
??????try
????????Move(MS1.Memory^,P^,MS1.Size);
??????finally
????????VarArrayUnLock(Result);
??????end;
????finally
??????MS1.Free;
????end;
????SetComplete;
??except
????SetAbort;
????Raise;
??end;
end;
?
procedure?TEOStudent.SaveADOData(AData:?OLEVariant);
var
??AStream:_Stream;
??AR:_Recordset;
begin
??try
????ADOQuery.Close;
????AStream:=CoStream.Create;
????AStream.Open(EmptyParam,adModeUnknown,adOpenStreamUnspecified,?‘‘,?‘‘);
????AStream.Type_:=adTypeBinary;
????AStream.Write(AData);
????AStream.Position:=0;
????AR:=_Recordset(CoRecordset.Create);
????AStream.Position:=0;
????AR.Open(AStream,EmptyParam,adOpenKeyset,adLockBatchOptimistic,0);
????ADOConnection.Close;
????ADOConnection.Open;
????AR.Set_ActiveConnection(ADOConnection.ConnectionObject);
????ADOQuery.Recordset:=ADOInt._Recordset(AR);
{????ADOQuery.FilterGroup:=fgPendingRecords;
????ADOQuery.Filtered:=true;
????try
??????ADOQuery.First;
??????while?not?ADOQuery.Eof?do
??????begin
????????case?ADOQuery.UpdateStatus?of
??????????usModified:ShowMessage(
??VarToStr(ADOQuery.FieldByName(‘SeqNo‘).OldValue)+‘:‘+
??ADOQuery.FieldByName(‘SeqNo‘).asString);
????????end;
????????ADOQuery.Next;
??????end;
????finally
??????ADOQuery.Filtered:=false;?//stateless
????end;}
????ADOQuery.UpdateBatch;
????ADOConnection.Close;
????SetComplete;
??except
????SetAbort;
????Raise;
??end;
end;

Client端,Form上放一個TADOQuery,不用連接Connection:
?
獲取資料
procedure?TForm1.Button5Click(Sender:?TObject);
var
??V:OLEVariant;
??AR:_Recordset;
??AStream:_Stream;
??MS1:TMemoryStream;
??P:Pointer;
??s:string;
begin
??DCOM.Connected:=true;
??try
????s:=‘‘;
????V:=DCOM.AppServer.ReadADOData(‘select?*?from?FORMDD‘);
????MS1:=TMemoryStream.Create;
????try
??????MS1.Size:=VarArrayHighBound(V,1)+1;
??????P:=VarArrayLock(V);
??????try
????????Move(P^,MS1.Memory^,MS1.Size);
??????finally
????????VarArrayUnLock(V);
??????end;
??????V:=VarArrayCreate([0,MS1.Size-1],varByte);
??????P:=VarArrayLock(V);
??????try
????????Move(MS1.Memory^,P^,MS1.Size);
??????finally
????????VarArrayUnLock(V);
??????end;
????finally
??????MS1.Free;
????end;
????AStream:=CoStream.Create;
????AStream.Open(EmptyParam,adModeUnknown,adOpenStreamUnspecified,?‘‘,?‘‘);
????AStream.Type_:=adTypeBinary;
????AStream.Write(V);
?
????AR:=_Recordset(CoRecordset.Create);
????AStream.Position:=0;
????AR.Open(AStream,EmptyParam,adOpenUnspecified,?adLockUnspecified,?-1);
????ADOQuery1.Recordset:=ADOInt._Recordset(AR);
??finally
????DCOM.Connected:=false;
??end;
end;
?
//保存資料
procedure?TForm1.Button6Click(Sender:?TObject);
var
??AStream:_Stream;
??V:OLEVariant;
begin
??DCOM.Connected:=true;
??try
????ADOQuery1.CheckBrowseMode;
????AStream:=CoStream.Create;
????OLEVariant(ADOQuery1.Recordset).Save(AStream,adPersistADTG);
????AStream.Position:=0;
????V:=AStream.Read(AStream.Size);
????DCOM.AppServer.SaveADOData(V);
????ADOQuery1.UpdateBatch;??//no?connection,means?clearchangelog
??finally
????DCOM.Connected:=false;
??end;
end;
?

轉載于:https://www.cnblogs.com/fuyingke/archive/2005/10/14/254669.html

總結

以上是生活随笔為你收集整理的ADOQuery代替ClientDataSet做3-Tier系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。