1

背景

我们有一个使用 PostgreSQL 9.3 作为后端数据库的遗留 Windows 应用程序(在 Clarion 中开发)。该应用程序使用PostgreSQL ODBC 32-bit Driver(Unicode) 9.03.04 与数据库交互。

到目前为止,该应用程序的所有用户都使用 Windows 7 Professional 64 位计算机,并在其上安装了相同版本的 PostgreSQL ODBC 32 位驱动程序。在那之前一切都很好。从上个月开始,我们开始为新用户提供Windows 7 Enterprise 64 位机器。当我们在这些新机器上安装相同版本的 32 位 psql-odbc 驱动程序时,它默认安装的是 64 位版本的驱动程序。然后我们在所有这些机器上手动安装了具有 32 位特定安装程序的 psql odbc 9.05.01 驱动程序(卸载 x64 驱动程序后),以确保所有机器都使用 32 位驱动程序。

问题

在所有运行 Windows 7 Enterprise 的较新机器上,当插入或更新固定十进制值数据库字段时,它会被转换为更长的浮点精度。

下面是从这些较新的机器进行更新时在服务器上记录的查询。

    UPDATE schema.table SET VALUE = $1 WHERE ID = $2
    parameters: $1 = '-57.192999999999998', $2 = '672718'
    Data Types are  VALUE:numeric and ID:integer

问题是应用程序实际上将值作为“-57.193”传递,并且它从所有“Win7 Pro”机器完全按照“-57.193”传递到数据库,但是 Win7 Enterprise 将数据发送到 postgres 与十进制 15地方。

我已经调试了应用程序,以确保在所有情况下将值传递给 odbc,小数点后 3 位。我可以确认应用程序端没有问题。但是,odbc 实际上是将所有带有定点小数的查询转换为小数点后 15 位。对于所有插入或更新定点小数字段的查询,都会发生这种情况。在所有情况下,3 位或 4 位十进制值在句点后转换为 15 位十进制值。

这些可能导致此问题的 Windows 7 Enterprise 计算机有什么不同?我确保所有机器都使用 32 位 PSQL ODBC 驱动程序(尽管版本不同)。即使企业机器上安装了相同版本(9.03.04)的 64 位驱动程序,也会出现同样的问题。我看错了吗?可能问题出在操作系统版本和 ODBC 之外,欢迎提出任何建议。

我试图阅读 ODBC 跟踪日志以查看 SQL 参数的准确输入和输出值,但它们不是纯文本形式。它们采用以下格式。

HSTMT               0x0305F650
UWORD                        1 
SWORD                        1 <SQL_PARAM_INPUT>
SWORD                        8 <SQL_C_DOUBLE>
SWORD                        2 <SQL_NUMERIC>
SQLULEN                   28
SWORD                        6 
PTR                0x0445F02E
SQLLEN                     8
SQLLEN *            0x04818D08 

任何帮助甚至从 ODBC 跟踪日志中读取参数值都非常感谢。

4

0 回答 0