lazarus/fpc自帶的bufDataSet和MemDataSet缺少類似TClientDataSet的Delta功能,這個單元從TDataSet擴展了Delta,可以直接生成增刪改的SQL,適用于所有TDataSet。
2024-10-25 高勇高老板增強了GetActionSQL功能:
function GetActionSQL(const ATableName : String; const AKeyFields: String = ''): String; overload; function GetActionSQL(const DataBaseType:string;aTablename: string; AKeyFields: string; aAutoIncFieldname: string = ''; aNotE
2024-08-17
增加blob類型轉(zhuǎn)base64,不過服務器需將base64轉(zhuǎn)為blob保存。
2024-07-04
合并ccc(QQ1650680975)增加的delphi 12.0版(unidac)
2024-06-09:
修正可能QFDataSetMonitor1.Active:=true放在表打開前設置時數(shù)據(jù)監(jiān)控可能會失效的Bug;
2024-06-07:
將TDataSetChangesMonitor封裝為控件,安裝DatasetMonitorPack.lpk就可以


使用方法:
procedure TForm1.FormCreate(Sender: TObject); begin BufDataset2.FieldDefs.Clear; BufDataset2.FieldDefs.Add('vstr1', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftString')), 30); BufDataset2.FieldDefs.Add('vint1', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftinteger'))); BufDataset2.FieldDefs.Add('vint2', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftinteger'))); BufDataset2.CreateDataset; memo1.Lines.Clear; BufDataset2.Open; dcm2:=TQFDataSetMonitor.Create(self); dcm2.DataSet:=BufDataset2; //監(jiān)控BufDataset2的數(shù)據(jù)變化 dcm2.ActivateMonitoring; {$ifdef linux} SQLiteLibraryName:=ExtractFilePath(Application.ExeName)+'libsqlite3.so'; {$else} SQLiteLibraryName:=utf8tocp936(ExtractFilePath(Application.ExeName)+'sqlite3.dll'); {$endif} ZConnection1.Disconnect; ZConnection1.Protocol:='sqlite'; ZConnection1.LibraryLocation:=utf8tocp936(ExtractFilePath(Application.ExeName)+{$ifdef linux}'libsqlite3.so'{$else}'sqlite3.dll'{$endif}); ZConnection1.Properties.Clear; ZConnection1.Properties.Add('encrypted=yes'); ZConnection1.Properties.Add('cipher=sqlcipher'); ZConnection1.Properties.Add('sqlcipher=legacy'); ZConnection1.Properties.Add('legacy=1'); ZConnection1.Properties.Add('controls_cp=CP_UTF8'); ZConnection1.Properties.Add('AutoEncodeStrings=True'); ZConnection1.Database:='demo.db3'; ZConnection1.Password:='123asd'; ZConnection1.Connect; ZQuery1.Close; ZQuery1.SQL.Text:='select * from hardware'; ZQuery1.Open; QFDataSetMonitor1.Active:=true;//激活監(jiān)控功能 end;
2024-06-06:
第1版采用helper class方式,發(fā)現(xiàn)受限太多,不適合多DataSet使用,今天改標準的class方法,使用方法也相應有調(diào)整。
使用方法:
1、在unit的uses添加DataSetDelta
2、ActivateMonitoring(true)//true--啟動Delta功能 false--停止Delta
3、GetActionSQL(const ATableName: String; const AKeyFields: String = '');//根據(jù)Delta生成SQL
注意:
使用GetActionSQL后會清空Delta的記錄。
BufDataset使用Delta的方法:
dcm1:TDataSetChangesMonitor;
dcm2:TDataSetChangesMonitor;
dcm1:=TDataSetChangesMonitor.Create(self);
dcm2:=TDataSetChangesMonitor.Create(self);
dcm1.DataSet:=BufDataset1; //監(jiān)控BufDataset1的數(shù)據(jù)變化
dcm2.DataSet:=BufDataset2; //監(jiān)控BufDataset2的數(shù)據(jù)變化
dcm1.ActivateMonitoring(true);
dcm2.ActivateMonitoring;
sql:=dcm1.GetActionSQL('test');//讀取Delta生成的SQL
sql:=dcm2.GetActionSQL('demo');
繼續(xù)開源:
https://github.com/szlbz/DataSetDelta.git
{*******************************************************} { } { 為lazarus TDataSet增加類似TClientDataSet的Delta功能 } { 適用于所有TDataSet } { } { } { Copyright(c) 2024-2024 } { 秋風(QQ315795176)原創(chuàng)出品 } { } { All rights reserved } { 保留所有權利 } { } {*******************************************************} unit DataSetDelta; {$mode objfpc}{$H+} interface uses Classes, SysUtils, BufDataset, DB, TypInfo, Variants; type TDataStateValue = (dsvOriginal, dsvDeleted, dsvInserted, dsvUpdated); TDataStateValues=set of TDataStateValue; TDataSetChangesMonitor =class(TComponent) private FDataState:TDataStateValue; Foldvalue:array of Variant; FBeforeEdit: TDataSetNotifyEvent; FBeforeDelete: TDataSetNotifyEvent; FBeforeInsert: TDataSetNotifyEvent; FAfterPost: TDataSetNotifyEvent; FNewDataSet:TBufDataSet; FOldDataSet:TBufDataSet; FDataSet:TDataSet; procedure CreateMonitorDataSet; procedure SetDataSet(AValue: TDataSet); procedure BeforeInserts(DataSet: TDataSet); procedure BeforeEdits(DataSet: TDataSet); procedure BeforeDeletes(DataSet:TDataSet); procedure AfterPosts(DataSet: TDataSet); function GetChangedCount:int64; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function GetActionSQL(const ATableName : String; const AKeyFields: String = ''): String; procedure ActivateMonitoring(AValue:Boolean =true); property ChangedCount:int64 read GetChangedCount; property DataSet:TDataSet read FDataSet write SetDataSet; end; implementation
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, BufDataset, DB, Forms, Controls, Graphics, Dialogs, DBGrids, StdCtrls, Memds,TypInfo,Variants,DataSetDelta,lazutf8; type { TForm1 } TForm1 = class(TForm) BufDataset1: TBufDataset; BufDataset2: TBufDataset; Button2: TButton; Button3: TButton; DataSource1: TDataSource; DataSource2: TDataSource; DBGrid1: TDBGrid; DBGrid2: TDBGrid; Memo1: TMemo; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private public dcm1:TDataSetChangesMonitor; dcm2:TDataSetChangesMonitor; end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button2Click(Sender: TObject); var sql:string; begin if BufDataset1.State in [dsEdit, dsInsert] then BufDataset1.Post; sql:=dcm1.GetActionSQL('test'); if sql<>'' then memo1.Lines.Add(sql); end; procedure TForm1.Button3Click(Sender: TObject); var sql:string; begin if BufDataset2.State in [dsEdit, dsInsert] then BufDataset2.Post; sql:=dcm2.GetActionSQL('demo'); if sql<>'' then memo1.Lines.Add(sql); end; procedure TForm1.FormCreate(Sender: TObject); begin BufDataset1.FieldDefs.Clear; BufDataset1.FieldDefs.Add('test1', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftString')), 30); BufDataset1.FieldDefs.Add('test2', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftinteger'))); BufDataset1.CreateDataset; BufDataset2.FieldDefs.Clear; BufDataset2.FieldDefs.Add('test11', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftString')), 30); BufDataset2.FieldDefs.Add('test12', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftinteger'))); BufDataset2.FieldDefs.Add('test13', TFieldType(GetEnumValue(TypeInfo(TFieldType), 'ftinteger'))); BufDataset2.CreateDataset; memo1.Lines.Clear; BufDataset2.Open; BufDataset1.Open; dcm1:=TDataSetChangesMonitor.Create(self); dcm2:=TDataSetChangesMonitor.Create(self); dcm1.DataSet:=BufDataset1; //監(jiān)控BufDataset1的數(shù)據(jù)變化 dcm2.DataSet:=BufDataset2; //監(jiān)控BufDataset2的數(shù)據(jù)變化 dcm1.ActivateMonitoring(true); dcm2.ActivateMonitoring; end; end.



浙公網(wǎng)安備 33010602011771號