You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:10:08