<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      秋·風

        博客園 :: 首頁 :: 博問 :: 閃存 :: 新隨筆 :: 聯(lián)系 :: 訂閱 訂閱 :: 管理 ::

      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.

       

       

      posted on 2024-06-03 11:51  秋·風  閱讀(836)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 亚洲av片在线免费观看| 国产偷窥厕所一区二区| 一区二区三区午夜无码视频| 小污女小欲女导航| 日本一区二区三区免费播放视频站| 国产精品日韩深夜福利久久| 国产精品无码v在线观看| 国产一区二区三区不卡视频| 博爱县| 亚洲熟女乱色综一区二区| 久久国产精品-国产精品| 狠狠综合久久av一区二| 亚洲午夜成人精品电影在线观看| 亚洲一区二区三区在线激情| 双乳奶水饱满少妇呻吟免费看| 日本黄页网站免费观看| 宜川县| 日韩中文字幕有码午夜美女| 久99久热免费视频播放| 日本免费精品| 国产成人8X人网站视频| 中文字幕自拍偷拍福利视频| 国产短视频一区二区三区| 亚洲av激情久久精品人| 经典国产乱子伦精品视频| 熟女精品国产一区二区三区| 国产99视频精品免费视频36| 欧美另类videossexo高潮| 精品一区二区中文字幕| 國產尤物AV尤物在線觀看| 激情97综合亚洲色婷婷五| 亚洲久悠悠色悠在线播放| 日本三级香港三级人妇99| 国产精品午夜福利在线观看| 狠狠精品久久久无码中文字幕| 国产精品久久久久7777| 少妇人妻挤奶水中文视频毛片| 亚洲精品国产中文字幕| 精品国产女同疯狂摩擦2| 国产精品久久久久鬼色| 清纯唯美经典一区二区|