Łączenie MS SQL za pomocą freetds i unixodbc: isql - nie określono domyślnego sterownika

28

Próbuję połączyć się z bazą danych MS SQL przy użyciu freetds i unixodbc . Przeczytałem różne przewodniki, jak to zrobić, ale nikt nie działa dla mnie dobrze. Kiedy próbuję połączyć się z bazą danych za pomocą narzędzia isql , pojawia się następujący błąd:

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

Czy ktoś już pomyślnie ustanowił połączenie z bazą danych MS SQL przy użyciu freetds i unixodbc na Ubuntu 12.04? Byłbym bardzo wdzięczny za pomoc.

Poniżej znajduje się procedura, której użyłem do skonfigurowania freetds i unixodbc . Z góry dziękuję za pomoc!

Procedura

Najpierw zainstalowałem następujące pakiety z:

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

i skonfigurowałem freetds w następujący sposób:

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

Za pomocą narzędzia tsql mogę pomyślnie połączyć się z bazą danych, wykonując

tsql -S TS -U username -P password

Ponieważ potrzebuję połączenia odbc , skonfigurowałem plik odbcinst.ini w następujący sposób:

--- /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

i odbc.ini w następujący sposób:

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

Próba połączenia z bazą danych za pomocą narzędzia isql z taką konfiguracją powoduje następujący błąd:

$ isql -v TS username password
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect
Dejan
źródło
Do użycia tsql:sudo apt-get install freetds-bin
Stevie G,

Odpowiedzi:

17

Dzięki, twój post był dla mnie bardzo przydatny. Udało mi się go uruchomić, eliminując następujące wiersze z mojego pliku odbcinst.ini

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

więc teraz mój plik odbcinst.ini wygląda następująco:

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

i mój plik odbc.ini wygląda teraz tak:

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

Kiedyś wszystko uprościłem, działało świetnie. Nadal nie mogę zmusić go do pracy z RODBC, ale działał z isql.

Nie wiem, czy to pomoże, ale twój post pomógł mi. Dzięki.

John Cutsinger
źródło
Dzięki, zdecydowanie związany z brakującym sterownikiem/etc/odbcinst.ini
Dejan
1
Hej, świetna odpowiedź, ale niestety nie udało mi się sprawić, by działała, mimo że kopiowałem twoje pliki. jakieś przemyślenia na temat przyczyny dlaczego? jest prawie taki sam, z tym wyjątkiem, że w części SERWER używam adresu IP, a nie nazwy. myślisz, że to może być to? wielkie dzięki
Pedro Braz,
14

Jest to minimalny, ale kompletny przykład, jak połączyć się z bazą danych SQL Azure za pomocą isqlUbuntu 14.04.1 LTS. Przykład pochodzi z How To Connect Azure SQL Database From Ubuntu (nota prawna: to moja osobista wiki).

Zainstaluj niezbędne pakiety

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

Skonfiguruj FreeTDS

Plik /etc/freetds/freetds.conf

[global]
tds version = 7.1

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

Testuj połączenie

W tym momencie łączenie się z tsqlpowinno działać:

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

Uwaga, która @<HOST>jest wymagana. W przeciwnym razie połączenie kończy się błędem:

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

Skonfiguruj sterownik ODBC

Plik /etc/odbcinst.ini

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

Skonfiguruj źródła danych ODBC

Plik /etc/odbc.ini

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

<SERVERNAME>jest taki sam jak w freetds.conf.

Połącz się z 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>

Uwaga, która @<HOST>jest wymagana. W przeciwnym razie połączenie kończy się błędem:

[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
użytkownik272735
źródło
Że @<HOST>nie wydaje się być konieczne.
Adrian Keister
7

W moim przypadku problem powstał z powodu prostych wcięć w moim pliku konfiguracyjnym. Więc /etc/odbc.ini, mam usunięte wszystkie wcięcia i voila!

( odbcinst.inizachowuje się jak normalne dziecko i nie wydaje się wywoływać napadów złości).

Sudhanshu
źródło
DZIĘKUJĘ CI! Patrzyłem, że ta konfiguracja przez 2 godziny próbuje odkryć, że problem stanowi biała przestrzeń.
Alex Barker,
3

Ubuntu przed 12.04 miało inną ścieżkę odbc w pliku /etc/odbcinst.ini.

Stara droga kierowca był:

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

Zmieniłem go na adres:

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

Oto pełna konfiguracja:

--- /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

Działa teraz jak urok! Dzięki!

MikeH
źródło
Czy teraz linia instalacyjna jest przestarzała?
Adrian Keister