Connettere MS SQL usando freetds e unixodbc: isql - nessun driver predefinito specificato


28

Sto provando a connettermi al database MS SQL usando freetds e unixodbc . Ho letto varie guide su come farlo, ma nessuno funziona bene per me. Quando provo a connettermi al database usando lo strumento isql , ottengo il seguente errore:

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

Qualcuno ha già stabilito con successo la connessione al database MS SQL usando freetds e unixodbc su Ubuntu 12.04? Gradirei davvero un aiuto.

Di seguito è la procedura che ho usato per configurare i freetds e unixodbc . Grazie per il vostro aiuto in anticipo!

Procedura

Innanzitutto, ho installato i seguenti pacchetti con:

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

e le libertà configurate come segue:

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

Utilizzando lo strumento tsql riesco a connettermi con successo al database eseguendo

tsql -S TS -U username -P password

Poiché ho bisogno di una connessione odbc , ho configurato odbcinst.ini come segue:

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

e odbc.ini come segue:

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

Tentare di connettersi al database utilizzando lo strumento isql con tale configurazione provoca il seguente errore:

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

Per usare tsql:sudo apt-get install freetds-bin
Stevie G

Risposte:


17

Grazie, il tuo post è stato molto utile per me. Sono stato in grado di farlo funzionare eliminando le seguenti righe dal mio file odbcinst.ini

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

quindi ora il mio file odbcinst.ini è simile al seguente:

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

e il mio file odbc.ini è simile a questo ora:

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

Una volta semplificato tutto ha funzionato alla grande. Non riesco ancora a farlo funzionare con RODBC ma ha funzionato con isql.

Non so se questo aiuterà, ma il tuo post mi ha aiutato. Grazie.


Grazie, sicuramente legato al driver mancante in/etc/odbcinst.ini
Dejan,

1
Ehi, ottima risposta, ma sfortunatamente non sono riuscito a farlo funzionare, anche se ho copiato i tuoi file. qualche pensiero sul motivo per cui? è praticamente lo stesso, tranne per il fatto che nella parte SERVER uso un IP non un nome. pensi che potrebbe essere? grazie mille
Pedro Braz,

14

Questo è un esempio minimo ma completo di come connettersi al database SQL di Azure con isqlUbuntu 14.04.1 LTS. L'esempio è estratto da Come collegare il database SQL di Azure da Ubuntu (dichiarazione di non responsabilità: è il mio wiki personale).

Installa i pacchetti necessari

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

Configura FreeTDS

File /etc/freetds/freetds.conf

[global]
tds version = 7.1

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

Test di connessione

A questo punto il collegamento con tsqldovrebbe funzionare:

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

Si noti che @<HOST>è richiesto. Altrimenti la connessione termina con un errore:

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

Configurare il driver ODBC

File /etc/odbcinst.ini

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

Configurare le origini dati ODBC

File /etc/odbc.ini

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

<SERVERNAME>è lo stesso di in freetds.conf.

Connettiti con 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>

Si noti che @<HOST>è richiesto. Altrimenti la connessione termina con un errore:

[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

I @<HOST>non sembra più essere necessaria.
Adrian Keister,

7

Nel mio caso il problema è sorto a causa di semplici rientri nel mio file di configurazione. Quindi /etc/odbc.ini, ho rimosso tutti i rientri e voilà!

(si odbcinst.inicomporta come un bambino normale e non sembra fare i capricci.)


GRAZIE! Ho fissato che questa configurazione per 2 ore ha cercato di capire che il problema era lo spazio bianco.
Alex Barker,

3

Ubuntu precedente alla 12.04 aveva un percorso odbc diverso nel file /etc/odbcinst.ini.

Il vecchio percorso del conducente era:

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

L'ho cambiato in:

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

Ecco la configurazione completa:

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

Funziona come un fascino ora! Grazie!


La riga di installazione è obsoleta, ora?
Adrian Keister,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.