
Delphi 圈子这些年聊到数据库连接PostgreSQL 出现的频率是越来越高了。我最早接触它是因为一个老项目要从 SQL Server 迁到开源方案当时第一反应就是上 ODBC结果被驱动兼容性折腾到没脾气。后来痛定思痛把 FireDAC 和 uniDAC 两条路都完整走了一遍才算真正把 Delphi PostgreSQL 这套组合玩明白。这篇东西不绕弯子直接讲怎么用 FireDAC 和 uniDAC 把 PostgreSQL 连得又快又稳包括驱动配置、连接参数、常见报错排查以及我在生产环境里踩过的那些坑。它的内容适合刚准备上手 PG 的 Delphi 开发者也适合已经在用但偶尔被连接问题卡住的同行。1. 为什么一定要用专用组件需求与选型分析1.1 为什么是 PostgreSQL它到底强在哪先聊聊 PostgreSQL 本身。很多人纠结它和 MySQL 怎么选我个人的判断是如果你的业务涉及复杂查询、地理信息、JSON 文档处理或者未来有数据分析需求PostgreSQL 是更好的底子。它的窗口函数、CTE公用表表达式、行级安全性、物化视图这些能力在 MySQL 里要么没有要么支持得比较勉强。对 Delphi 开发者来说PG 还有一个隐藏优势——它对 Windows 桌面的支持非常成熟无论是开发库还是运行时依赖都比某些开源数据库省心。更重要的是PostgreSQL 这些年版本迭代很快从 14 到 15 再到 16性能持续提升而且对高并发事务的处理越来越稳。我见过很多中小团队把核心业务数据往 PG 上迁配合它自己的复制和分区特性完全可以支撑起一套像样的业务系统。Delphi 端通过 FireDAC 或 uniDAC 对接本质上是在发挥两边的长处Delphi 负责快速交付桌面端和中间层PG 负责把数据管得明明白白。1.2 FireDAC 和 uniDAC 都是谁各自强在哪FireDAC 从 Delphi XE5 开始就是官方标配最大的好处是不需要额外掏钱而且跟 IDE 的结合度极高。它能直接在设计期配置连接、拖个 TFDConnection 就能预览数据对快速开发非常友好。FireDAC 的底层架构做得很统一一套 API 可以对接多种数据库换库的时候改动非常小。它的本地 SQL 语法解析、批量写入、异步查询这些功能认真用起来能省掉大量自己造轮子的时间。uniDAC 是 Devart 家的商用组件口碑一直不错。它的特点是更轻量、更专注而且对数据库底层特性的暴露更直接。比如它有一个 Direct Mode直连模式可以不依赖 PostgreSQL 官方客户端库直接连数据库这在某些不允许安装额外 DLL 的企业环境里简直救命。uniDAC 的连接池、事务控制、SQL 生成和 FireDAC 相比也有一套自己的逻辑有些场景下性能表现会更好。当然它收费不过对商业项目来说这钱花得值。1.3 ODBC/ADO 方案为什么我不推荐很多新手一开始会想着用 ODBC 或者 ADO 连接 PG因为看起来“现成”。这种方式在小 demo 里能跑通但一上生产就露馅了。首先ODBC 驱动比如 psqlODBC本身会有一层转换开销SQL 和数据类型在转换过程中容易出现偏差尤其是处理 PostgreSQL 原生数组、JSONB、时间区间这些类型时映射起来非常痛苦。其次ODBC 驱动的版本和 PostgreSQL 服务端版本经常有兼容性差异我遇到过驱动升级后所有连接突然变慢的情况排查了半天才发现是 ODBC 驱动的问题。更重要的是专用组件在类型映射、连接生命周期管理、事务粒度控制上有天然优势。FireDAC 和 uniDAC 都做了完整的 PG 类型映射拿到数据就是 Delphi 原生类型不用手动转来转去。连接池也做得成熟不像 ADO 那样要靠自己写额外的池化逻辑。所以说既然要用 Delphi 正经做 PostgreSQL 开发就别省这一步直接从专用组件入手。2. 环境准备装好 PostgreSQL 并配好驱动 DLL2.1 Windows 下安装 PostgreSQL 的注意点安装 PostgreSQL 本身不复杂但有几个细节容易被忽略。第一安装时选的安装目录和数据库数据目录尽量都用英文路径避免莫名其妙的编码问题。第二端口默认是 5432如果本机有其他 PostgreSQL 实例记得调整。第三超级用户 postgres 的密码一定要设置好别用太简单的因为后面远程连接、防火墙放行都要靠它。还有一个必须知道的点PostgreSQL 15 开始默认的身份认证协议改成了 SCRAM-SHA-256这比旧版的 md5 安全但也带来一个兼容性问题——如果客户端组件或驱动库太老可能无法完成认证。所以装好 PG 之后建议顺手看一眼安装目录下的pg_hba.conf确认认证方式。如果你是开发环境想省事一点可以把pg_hba.conf里的 IPv4 连接方式从scram-sha-256临时改成md5或trust但注意这只是开发期做法生产环境千万不要用 trust。2.2 libpq.dll 到底是什么为什么绕不开libpq 是 PostgreSQL 官方的 C 语言客户端库很多 Delphi 组件包括 FireDAC 和 uniDAC 的客户端模式在底层都要通过它跟数据库通信。它的存在形式和 SQL Server 的客户端不同是一个独立的 DLL 文件通常安装 PG 后会在bin目录下找到。要让 FireDAC 或 uniDAC 正确加载 libpq.dll有两个办法一是把 DLL 放到程序运行目录最简单推荐二是放到系统 PATH 环境变量包含的目录。注意版本匹配问题——DLL 版本最好不低于服务端版本否则可能因为协议差异出问题。比如服务端是 PostgreSQL 15你拿一个 PG 10 时代的 libpq.dll连上去大概率会报认证失败或协议不支持。下载方式很简单安装 PG 时就带上对应版本的 libpq.dll或者从官方仓库单独取。这里有一个很容易踩的坑如果你机器上装了多个 PostgreSQL 版本系统 PATH 里可能会有多个 libpq.dll程序实际加载的是哪一个要看 PATH 顺序。我一般会直接把 DLL 复制到 exe 同目录通过程序当前目录优先级高于 PATH 的特性来规避这种混乱。2.3 准备测试库和测试账号连接数据库之前先建一个专用账号和测试库避免直接用 postgres 超管账号开发。这不光是安全习惯也能早点发现权限问题。用 psql 执行下面这段CREATE USER app_user WITH PASSWORD your_password; CREATE DATABASE app_db OWNER app_user; GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;然后测试一下psql -h localhost -p 5432 -U app_user -d app_db能正常进入说明服务端没问题。这一步很重要很多人 Delphi 端连不上其实数据库本身根本没起来或者监听地址不对。另外如果你打算远程连数据库还需要在 PostgreSQL 配置文件postgresql.conf里把listen_addresses改成*并在防火墙里放行 5432 端口这个后面在问题排查部分还会细说。3. FireDAC 连接 PostgreSQL配置、代码与运行细节3.1 设计期配置TFDConnection 和 DriverIDFireDAC 连接 PG 的第一个核心要点是DriverIDPG。在设计期拖一个 TFDConnection然后在 Params 里填这些内容。有一个非常容易漏掉的点FireDAC 的 PG 驱动默认是不内置libpq 加载能力的你可能需要放一个 TFDPhysPgDriverLink 组件或者在代码里设置它的 VendorLib 属性。如果不设置运行时会报“Cannot load vendor library [libpq.dll]”这个错误在线下培训时至少有一半人遇到过。我常用的一组连接参数是这样的参数值说明DriverIDPG指定使用 PostgreSQL 驱动Server127.0.0.1数据库地址Port5432端口Databaseapp_db数据库名User_Nameapp_user用户名Passwordyour_password密码LoginTimeout5登录超时单位秒PooledTrue开启连接池性能更好在做设计期配置时如果把PooledTrue加上FireDAC 会走 FDManager 的连接池机制。注意一点连接池的部分后面会展开讲但设计期就要想好否则到了运行期再改连接池会牵扯到 FDManager 的初始化顺序问题容易出怪病。另外设计期如果勾选了 LoginPrompt每次连接都会弹账号密码框开发时很烦记得关掉。3.2 运行期代码方式创建连接设计期配置适合快速验证但代码方式会让你更清楚每一步在做什么。我在实际项目里基本都是代码动态创建连接特别是做多数据库切换时代码方式配合配置文件最灵活。下面是一个完整的示例uses FireDAC.Comp.Client, FireDAC.Stan.Intf, FireDAC.Phys.PG, FireDAC.Phys.PGDef, FireDAC.Phys.PGWrapper, FireDAC.UI.Intf, FireDAC.VCLUI.Wait; var FDConn: TFDConnection; DriverLink: TFDPhysPgDriverLink; begin DriverLink : TFDPhysPgDriverLink.Create(nil); try DriverLink.VendorLib : C:\PostgreSQL\bin\libpq.dll; FDConn : TFDConnection.Create(nil); try FDConn.DriverName : PG; FDConn.Params.Add(Server127.0.0.1); FDConn.Params.Add(Port5432); FDConn.Params.Add(Databaseapp_db); FDConn.Params.Add(User_Nameapp_user); FDConn.Params.Add(Passwordyour_password); FDConn.Params.Add(LoginTimeout5); FDConn.Open; // 到这里连接已建立可以执行查询了 finally FDConn.Free; end; finally DriverLink.Free; end; end;这段代码的关键在于TFDPhysPgDriverLink要及早创建并且设置好VendorLib。你可能会问为什么不直接用全局的 FDManager 配置其实也可以但对大多数业务系统来说单独管理 DriverLink 更清晰出问题也好定位。3.3 运行期关键设置WaitCursor、LoginTimeout 与其他FireDAC 连接 PG 时有一个非常影响体验的设置WaitCursor。默认是fsqlWait也就是连接时会显示沙漏光标如果数据库响应慢用户会觉得程序卡死了。我一般在大型查询时会改成fsqlHold或者在界面层配合异步查询使用。还有一个关键参数是LoginTimeout。PostgreSQL 默认的登录超时时间服务端可能长达几十秒如果数据库挂了Delphi 端客户端会一直傻等。设置LoginTimeout5能让你快速感知服务不可用避免页面卡死。类似的还有ConnectionTimeout这个是底层 TCP 层面的超时我一般也会设个 5 到 10 秒。另外连接成功后可以用FDConn.ConnectionState来判断状态但更实用的是FDConn.TestConnection它能触发一次真正的往返通信来验证连接是否可用。这个在写服务健康检查或者配置界面“测试连接”按钮时特别有用。3.4 SSL 模式与加密连接的取舍PostgreSQL 默认支持 SSLFireDAC 的 PG 驱动也提供了 SSLMode 参数。开发环境或者内网环境直接设成SSLModedisable最省事。但生产环境跨公网连接时还是建议开启 SSL具体配置方式可以这样FDConn.Params.Add(SSLModerequire);一旦开启 requireFireDAC 会验证服务端 SSL 证书。如果遇到证书校验失败也可以调整SSLCert、SSLKey、SSLRootCert这些参数。不过说实话绝大多数 Delphi PostgreSQL 项目跑在内网我建议你别一上来就开 SSL先保证基础连接通再逐步加安全层。反过来如果你一开始就遇到 TLS 握手错误也不要慌后面有问题排查部分专门讲。4. uniDAC 连接 PostgreSQL另一种打法与 Direct 模式4.1 uniDAC 的安装、组件结构TUniConnection 还是 TPGConnectionuniDAC 安装后工具箱里会多出一组组件。最常用的是TUniConnection它是多数据库统一入口另外还有一个TPGConnection是专门针对 PostgreSQL 封装的连接组件属性更特定化。我个人的建议是如果项目只用 PostgreSQL用 TPGConnection 更直接如果未来可能换数据库就统一用 TUniConnection。TPGConnection 的关键属性包括Server、Port、Database、Username、Password看起来很直观。有一个容易被忽视的属性是SpecificOptions很多高级配置都藏在这里面比如Direct直连模式、SSLMode、UseUnicode这些。配置不当会导致连接失败但配置入口又不像 FireDAC 那么显眼所以新人容易懵。我常用的 uniDAC 连接参数如下属性/选项值说明Server127.0.0.1数据库地址Port5432端口Databaseapp_db数据库名Usernameapp_user用户名Passwordyour_password密码SpecificOptions.DirectFalse是否直连稍后展开SpecificOptions.SSLModedisable内网先禁用 SSLConnectTimeout5连接超时4.2 uniDAC 代码方式创建连接用 uniDAC 代码方式连接时核心是设置 ProviderName并确保 uniDAC 的连接组件已经正确安装到 IDE 里。下面这段是我在一个项目里实际用过的写法uses Data.Win.ADODB? // 不是这个正确的是 Uni, UniProvider, PGProvider, DBAccess; var UniConn: TUniConnection; begin UniConn : TUniConnection.Create(nil); try UniConn.ProviderName : PostgreSQL; UniConn.Server : 127.0.0.1; UniConn.Port : 5432; UniConn.Database : app_db; UniConn.Username : app_user; UniConn.Password : your_password; UniConn.ConnectTimeout : 5; UniConn.SpecificOptions.Values[SSLMode] : disable; UniConn.Connect; // 连接已建立 finally UniConn.Free; end; end;注意ProviderName : PostgreSQL必须和安装的 uniDAC Provider 名称严格一致。很多时候连不上就是因为拼写不一致或 Provider 没有正确部署。另外SpecificOptions.Values[Direct]的值是字符串 True/False别当成布尔类型赋值。4.3 Direct 模式 vs 客户端模式哪种更值得用这是 uniDAC 的核心卖点之一。Direct 模式也叫直连模式下uniDAC不再依赖 libpq.dll而是直接用 Delphi 代码实现了 PostgreSQL 通信协议。这意味着你的程序拿到一台没有安装任何 PG 客户端的 Windows 机器上也能跑部署时只需要带几个 uniDAC 的运行库 DLL 就行。对于企业内部分发软件来说这种部署成本优势非常明显。但 Direct 模式也不是全无缺点。首先是功能覆盖度——虽然 uniDAC 在不断补齐协议支持但某些 PostgreSQL 的高级特性例如部分复制流、某些认证插件在客户端模式下支持得更快、更完整。其次Direct 模式有时候在极端网络场景下性能略逊于官方 libpq 优化过的客户端模式。所以我的建议是如果软件要分发给多个终端不想管 libpq 的版本问题选 Direct 模式。如果数据库功能用得很深或者对性能有极致要求选客户端模式但要把 libpq.dll 的部署列进发布清单。实际上我在一个工控项目里就用过 Direct 模式跑了两年多稳定性很好没出过连不上的问题。所以 uniDAC 的这个特性值得认真对待。5. 性能优化与大数据量场景下的实操心得5.1 FetchOptions 与 RecordCount为什么默认取数会卡FireDAC 默认的抓取模式是自动的它会根据 SQL 去请求数据但对于大结果集如果不约束内存占用会迅速上涨。我在一张百万行的日志表上跑过select * from log_table直接让程序内存飙到 1GB 以上界面基本没法操作。后来加了以下配置FDQuery.FetchOptions.Mode : fmAll; // 全部抓取 FDQuery.FetchOptions.Cache : [fiBlobs, fiDetails]; // 按需缓存 FDQuery.FetchOptions.RecordCountMode : cmVisible; // 只统计可见行更稳妥的方式是分页查询。FireDAC 本身没有内置的分页组件但可以用 PG 的LIMIT和OFFSET自己控制。uniDAC 也类似它有一个FetchAll属性如果设成 False只会拉取当前需要的数据块配合uniQuery.FetchRow或网格的实时取数适合大量数据的浏览界面。关键原则是连接对象负责通道查询对象负责节流。不要指望数据库把所有数据一股脑倒给客户端特别是在 C/S 架构里网络带宽和客户端内存都是瓶颈。5.2 连接池配置FireDAC 和 uniDAC 各自的玩法PostgreSQL 的连接开销比很多人想象中大每次建立连接都要经历 TCP 握手、认证、数据库初始化如果不做连接池高并发情况下数据库端会积累大量 TIME_WAIT。FireDAC 里开连接池很简单FDManager.OpenConnectionDef(MyPool, PG, Server127.0.0.1;Databaseapp_db;User_Nameapp_user;Passwordyour_password;PooledTrue;Pool_MaximumItems20;);注意两点一是连接池的名称MyPool是逻辑名字后续 FDConnection 的ConnectionDefName指向它二是Pool_MaximumItems默认是 50别盲调太高PG 服务端的max_connections才是最终上限。uniDAC 则更直接它有Pooling属性和PoolingTimeout。把TUniConnection.Pooling : True再设置合适的池大小就行。我一般习惯把池大小控制在 5 到 10 之间因为业务系统并发量通常没那么夸张池太大反而闲置连接占资源。5.3 事务与批量写入几千条数据别再一条条循环 InsertDelphi 程序连接 PG 时最容易出现的性能问题就是“逐条提交”。每条 INSERT 都是一次往返5000 条数据就要跑 5000 次事务提交性能差得离谱。正确做法是批量写入或者至少用显式事务包起来。在 FireDAC 中你可以用 TFDQuery 的参数批量模式FDQuery.SQL.Text : INSERT INTO app_table (name, value) VALUES (:name, :value); FDQuery.Params.ArraySize : 500; // 一次绑定 500 条 for i : 0 to 499 do begin FDQuery.Params[0].Values[i] : ...; FDQuery.Params[1].Values[i] : ...; end; FDQuery.Execute(FDQuery.Params.ArraySize);uniDAC 也有类似机制用TUniQuery.Params.ArraySize加上Execute的批量参数即可。另外显示事务也很重要FDConn.StartTransaction; try // 大量写入操作 FDConn.Commit; except FDConn.Rollback; raise; end;这样既保证了原子性又大幅减少了事务提交次数整体写库性能能有数量级的提升。我在一个导入功能里把一万条记录从 20 多秒优化到了 1 秒多核心就是批量 单事务。6. 常见连接失败问题排查实录6.1 问题速查表先对号入座报错信息常见原因解法Cannot load vendor library [libpq.dll]libpq.dll 缺失或版本不对把对应版本的 DLL 复制到程序目录或设置 VendorLib 路径FATAL: password authentication failed for user密码错误或 pg_hba.conf 认证方式不匹配检查密码确认 pg_hba.conf 中认证方式是 scram-sha-256 或 md5Could not open connection: Connection refused服务端没启动、端口不对、防火墙拦截检查 PG 进程和监听地址telnet ip 5432 测试SSL error: certificate verify failedSSL 证书校验失败的场景内网先设 SSLModedisable生产配置正确证书duplicate key value violates unique constraint表结构约束冲突检查主键和唯一索引这往往是数据问题timeout expired / connection timed out网络不通或后端超时设置太短延长 LoginTimeout检查网络连通性这表格里面第一行是最常见的。如果你刚把项目从开发机拷到另一台机器多半就是这个报错。解决办法很简单但还是啰嗦一句一定要把 libpq.dll 放进运行目录光装客户端不一定能解决问题因为程序不一定会去读 PG 安装目录。6.2 SSL 协商失败的根源搞定 TLS 握手报错很多同行在使用旧版驱动连接新版 PostgreSQL 服务端时撞到类似ssl23_get_server_hello的报错这个报错虽然经常出现在 OpenSSL 库与其他组件的交互中但在 Delphi PostgreSQL 环境里也有个共同根源客户端尝试 SSL 握手但服务端 / 驱动版本只支持更高版本 TLS 协议。PostgreSQL 高版本14默认加密能力越来越强客户端如果用的是上古 OpenSSL 版本或者 FireDAC/uniDAC 里 SSLMode 设置让人误解就可能在连接初期的 TLS 协商阶段直接失败。解决办法分几步内网开发环境直接设SSLModedisable不要让它走 TLS。如果业务要求必须走 SSL检查驱动库libpq / uniDAC provider是否需要更新。确认服务端postgresql.conf中ssl和ssl_min_protocol_version设置必要时调低最低 TLS 版本但生产环境要谨慎。这个错误的名头不小但实际定位路径很清晰先用 psql 命令行测试如果 psql 能连、Delphi 连不上问题就在客户端组件层如果 psql 也报 TLS 问题那就要先从服务端证书和 SSL 配置入手。6.3 防火墙、pg_hba.conf 与远程连接三连坑远程连不上 PG 时我通常按这个顺序排查第一步确认监听地址。在postgresql.conf中listen_addresses必须包含客户端要访问的 IP或者直接用*。很多刚装了 PG 的机器默认只监听 localhost当然连不上。第二步确认 pg_hba.conf。这个文件控制谁可以用什么方式访问哪个库。我的开发环境一般是host all all 127.0.0.1/32 scram-sha-256 host all all 0.0.0.0/0 scram-sha-256生产环境不要这么宽按实际网段收紧。第三步防火墙。Windows 防火墙经常拦截 5432 端口的入站连接要么加一条入站规则要么在连接失败的瞬间查安全日志。我在排查时习惯一步到位直接telnet 服务器IP 5432看通不通——通则数据库层问题不通则必然是网络层问题。还有一个隐蔽问题PostgreSQL 默认只监听 IPv4 的 localhost如果你在连接字符串里写的是主机名DNS 解析到了 ::1IPv6 localhost也会出现从本机连不上的怪现象。干脆用 127.0.0.1 最直接。6.4 通用排查顺序从网络层到驱动层逐层剥洋葱如果上面几个针对性方案都没解决那就走一套通用排查流程第一层网络连通性。ping 通不代表端口通要用telnet或 PowerShell 的Test-NetConnection检查 5432 端口。端口通才能继续。第二层服务可用性。在数据库服务器本机跑psql -U postgres -d postgres确认数据库进程正常、账号可以登录。这里能区分是服务端问题还是客户端问题。第三层认证配置。检查账号是否存在、密码是否符合当前认证方式、pg_hba.conf 是否给了该 IP 的访问权限。这层经常会因为换了一台机器而暴露问题。第四层驱动加载与组件配置。看 libpq.dll 版本、DriverID、ProviderName、连接参数是否匹配。这一层是 Delphi 端的大头多数疑难杂症都在这。第五层SSL 与加密。最后排查 SSLMode、证书、TLS 协议兼容性。这套流程我用了很多年能覆盖九成以上的连接问题。而且每次做完一层就把原因锁定在某一小范围内不会来回瞎试。6.5 防火墙放行和开发环境的一点补充开发环境还有一个惯用招数用 Docker 快速拉起一个 PostgreSQL。services: postgres: image: postgres:16 container_name: pg_dev environment: POSTGRES_USER: app_user POSTGRES_PASSWORD: your_password POSTGRES_DB: app_db ports: - 5432:5432这样能把数据库环境跟本机隔离随时重置特别适合研究连接参数的时候。但要记住 Docker 映射的端口和主机端口不要冲突否则容易连到别的实例上。7. 周边工具与后续扩展让连接更从容7.1 pgAdmin 与 psql写代码前先把 SQL 跑明白我强烈建议在 Delphi 写查询逻辑之前先用 pgAdmin 或 psql 把 SQL 跑通。这不光是验证语法更是为了确认连接参数和账号权限。很多时候代码里报错其实 SQL 在数据库端就被拒了排查半天绕了个大圈子。pgAdmin 是我日常用得最多的工具界面直观支持查询计划分析还能直接看表结构和数据量。psql 则是排查连接问题时最快的手动工具一条命令就完成测试。这两个工具不需要额外配置PG 官方安装包自带。7.2 pgvector、时序扩展与高可用连接之外的下一个话题很多人在搜索 PG 相关内容时还会关注 pgvector、集群搭建和高可用方案。这说明 PostgreSQL 的使用场景正在从存储引擎向 AI 应用、大规模分析延伸。对 Delphi 开发者来说连接问题只是起点把 PG 的能力吃透之后你可以用它做更多事——比如在工控系统里存储时序数据或者在业务系统里用 JSONB 存半结构化配置。pgvector 的安装并不复杂Windows 下也有对应安装包但要用好它跟 Delphi 端的数据交换还是得回到我们前面说的类型映射——通过 FireDAC 或 uniDAC 正确读取向量字段避免一堆手工转换。这条线可以专门开一篇讲这里先埋个伏笔。7.3 组件版本、IDE 版本与 PG 版本的兼容矩阵最后提醒一个问题三方组件的版本一致性。Delphi 版本不同FireDAC 的行为也有细微差异uniDAC 则要求 IDE 版本匹配否则安装会失败。PG 服务端版本越高对客户端协议的兼容性要求也越高。我的建议是项目选型时先定版本组合记到项目文档里。比如“Delphi 11.3 FireDAC PostgreSQL 15”所有开发机统一这个组合避免因为某个人升级了 libpq 导致其他人连接行为不一致。说实话数据库连接这种基础功能一旦形成“版本沼泽”后面排查成本极高。最后再分享一个小技巧在一次给客户驻场调试时我发现对方 IT 人员特别怕连接失败因为不知道改哪里。后来我做了一个只有一百行的 Delphi 小工具界面上放几个 TEdit 填连接参数一个“测试连接”按钮后台用 FireDAC 的TestConnection完成验证并把详细报错展示出来。这个工具分发到终端后一半以上的连接问题都不用我再跑现场了。根据我个人实际操作体会FireDAC 和 uniDAC 的差别没有网上说的那么玄乎关键是你要理解自己项目所处的部署环境和数据库使用深度。如果追求官方标配、减少授权成本FireDAC 完全能打如果追求部署灵活性、不想被 libpq.dll 版本折腾uniDAC 的 Direct 模式会让你省很多心。无论选哪条路回到最前面那句话——先能稳定连接再谈性能和功能。