当前位置: 首页 > news >正文

使用FireDAC的TFDManager和TFDConnection组件实现运行时动态数据库连接

以下是一个通用的数据库连接方案,使用FireDAC的TFDManagerTFDConnection组件实现运行时动态数据库连接。支持多种数据库类型,采用面向对象封装:

 

unit DatabaseManager;interfaceusesSystem.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;typeTDatabaseType = (dtSQLite, dtMySQL, dtPostgreSQL, dtMSSQL, dtOracle);TDatabaseManager = classprivateFConnection: TFDConnection;FManager: TFDManager;FDatabaseType: TDatabaseType;FLastError: string;procedure ValidateDriver;function GetConnectionDefName: string;function GetDriverName: string;function BuildParams(Params: TStrings): string;publicconstructor 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;
beginFManager := TFDManager.Create(nil);FConnection := TFDConnection.Create(nil);FManager.SilentMode := True;FManager.Active := True;
end;destructor TDatabaseManager.Destroy;
beginDisconnect;FConnection.Free;FManager.Free;inherited;
end;procedure TDatabaseManager.ConfigureConnection(DatabaseType: TDatabaseType; Params: TStrings);
beginFDatabaseType := DatabaseType;FManager.ConnectionDefs.Clear;// 添加新的连接定义FManager.AddConnectionDef(GetConnectionDefName,GetDriverName,BuildParams(Params));
end;function TDatabaseManager.Connect: Boolean;
beginResult := False;tryValidateDriver;FConnection.ConnectionDefName := GetConnectionDefName;FConnection.Connected := True;Result := True;FLastError := '';excepton E: Exception doFLastError := '连接失败: ' + E.Message;end;
end;procedure TDatabaseManager.Disconnect;
beginif FConnection.Connected thenFConnection.Connected := False;
end;function TDatabaseManager.ExecSQL(const SQL: string; Params: TArray<TVarRec>): Integer;
varQuery: TFDQuery;
beginResult := -1;Query := TFDQuery.Create(nil);tryQuery.Connection := FConnection;Query.SQL.Text := SQL;if Length(Params) > 0 thenQuery.MacroByName('params').Value := Params;Query.ExecSQL;Result := Query.RowsAffected;finallyQuery.Free;end;
end;function TDatabaseManager.OpenQuery(const SQL: string; Params: TArray<TVarRec>): TFDQuery;
beginResult := TFDQuery.Create(nil);tryResult.Connection := FConnection;Result.SQL.Text := SQL;if Length(Params) > 0 thenResult.MacroByName('params').Value := Params;Result.Open;exceptResult.Free;raise;end;
end;// 私有方法实现
procedure TDatabaseManager.ValidateDriver;
begincase FDatabaseType ofdtSQLite: 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;
beginResult := Format('%s_Connection', [GetEnumName(TypeInfo(TDatabaseType), Ord(FDatabaseType))]);
end;function TDatabaseManager.GetDriverName: string;
begincase FDatabaseType ofdtSQLite: Result := 'SQLite';dtMySQL: Result := 'MySQL';dtPostgreSQL: Result := 'PG';dtMSSQL: Result := 'MSSQL';dtOracle: Result := 'Ora';elseraise Exception.Create('不支持的数据库类型');end;
end;function TDatabaseManager.BuildParams(Params: TStrings): string;
varI: Integer;
beginResult := '';for I := 0 to Params.Count - 1 doResult := Result + Format('%s=%s;', [Params.Names[I], Params.ValueFromIndex[I]]);
end;end.

 

使用示例:

 

// 创建数据库管理器
varDB: TDatabaseManager;Params: TStringList;Query: TFDQuery;
beginDB := TDatabaseManager.Create;try// 配置SQLite连接Params := TStringList.Create;tryParams.Values['Database'] := 'C:\Data\mydb.sqlite';Params.Values['OpenMode'] := 'CreateUTF8';DB.ConfigureConnection(dtSQLite, Params);finallyParams.Free;end;if DB.Connect thenbegin// 执行SQL命令DB.ExecSQL('CREATE TABLE IF NOT EXISTS Users (ID INTEGER PRIMARY KEY, Name TEXT)');// 执行查询Query := DB.OpenQuery('SELECT * FROM Users');trywhile not Query.Eof dobeginShowMessage(Query.FieldByName('Name').AsString);Query.Next;end;finallyQuery.Free;end;endelseShowMessage(DB.LastError);finallyDB.Free;end;
end;

 

