Conexión de MS SQL mediante freetds y unixodbc: isql: no se especificó ningún controlador predeterminado

28

Estoy tratando de conectarme a la base de datos MS SQL usando freetds y unixodbc . He leído varias guías sobre cómo hacerlo, pero nadie funciona bien para mí. Cuando intento conectarme a la base de datos con la herramienta isql , aparece el siguiente error:

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

¿Alguien ha establecido con éxito la conexión a la base de datos MS SQL usando freetds y unixodbc en Ubuntu 12.04? Realmente agradecería algo de ayuda.

A continuación se muestra el procedimiento que utilicé para configurar los freetds y unixodbc . Gracias de antemano por su ayuda!

Procedimiento

Primero, he instalado los siguientes paquetes con:

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

y freetds configurados de la siguiente manera:

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

Usando la herramienta tsql , puedo conectarme con éxito a la base de datos ejecutando

tsql -S TS -U username -P password

Como necesito un ODBC conexión configuré odbcinst.ini de la siguiente manera:

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

y odbc.ini de la siguiente manera:

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

Intentar conectarse a la base de datos utilizando la herramienta isql con dicha configuración da como resultado el siguiente error:

$ 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
fuente
Para usar tsql:sudo apt-get install freetds-bin
Stevie G

Respuestas:

17

Gracias, tu publicación fue muy útil para mí. Pude hacer que funcionara eliminando las siguientes líneas de mi archivo odbcinst.ini

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

así que ahora mi archivo odbcinst.ini se ve así:

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

y mi archivo odbc.ini se ve así ahora:

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

Una vez que simplifiqué todo, funcionó muy bien. Todavía no puedo hacer que funcione con RODBC pero funcionó con isql.

No sé si esto ayudará, pero tu publicación me ayudó. Gracias.

John Cutsinger
fuente
Gracias, definitivamente relacionado con el controlador perdido en/etc/odbcinst.ini
Dejan
1
Hola, gran respuesta, pero desafortunadamente no pude hacerlo funcionar, a pesar de copiar sus archivos. alguna idea sobre la razón por qué? es más o menos lo mismo, excepto que en la parte del SERVIDOR uso una IP, no un nombre. ¿Crees que podría ser eso? muchas gracias
Pedro Braz
14

Este es un ejemplo mínimo pero completo de cómo conectarse a la Base de datos SQL de Azure con isqlUbuntu 14.04.1 LTS. El ejemplo se extrae de Cómo conectar la base de datos SQL Azure de Ubuntu (descargo de responsabilidad: es mi wiki personal).

Instalar paquetes necesarios

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

Configurar FreeTDS

Archivo /etc/freetds/freetds.conf

[global]
tds version = 7.1

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

Conexión de prueba

En este punto, la conexión con tsqldebería funcionar:

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

Tenga en cuenta que @<HOST>es obligatorio. De lo contrario, la conexión termina con un error:

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

Configurar el controlador ODBC

Archivo /etc/odbcinst.ini

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

Configurar fuentes de datos ODBC

Archivo /etc/odbc.ini

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

<SERVERNAME>es el mismo que en freetds.conf.

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

Tenga en cuenta que @<HOST>es obligatorio. De lo contrario, la conexión termina con un error:

[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
usuario272735
fuente
El @<HOST>ya no parece ser necesario.
Adrian Keister
7

En mi caso, el problema surgió debido a las sangrías simples en mi archivo de configuración. Entonces /etc/odbc.ini, en , eliminé todas las sangrías y listo

(se odbcinst.inicomporta como un niño normal y no parece hacer berrinches).

Sudhanshu
fuente
¡GRACIAS! He estado observando que esta configuración durante 2 horas tratando de descubrir que el espacio en blanco era el problema.
Alex Barker
3

Ubuntu anterior a 12.04 tenía una ruta odbc diferente en el archivo /etc/odbcinst.ini.

El antiguo camino del conductor era:

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

Lo cambié a:

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

Aquí está la configuración 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

¡Funciona como un encanto ahora! ¡Gracias!

MikeH
fuente
¿La línea de instalación está en desuso ahora?
Adrian Keister