Conectando o MS SQL usando freetds e unixodbc: isql - nenhum driver padrão especificado

28

Estou tentando conectar ao banco de dados MS SQL usando freetds e unixodbc . Eu li vários guias sobre como fazê-lo, mas ninguém funciona bem para mim. Quando tento conectar-me ao banco de dados usando a ferramenta isql , recebo o seguinte erro:

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

Alguém já estabeleceu com sucesso a conexão com o banco de dados MS SQL usando freetds e unixodbc no Ubuntu 12.04? Eu realmente aprecio alguma ajuda.

Abaixo está o procedimento que eu usei para configurar os freetds e o unixodbc . Agradecemos desde já a sua ajuda!

Procedimento

Primeiro, instalei os seguintes pacotes com:

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

e freetds configurados da seguinte maneira:

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

Usando a ferramenta tsql , eu posso conectar com sucesso ao banco de dados executando

tsql -S TS -U username -P password

Como preciso de uma conexão odbc , configurei o odbcinst.ini da seguinte maneira:

--- /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 da seguinte maneira:

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

Tentar conectar-se ao banco de dados usando a ferramenta isql com essa configuração resulta no seguinte erro:

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

Respostas:

17

Obrigado, sua postagem foi muito útil para mim. Consegui fazê-lo funcionar, eliminando as seguintes linhas do meu arquivo odbcinst.ini

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

agora meu arquivo odbcinst.ini está assim:

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

e meu arquivo odbc.ini se parece com isso agora:

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

Uma vez que simplifiquei tudo, funcionou muito bem. Ainda não consigo fazê-lo funcionar com o RODBC, mas funcionou com o isql.

Não sei se isso vai ajudar, mas sua postagem me ajudou. Obrigado.

John Cutsinger
fonte
Obrigado, definitivamente relacionadas à falta de motorista em/etc/odbcinst.ini
Dejan
1
Ei, ótima resposta, mas infelizmente não consegui fazê-lo funcionar, apesar de copiar seus arquivos. algum pensamento sobre o motivo? é praticamente o mesmo, exceto que na parte SERVER eu uso um IP e não um nome. você acha que poderia ser isso? thanks a lot
Pedro Braz
14

Este é um exemplo mínimo, mas completo, de como se conectar ao Banco de Dados SQL do Azure com o isqlUbuntu 14.04.1 LTS. O exemplo é extraído de Como conectar o banco de dados SQL do Azure a partir do Ubuntu (isenção de responsabilidade: é meu wiki pessoal).

Instale os pacotes necessários

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

Configurar o FreeTDS

Arquivo /etc/freetds/freetds.conf

[global]
tds version = 7.1

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

Conexão de teste

Neste ponto, a conexão com tsqldeve funcionar:

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

Observe que @<HOST>é necessário. Caso contrário, a conexão termina com um erro:

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 driver ODBC

Arquivo /etc/odbcinst.ini

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

Configurar fontes de dados ODBC

Arquivo /etc/odbc.ini

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

<SERVERNAME>é o mesmo que em freetds.conf.

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

Observe que @<HOST>é necessário. Caso contrário, a conexão termina com um erro:

[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
fonte
Os @<HOST>aparece já não ser necessário.
Adrian Keister
7

No meu caso, o problema surgiu por causa de simples recuos no meu arquivo de configuração. Então /etc/odbc.ini, tirei todos os recuos e pronto!

( odbcinst.inise comporta como uma criança normal e não parece ter birras.)

Sudhanshu
fonte
OBRIGADO! Eu estive olhando que essa configuração por 2 horas tentando descobrir que o espaço em branco era o problema.
Alex Barker
3

O Ubuntu anterior à 12.04 tinha um caminho odbc diferente no arquivo /etc/odbcinst.ini.

O caminho do driver antigo era:

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

Eu mudei para:

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

Aqui está a configuração 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 perfeitamente agora! Obrigado!

MikeH
fonte
A linha de instalação está obsoleta agora?
Adrian Keister