在Delphi中实现PostgreSQL多连接切换的对应代码写法
将嵌入式SQL实现多PostgreSQL连接的C代码转换为Delphi代码
原C语言代码(功能:多PostgreSQL数据库连接、切换与查询,已翻译为中文注释)
#include <stdio.h> EXEC SQL BEGIN DECLARE SECTION; char dbname[1024]; EXEC SQL END DECLARE SECTION; int main() { // 连接到testdb1,命名为con1,使用testuser用户 EXEC SQL CONNECT TO testdb1 AS con1 USER testuser; // 设置搜索路径为空 EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; // 连接到testdb2,命名为con2,使用testuser用户 EXEC SQL CONNECT TO testdb2 AS con2 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; // 连接到testdb3,命名为con3,使用testuser用户 EXEC SQL CONNECT TO testdb3 AS con3 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; // 该查询会在最后打开的数据库testdb3中执行 EXEC SQL SELECT current_database() INTO :dbname; printf("当前数据库=%s(应为testdb3)\n", dbname); // 使用AT指定在con2(testdb2)中执行查询 EXEC SQL AT con2 SELECT current_database() INTO :dbname; printf("当前数据库=%s(应为testdb2)\n", dbname); // 将当前连接切换到con1(testdb1) EXEC SQL SET CONNECTION con1; EXEC SQL SELECT current_database() INTO :dbname; printf("当前数据库=%s(应为testdb1)\n", dbname); // 断开所有连接 EXEC SQL DISCONNECT ALL; return 0; }
对应的Delphi实现代码
Delphi中无原生嵌入式SQL语法,通常使用官方FireDAC组件库管理多数据库连接,以下是功能完全匹配的实现:
program MultiPGConnections; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, 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.Phys.PG, FireDAC.Phys.PGDef, FireDAC.VCLUI.Wait, FireDAC.Comp.Client; var FDConnection1, FDConnection2, FDConnection3: TFDConnection; FDQuery: TFDQuery; dbname: string; begin try // 初始化三个连接对象,对应原代码的con1、con2、con3 FDConnection1 := TFDConnection.Create(nil); FDConnection2 := TFDConnection.Create(nil); FDConnection3 := TFDConnection.Create(nil); FDQuery := TFDQuery.Create(nil); try // 配置并连接testdb1(对应con1) FDConnection1.DriverName := 'PG'; FDConnection1.Params.Database := 'testdb1'; FDConnection1.Params.UserName := 'testuser'; // 按需补充连接参数:密码、服务器地址、端口 // FDConnection1.Params.Password := 'your_password'; // FDConnection1.Params.Server := 'localhost'; // FDConnection1.Params.Port := '5432'; FDConnection1.Connected := True; // 设置搜索路径为空并提交 FDQuery.Connection := FDConnection1; FDQuery.SQL.Text := 'SELECT pg_catalog.set_config(''search_path'', '''', false)'; FDQuery.ExecSQL; FDConnection1.Commit; // 配置并连接testdb2(对应con2) FDConnection2.DriverName := 'PG'; FDConnection2.Params.Database := 'testdb2'; FDConnection2.Params.UserName := 'testuser'; // 按需补充连接参数 FDConnection2.Connected := True; FDQuery.Connection := FDConnection2; FDQuery.SQL.Text := 'SELECT pg_catalog.set_config(''search_path'', '''', false)'; FDQuery.ExecSQL; FDConnection2.Commit; // 配置并连接testdb3(对应con3) FDConnection3.DriverName := 'PG'; FDConnection3.Params.Database := 'testdb3'; FDConnection3.Params.UserName := 'testuser'; // 按需补充连接参数 FDConnection3.Connected := True; FDQuery.Connection := FDConnection3; FDQuery.SQL.Text := 'SELECT pg_catalog.set_config(''search_path'', '''', false)'; FDQuery.ExecSQL; FDConnection3.Commit; // 在最后连接的testdb3中查询当前数据库 FDQuery.SQL.Text := 'SELECT current_database()'; FDQuery.Open; dbname := FDQuery.Fields[0].AsString; FDQuery.Close; Writeln(Format('当前数据库=%s(应为testdb3)', [dbname])); // 指定在testdb2(FDConnection2)中查询当前数据库 FDQuery.Connection := FDConnection2; FDQuery.SQL.Text := 'SELECT current_database()'; FDQuery.Open; dbname := FDQuery.Fields[0].AsString; FDQuery.Close; Writeln(Format('当前数据库=%s(应为testdb2)', [dbname])); // 切换到testdb1(FDConnection1)查询当前数据库 FDQuery.Connection := FDConnection1; FDQuery.SQL.Text := 'SELECT current_database()'; FDQuery.Open; dbname := FDQuery.Fields[0].AsString; FDQuery.Close; Writeln(Format('当前数据库=%s(应为testdb1)', [dbname])); finally // 断开所有连接并释放资源 FDQuery.Free; FDConnection3.Free; FDConnection2.Free; FDConnection1.Free; end; except on E: Exception do Writeln('错误: ', E.Message); end; Readln; end.
关键说明
- 每个
TFDConnection对象对应原C代码中的一个命名连接(con1/con2/con3),独立管理数据库连接。 - 通过切换
TFDQuery的Connection属性,实现原C代码中SET CONNECTION或AT指定连接执行查询的逻辑。 - 需确保项目已引入FireDAC组件,且PostgreSQL客户端驱动
libpq.dll位于程序运行路径或系统路径中。
内容的提问来源于stack exchange,提问作者Lamia Mniena
相关产品推荐
相关产品推荐

