Я написал несколько программ на C ++, которые используют ODBC для удаленной работы с базой данных.В этом случае база данных работает в движке Postgres, а мое программное обеспечение работает на сервере с Ubuntu с установленным unixODBC и драйвером odbc-postgres.
Я использовал 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, которую я отправляюstdout:
[unixODBC]FATAL: password authentication failed for user "myUser"
(Конечно, использование --dsn DSN=myDSN
тоже не удается точно так же).
Этот пароль правильный.Я могу установить соединение и работать с ним в isql, если я вызываю все три аргумента командной строки.Но по какой-то причине в этой среде что-то еще мешает мне сделать это правильно.
В фактическом пароле для этого соединения я использую символ «#».Это единственный отдаленно специфический персонаж, который может каким-либо образом вызвать проблемы.Я знаю, что bash не делает ничего странного с ним в командной строке, потому что я вижу, что он указан в stdout из моего исполняемого файла, и я попытался добавить его к \, чтобы убедиться, что он был экранирован правильно в случае, если bash делал что-то нехорошеес ним.
Я не могу использовать isql для того, что я хочу сделать ... набор данных, который я могу запросить, нуждается в некоторой любви к С ++ (или подобному).
Редактировать:
Исследуя еще кое-что, я сделал следующее:
- Изменен файл .odbc.ini, чтобы он соответствовал среде разработчика.Это привело к успешной связи.Поэтому в клиентской среде нет ничего неправильного.
- Изменил файл .odbc.ini для использования того же сервера и базы данных, но изменил имя входа, чтобы оно соответствовало ошибочному.Затем я добавил эту роль / пароль в движок разработчика Postgres, соответствующий целевой учетной записи на целевом движке Postgres.Этот терпит неудачу.Следовательно, я думаю, что проблема может быть связана с паролем.
Любые предложения о том, куда идти дальше?