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

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

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

      使用FireDAC的TFDManager和TFDConnection組件實現(xiàn)運行時動態(tài)數(shù)據(jù)庫連接

      以下是一個通用的數(shù)據(jù)庫連接方案,使用FireDAC的TFDManagerTFDConnection組件實現(xiàn)運行時動態(tài)數(shù)據(jù)庫連接。支持多種數(shù)據(jù)庫類型,采用面向?qū)ο蠓庋b:

       

      unit DatabaseManager;
      
      
      interface
      
      
      uses
        System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
        FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
        FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Comp.Client,
        FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB,
        FireDAC.Comp.DataSet;
      
      
      type
        TDatabaseType = (dtSQLite, dtMySQL, dtPostgreSQL, dtMSSQL, dtOracle);
      
      
        TDatabaseManager = class
        private
          FConnection: TFDConnection;
          FManager: TFDManager;
          FDatabaseType: TDatabaseType;
          FLastError: string;
          procedure ValidateDriver;
          function GetConnectionDefName: string;
          function GetDriverName: string;
          function BuildParams(Params: TStrings): string;
        public
          constructor Create;
          destructor Destroy; override;
          procedure ConfigureConnection(DatabaseType: TDatabaseType; Params: TStrings);
          function Connect: Boolean;
          procedure Disconnect;
          function ExecSQL(const SQL: string; Params: TArray<TVarRec>): Integer;
          function OpenQuery(const SQL: string; Params: TArray<TVarRec>): TFDQuery;
          property LastError: string read FLastError;
        end;
      
      
      implementation
      
      
      { TDatabaseManager }
      
      
      constructor TDatabaseManager.Create;
      begin
        FManager := TFDManager.Create(nil);
        FConnection := TFDConnection.Create(nil);
        FManager.SilentMode := True;
        FManager.Active := True;
      end;
      
      
      destructor TDatabaseManager.Destroy;
      begin
        Disconnect;
        FConnection.Free;
        FManager.Free;
        inherited;
      end;
      
      
      procedure TDatabaseManager.ConfigureConnection(DatabaseType: TDatabaseType; Params: TStrings);
      begin
        FDatabaseType := DatabaseType;
        FManager.ConnectionDefs.Clear;
      
      
        // 添加新的連接定義
        FManager.AddConnectionDef(
          GetConnectionDefName,
          GetDriverName,
          BuildParams(Params)
        );
      end;
      
      
      function TDatabaseManager.Connect: Boolean;
      begin
        Result := False;
        try
          ValidateDriver;
          FConnection.ConnectionDefName := GetConnectionDefName;
          FConnection.Connected := True;
          Result := True;
          FLastError := '';
        except
          on E: Exception do
            FLastError := '連接失敗: ' + E.Message;
        end;
      end;
      
      
      procedure TDatabaseManager.Disconnect;
      begin
        if FConnection.Connected then
          FConnection.Connected := False;
      end;
      
      
      function TDatabaseManager.ExecSQL(const SQL: string; Params: TArray<TVarRec>): Integer;
      var
        Query: TFDQuery;
      begin
        Result := -1;
        Query := TFDQuery.Create(nil);
        try
          Query.Connection := FConnection;
          Query.SQL.Text := SQL;
          if Length(Params) > 0 then
            Query.MacroByName('params').Value := Params;
          Query.ExecSQL;
          Result := Query.RowsAffected;
        finally
          Query.Free;
        end;
      end;
      
      
      function TDatabaseManager.OpenQuery(const SQL: string; Params: TArray<TVarRec>): TFDQuery;
      begin
        Result := TFDQuery.Create(nil);
        try
          Result.Connection := FConnection;
          Result.SQL.Text := SQL;
          if Length(Params) > 0 then
            Result.MacroByName('params').Value := Params;
          Result.Open;
        except
          Result.Free;
          raise;
        end;
      end;
      
      
      // 私有方法實現(xiàn)
      procedure TDatabaseManager.ValidateDriver;
      begin
        case FDatabaseType of
          dtSQLite: FDPhysSQLiteDriverLink.Create(nil);
          dtMySQL: FDPhysMySQLDriverLink.Create(nil);
          dtPostgreSQL: FDPhysPgDriverLink.Create(nil);
          dtMSSQL: FDPhysMSSQLDriverLink.Create(nil);
          dtOracle: FDPhysOracleDriverLink.Create(nil);
        end;
      end;
      
      
      function TDatabaseManager.GetConnectionDefName: string;
      begin
        Result := Format('%s_Connection', [GetEnumName(TypeInfo(TDatabaseType), Ord(FDatabaseType))]);
      end;
      
      
      function TDatabaseManager.GetDriverName: string;
      begin
        case FDatabaseType of
          dtSQLite: Result := 'SQLite';
          dtMySQL: Result := 'MySQL';
          dtPostgreSQL: Result := 'PG';
          dtMSSQL: Result := 'MSSQL';
          dtOracle: Result := 'Ora';
        else
          raise Exception.Create('不支持的數(shù)據(jù)庫類型');
        end;
      end;
      
      
      function TDatabaseManager.BuildParams(Params: TStrings): string;
      var
        I: Integer;
      begin
        Result := '';
        for I := 0 to Params.Count - 1 do
          Result := Result + Format('%s=%s;', [Params.Names[I], Params.ValueFromIndex[I]]);
      end;
      
      
      end.

       

      使用示例:

       

      // 創(chuàng)建數(shù)據(jù)庫管理器
      var
        DB: TDatabaseManager;
        Params: TStringList;
        Query: TFDQuery;
      begin
        DB := TDatabaseManager.Create;
        try
          // 配置SQLite連接
          Params := TStringList.Create;
          try
            Params.Values['Database'] := 'C:\Data\mydb.sqlite';
            Params.Values['OpenMode'] := 'CreateUTF8';
            DB.ConfigureConnection(dtSQLite, Params);
          finally
            Params.Free;
          end;
      
      
          if DB.Connect then
          begin
            // 執(zhí)行SQL命令
            DB.ExecSQL('CREATE TABLE IF NOT EXISTS Users (ID INTEGER PRIMARY KEY, Name TEXT)');
      
      
            // 執(zhí)行查詢
            Query := DB.OpenQuery('SELECT * FROM Users');
            try
              while not Query.Eof do
              begin
                ShowMessage(Query.FieldByName('Name').AsString);
                Query.Next;
              end;
            finally
              Query.Free;
            end;
          end
          else
            ShowMessage(DB.LastError);
        finally
          DB.Free;
        end;
      end;

       

      功能特點:

       

      1. 多數(shù)據(jù)庫支持
        • 支持SQLite、MySQL、PostgreSQL、SQL Server和Oracle
        • 通過TDatabaseType枚舉輕松擴展新數(shù)據(jù)庫類型
      2. 動態(tài)配置
      3.  
      4. 安全連接管理
        • 自動驗證數(shù)據(jù)庫驅(qū)動
        • 內(nèi)置錯誤處理機制
        • 連接資源自動釋放
      5. 靈活的參數(shù)化查詢
      6.  
      7. 事務支持(可擴展):
      8.  

       

      配置參數(shù)說明:

       

      數(shù)據(jù)庫類型

      必需參數(shù)

      示例值

      SQLite

      Database, OpenMode

      Database=C:\data\test.sdb

      MySQL

      Server, Database, User_Name, Password

      Server=192.168.1.100;Port=3306

      PostgreSQL

      Server, Database, User_Name, Password

      Port=5432

      MSSQL

      Server, Database, User_Name, Password

      OSAuthent=Yes

      Oracle

      Server, User_Name, Password

      ServiceName=ORCL

       

      最佳實踐建議:

       

      1. 連接池配置
      2.  
      3. 性能優(yōu)化
      4.  
      5. 安全增強
      6.  
      7. 日志記錄
      8.  
      9. 多線程支持
      10.  

       

      該方案通過面向?qū)ο笤O計實現(xiàn)了以下優(yōu)勢:

      1. 高內(nèi)聚低耦合:數(shù)據(jù)庫操作邏輯與業(yè)務邏輯分離

      2. 可擴展性:新增數(shù)據(jù)庫類型只需擴展枚舉和驅(qū)動驗證

      3. 類型安全:強類型參數(shù)減少運行時錯誤

      4. 資源管理:自動釋放連接和查詢對象

      5. 統(tǒng)一接口:所有數(shù)據(jù)庫操作使用相同的方法簽名

       

      可根據(jù)具體需求擴展以下功能:

       

      • 連接狀態(tài)監(jiān)控
      • 執(zhí)行計劃分析
      • 批量數(shù)據(jù)操作
      • 數(shù)據(jù)庫元數(shù)據(jù)查詢
      • 異步操作支持
      • 連接故障轉(zhuǎn)移機制
      posted @ 2025-11-05 17:04  麥麥提敏  閱讀(8)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 18禁美女裸体爆乳无遮挡| 丰满人妻AV无码一区二区三区| 天堂网在线观看| 爱性久久久久久久久| 国产视频一区二区三区四区视频| 中国熟妇毛多多裸交视频| 亚洲精品男男一区二区| 日韩av一区二区三区不卡| 日本高清aⅴ毛片免费| 果冻传媒董小宛视频| 麻豆精品传媒一二三区| 中国熟女仑乱hd| 国产高清无遮挡内容丰富| 亚洲国产美女精品久久久| 人人妻人人澡人人爽人人精品av | 亚洲第一区二区快射影院| 日韩AV高清在线看片| 精品人妻午夜福利一区二区| 成人网站免费观看永久视频下载 | 华人在线亚洲欧美精品| 国产女人被狂躁到高潮小说| 国产va免费精品观看精品| 97中文字幕在线观看| 国产精品福利自产拍久久 | 国产日产亚洲系列av| 兴国县| 国产精品国产精品偷麻豆| 久久精品国产免费观看频道| 神马久久亚洲一区 二区| 国产成人精品无码一区二区| 综合欧美视频一区二区三区| 91午夜福利一区二区三区| 成人无码一区二区三区网站| 亚洲欧美日本久久网站| 18禁国产一区二区三区| √天堂资源网最新版在线| 午夜精品极品粉嫩国产尤物| 公天天吃我奶躁我的在线观看| 务川| 欧美日本激情| 人成午夜免费大片|