我正在旧程序(HotDocs Document Assembly)中通过 ODBC 连接字符串访问 Postgres 数据库。这是访问 HotDocs 中数据库的唯一方法
我运行的查询不断出现错误,执行时间超过 30 秒:
错误:由于语句超时而取消语句; 执行查询时出错(80004005 - 未指定错误)来源:Microsoft OLE DB Provider for ODBC Drivers
显然 postgres 在 psqlodbc v 9+ 中引入了 30 秒的默认查询超时,但我还没有找到解决这个问题的方法。
我在网上找到的许多类似问题要么是指非 ODBC 超时,可以通过运行查询来更新超时设置来解决,要么编辑 postgresql.conf。但我的查询在 PGAdmin 或其他非 ODBC 客户端中没有超时。只是 ODBC 连接超时。
我发现的其他帖子使用不同的环境来访问 ODBC 驱动程序(如 VBA),并且它们似乎能够通过 ODBC API 将不同的参数传递给 ODBC (https://learn.microsoft.com/ en-us/sql/odbc/reference/syntax/sqlsetstmtattr-function?view=sql-server-ver16),我在 HotDocs 中没有。就我而言,我需要一个可以应用于 ODBC 驱动程序设置(在 Windows ODBC 管理器/注册表中)或我在 HotDocs 中使用的连接字符串的解决方案。
我尝试修改连接字符串来添加
Ignore Timeout=1
参数(都在“扩展属性”参数及其自己的单独参数中)。还尝试了连接字符串和注册表中的 QueryTimeout=3600000
或 QueryTimeout=1
参数(基于这篇文章:https://groups.google.com/g/ensemble-in-healthcare/c/8dRv1n-DwpU? pli=1)。也试过CommandTimeout=3600
。
我尝试将
SET statement_timeout=3600000
添加到“ConnSettings”参数(基于此链接https://pgsql-odbc.postgresql.narkive.com/tq9IPYmq/odbc-sql-query-timeout)
我尝试直接在从 HotDocs 运行的 postgres 函数代码中添加
SET statement_timeout=3600000
。
对我来说,没有一种简单的方法可以在 ODBC 连接字符串中设置不同的语句超时(或无超时),这似乎很疯狂。
这篇文章中的用户 (https://postgrespro.com/list/thread-id/2448747) 建议他能够编辑 ODBC 驱动程序的实际 DLL 文件来设置
statement_timeout=0
。但我不确定如何编辑二进制 DLL 文件来更改它?
我知道这是一个旧线程,但这对我有用,基于https://odbc.postgresql.org/docs/config.html(页面底部标题为“如何指定为连接”的部分)选项”)和https://odbc.postgresql.org/docs/config-opt.html(忽略超时的代码位于最底部)。
将
D9=1;
添加到您的连接字符串中。像这样,其中 serverConn 是连接字符串详细信息,例如用户名等:
myConn = "ODBC;DRIVER={PostgreSQL Unicode};" & serverConn & " D9=1;"