我用 C++ 编写了一些使用 ODBC 远程操作数据库的软件。在本例中,数据库在 Postgres 引擎中运行,而我的软件在安装了 unixODBC 和 odbc-postgres 驱动程序的 Ubuntu 服务器计算机上运行。
我使用 odbcinst 和正确的模板文件来生成 .odbc.ini 文件。我知道这是正确的,因为我使用它使用不同的用户名/密码组合连接到不同服务器上的不同 Postgres 数据库。俗话说“在我的开发机器上运行”。
在此目标计算机上,我更改了服务器、用户名和密码以匹配我想要连接的位置。
因此,在 bash 命令行上,我使用以下命令进行测试:
$ isql -v myDSN
结果:
[28000][unixODBC]FATAL: password authentication failed for user "myUser"
[ISQL]ERROR: Could not SQLConnect
呃,好吧,让我们试试这个:
$ isql -v myDSN myUser myPassword
这产生:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
Neato,但当“myPassword”被逐字剪切和粘贴以确保其相同时,却相当神秘。
好吧,所以,也许在我的二进制文件中,我可以使用:
,而不是使用“DSN = myDSN”作为传递到命令行的连接字符串$ my_bin --myArgs --dsn Driver={PostgreSQL\ Unicode}\;Servername=myServer\;Database=myDatabase\;UID=myUser\;PWD=myPassword
但是,这会生成一个 ODBC 错误,我将其发送到标准输出:
[unixODBC]FATAL: password authentication failed for user "myUser"
(当然,使用
--dsn DSN=myDSN
也会以同样的方式失败)。
此密码正确。如果我使用所有三个命令行参数进行调用,我可以建立连接并在 isql 中使用它。但是,由于某种原因,在这种环境下,有其他东西阻止我正确地执行此操作。
在此连接的实际密码中,我使用“#”字符。这是唯一一个可能以任何方式引起问题的远程特殊字符。我知道 bash 在命令行上没有做任何奇怪的事情,因为我看到它在我的可执行文件的标准输出中引用,并且我尝试在它前面加上 \ 以确保它能够正确转义,以防 bash 做了一些令人讨厌的事情有了它。
我无法使用 isql 来完成我想做的事情...我可能请求的数据集需要一些 C++(或类似的)爱好。
编辑:
进一步调查,我做了以下事情:
关于从这里去哪里有什么建议吗?
最后,我添加了另一个用户,其密码中没有“#”字符,并更改了我的 .odbc.ini 文件以匹配新用户和密码。
连接正确。
也许这个驱动程序有一个错误。
一个老问题,但我进行了广泛的搜索,但没有找到适合我的解决方案。
对我有用的是 在 odbc.ini 文件中对密码进行 URL 编码。