Подключение MS SQL с использованием freetds и unixodbc: isql - драйвер по умолчанию не указан

28

Я пытаюсь подключиться к базе данных MS SQL, используя freetds и unixodbc . Я читал различные руководства, как это сделать, но никто не работает нормально для меня. Когда я пытаюсь подключиться к базе данных с помощью инструмента isql , я получаю следующую ошибку:

$ isql -v TS username password
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect

Кто-нибудь уже успешно установил соединение с базой данных MS SQL, используя freetds и unixodbc в Ubuntu 12.04? Я был бы очень признателен за помощь.

Ниже приведена процедура, которую я использовал для настройки freetds и unixodbc . Заранее спасибо за помощь!

Процедура

Сначала я установил следующие пакеты:

sudo apt-get install unixodbc unixodbc-dev freetds-dev tdsodbc

и настроил freetds следующим образом:

--- /etc/freetds/freetds.conf ---
[TS]
host = SERVER
port = 1433
tds version = 7.0
client charset = UTF-8

Используя инструмент tsql , я могу успешно подключиться к базе данных, выполнив

tsql -S TS -U username -P password

Поскольку мне нужно соединение odbc, я настроил odbcinst.ini следующим образом:

--- /etc/odbcinst.ini ---
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
CPTimeout =
CPResuse  =
client charset = utf-8

и odbc.ini следующим образом:

--- /etc/odbc.ini ---
[TS]
Description = "test"
Driver = FreeTDS
Servername = SERVER
Server = SERVER
Port = 1433
Database = DBNAME
Trace = No

Попытка подключиться к базе данных с помощью инструмента isql с такой конфигурацией приводит к следующей ошибке:

$ isql -v TS username password
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect
Деяна
источник
Использовать tsql:sudo apt-get install freetds-bin
Stevie G

Ответы:

17

Спасибо, ваш пост был очень полезен для меня. Я смог заставить его работать, удалив следующие строки из моего файла odbcinst.ini

Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
CPTimeout =
CPResuse  =
client charset = utf-8

так что теперь мой файл odbcinst.ini выглядит так:

--- /etc/odbcinst.ini ---
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

и мой файл odbc.ini теперь выглядит так:

--- /etc/odbc.ini ---
[TS]
Description = "test"
Driver = FreeTDS
Server = SERVER
Port = 1433
Database = DBNAME

Однажды я все упростил, все заработало отлично. Я до сих пор не могу заставить его работать с RODBC, но он работал с isql.

Я не знаю, поможет ли это, но ваш пост помог мне. Спасибо.

Джон Катзингер
источник
Спасибо, определенно связано с отсутствующим водителем в/etc/odbcinst.ini
Dejan
1
Привет, отличный ответ, но, к сожалению, я не смог заставить его работать, хотя копировал ваши файлы. какие-нибудь мысли о причине почему? это почти то же самое, за исключением того, что в части SERVER я использую IP, а не имя. ты думаешь это могло быть? Большое спасибо
Педро Браз
14

Это минимальный, но полный пример подключения к базе данных SQL Azure с помощьюisql от Ubuntu 14.04.1 LTS. Пример взят из статьи Как подключить базу данных SQL Azure из Ubuntu (отказ от ответственности: это моя личная вики).

Установите необходимые пакеты

$ sudo apt-get -y install freetds-bin tdsodbc unixodbc

Настроить FreeTDS

файл /etc/freetds/freetds.conf

[global]
tds version = 7.1

[<SERVERNAME>]
host = <HOST>.database.windows.net
port = 1433

Тестовое соединение

На этом этапе соединение с tsqlдолжно работать:

$ tsql -S <SERVERNAME> -U <USERNAME>@<HOST> -P <PASSWORD>

Обратите внимание, что @<HOST>требуется. В противном случае соединение завершается с ошибкой:

Msg 40531 (severity 11, state 1) from [<SERVERNAME>] Line 1:
    "Server name cannot be determined.  It must appear as the first segment of the server's dns name (servername.database.windows.net).  Some libraries do not send the server name, in which case the server name must be included as part of the user name (username@servername).  In addition, if both formats are used, the server names must match."
Error 20002 (severity 9):
    Adaptive Server connection failed
There was a problem connecting to the server

Настроить драйвер ODBC

файл /etc/odbcinst.ini

[FreeTDS]
Description = FreeTDS Driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

Настройте источники данных ODBC

файл /etc/odbc.ini

[<DATA_SOURCE_NAME>]
Driver = FreeTDS
Servername = <SERVERNAME>
Port = 1433
Database = <DBNAME>

<SERVERNAME>такой же, как в freetds.conf.

Связаться с isql

$ isql -v <DATA_SOURCE_NAME> <USER>@<HOST> <PASSWORD>
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select current_timestamp
+------------------------+
|                        |
+------------------------+
| 2015-01-02 09:05:55.593|
+------------------------+
SQLRowCount returns 1
1 rows fetched
SQL>

Обратите внимание, что @<HOST>требуется. В противном случае соединение завершается с ошибкой:

[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[37000][unixODBC][FreeTDS][SQL Server]Server name cannot be determined.  It must appear as the first segment of the server's dns name (servername.database.windows.net).  Some libraries do not send the server name, in which case the server name must be included as part of the user name (username@servername).  In addition, if both formats are used, the server names must match.
[ISQL]ERROR: Could not SQLConnect
user272735
источник
В @<HOST>больше не появляется , чтобы быть необходимо.
Адриан Кейстер
7

В моем случае проблема возникла из-за простых отступов в моем конфигурационном файле. Итак /etc/odbc.ini, я удалил все отступы и вуаля!

( odbcinst.iniведет себя как нормальный ребенок и, кажется, не бросает истерики.)

Sudhanshu
источник
СПАСИБО! Я смотрел, что этот конфиг в течение 2 часов, пытаясь выяснить, что пустое пространство было проблемой.
Алекс Баркер
3

Ubuntu до 12.04 имел другой путь odbc в файле /etc/odbcinst.ini.

Старый путь к драйверу был:

Driver = /usr/lib/odbc/libtdsodbc.so

Я изменил это на:

Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

Вот полная конфигурация:

--- /etc/odbcinst.ini ---
[FreeTDS]
Description = tdsodbc
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
CPTimeout = 5
CPReuse = 5

Работает как шарм сейчас! Благодарность!

MikeH
источник
Строка установки устарела, сейчас?
Адриан Кейстер