功能特点:

 

  1. 多数据库支持
    • 支持SQLite、MySQL、PostgreSQL、SQL Server和Oracle
    • 通过TDatabaseType枚举轻松扩展新数据库类型
  2. 动态配置
  3.  
  4. 安全连接管理
    • 自动验证数据库驱动
    • 内置错误处理机制
    • 连接资源自动释放
  5. 灵活的参数化查询
  6.  
  7. 事务支持(可扩展):
  8.  

 

配置参数说明:

 

数据库类型

必需参数

示例值

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. 性能优化
  4.  
  5. 安全增强
  6.  
  7. 日志记录
  8.  
  9. 多线程支持
  10.  

 

该方案通过面向对象设计实现了以下优势:

1. 高内聚低耦合:数据库操作逻辑与业务逻辑分离

2. 可扩展性:新增数据库类型只需扩展枚举和驱动验证

3. 类型安全:强类型参数减少运行时错误

4. 资源管理:自动释放连接和查询对象

5. 统一接口:所有数据库操作使用相同的方法签名

 

可根据具体需求扩展以下功能:

 

  • 连接状态监控
  • 执行计划分析
  • 批量数据操作
  • 数据库元数据查询
  • 异步操作支持
  • 连接故障转移机制
http://www.jsqmd.com/news/32408/

相关文章:

  • laas paas saas 架构说明
  • Delphi RESTful API
  • TFDMemTable 是断开性数据集
  • 2025年河南公共走廊全钢防火隔断公司权威推荐榜单:商场全钢防火隔断/公共走廊防火隔断/公共走廊防火隔墙源头厂家精选
  • 2025年板式换热机组制造厂权威推荐榜单:容积式换热机组/热力机组/换热机组源头厂家精选
  • 十四.JavaScript 简介及导入方式
  • 2025 年 11 月音乐喷泉工程,景区互动音乐喷泉,彩色灯光音乐喷泉厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 11.5 NOIP 模拟赛 T1. 荣耀
  • 智能体自动化 ui 测试
  • Windows开机自动播放视频设置
  • 2025 年 11 月倍捻机,直捻机,大卷装倍捻机厂家最新推荐,实力品牌深度解析采购无忧之选!
  • 皮试
  • 使用rsync及inotify实现两台Linux设备间的文件夹同步
  • 教育部等七部门关于加强中小学科技教育的意见-解读
  • 2025年酒柜定制厂排名:酒柜定制选择哪家好?
  • 2025 年 11 月智能倍捻机,节能倍捻机,高速大卷装倍捻机厂家最新推荐,实力品牌深度解析采购无忧之选!
  • AT_arc188_d [ARC188D] Mirror and Order
  • 西门子实物图64 dq a0 B0排查
  • QwQ 32B VS DeepSeek R1
  • 2025 年最新反应釜生产厂家/推荐榜单:聚焦专业服务、市场口碑与权威测评的优质企业甄选指南搅拌/树脂/高速/远红外反应釜公司推荐
  • 2025 年最新冷凝器源头厂家推荐排行榜:聚焦定制化服务,助力企业精准选品不锈钢冷凝器/壳管式冷凝器/管壳式冷凝器公司推荐
  • 2025 年塑胶厂家最新推荐榜单:防水充电桩塑胶注塑及医疗塑胶制品优质厂商权威测评结果医疗塑胶结构件/医用塑胶配件/医用塑胶外壳公司推荐
  • 2025年汽车润滑油高性价比品牌推荐,上海德之星润滑油有限公司
  • 2025 年北戴河海鲜餐厅推荐权威榜单,聚焦专业采购与精湛厨艺的优质之选北戴河海鲜,北戴河特色美食店推荐
  • 2025 年 11 月氟碳喷涂精致钢厂家推荐排行榜,门窗精致钢,幕墙精致钢,装饰精致钢,定制精致钢公司推荐
  • 软件测试:边界值分析法详解
  • 2025 年 11 月社区养老院,老年痴呆养老院,自理老人住养老院最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • Branching Heuristic Combining in SAT
  • 2025 年 11 月山西养老院,太原养老院,敬老院,日间照料养老院最新推荐,产能、专利、环保三维数据透视!
  • HTML、CSS 和 JavaScript 基础知识笔记