Kết nối MS SQL bằng freetds và unixodbc: isql - không có trình điều khiển mặc định được chỉ định


28

Tôi cố gắng để kết nối với cơ sở dữ liệu MS SQL sử dụng freetdsunixodbc . Tôi đã đọc các hướng dẫn khác nhau để làm điều đó, nhưng không ai làm việc tốt cho tôi. Khi tôi cố gắng kết nối với cơ sở dữ liệu bằng công cụ isql , tôi gặp lỗi sau:

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

Đã ai đã thiết lập thành công kết nối đến cơ sở dữ liệu MS SQL sử dụng freetdsunixodbc trên Ubuntu 12.04? Tôi thực sự sẽ đánh giá cao sự giúp đỡ.

Dưới đây là thủ tục tôi đã sử dụng để cấu hình các freetdsunixodbc . Cảm ơn vì sự giúp đỡ của bạn trước đó!

Thủ tục

Đầu tiên, tôi đã cài đặt các gói sau với:

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

và cấu hình freetds như sau:

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

Sử dụng công cụ tsql Tôi có thể kết nối thành công với cơ sở dữ liệu bằng cách thực thi

tsql -S TS -U username -P password

Khi tôi cần kết nối odbc, tôi đã cấu hình odbcinst.ini như sau:

--- /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 như sau:

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

Cố gắng kết nối với cơ sở dữ liệu bằng công cụ isql với cấu hình như vậy sẽ xảy ra lỗi sau:

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

Để sử dụng tsql:sudo apt-get install freetds-bin
Stevie G

Câu trả lời:


17

Cảm ơn, bài viết của bạn rất hữu ích cho tôi. Tôi đã có thể làm cho nó hoạt động bằng cách loại bỏ các dòng sau khỏi tệp odbcinst.ini của tôi

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

vì vậy bây giờ tập tin odbcinst.ini của tôi trông như thế này:

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

và tập tin odbc.ini của tôi trông như thế này ngay bây giờ:

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

Khi tôi đơn giản hóa mọi thứ, nó hoạt động rất tốt. Tôi vẫn không thể làm cho nó hoạt động với RODBC nhưng nó hoạt động với isql.

Tôi không biết nếu điều này sẽ giúp nhưng bài viết của bạn đã giúp tôi. Cảm ơn.


Cảm ơn, chắc chắn có liên quan đến tài xế mất tích trong/etc/odbcinst.ini
Dejan

1
Xin chào câu trả lời tuyệt vời nhưng thật không may, tôi không thể làm cho nó hoạt động, mặc dù sao chép các tập tin của bạn. bất kỳ suy nghĩ về lý do tại sao? Nó khá giống nhau, ngoại trừ trên phần SERVER tôi sử dụng IP không phải là tên. Bạn có nghĩ rằng đó có thể là nó? cảm ơn rất nhiều
Pedro Braz

14

Đây là một ví dụ tối thiểu nhưng đầy đủ về cách kết nối với Cơ sở dữ liệu Azure SQL với isqltừ Ubuntu 14.04.1 LTS. Ví dụ được trích xuất từ Cách kết nối cơ sở dữ liệu SQL Azure từ Ubuntu (từ chối trách nhiệm: đó là wiki cá nhân của tôi).

Cài đặt các gói cần thiết

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

Cấu hình FreeTDS

Tập tin /etc/freetds/freetds.conf

[global]
tds version = 7.1

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

Kiểm tra kết nối

Tại thời điểm này kết nối với tsqlnên hoạt động:

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

Lưu ý rằng @<HOST>là bắt buộc. Nếu không, kết nối kết thúc với một lỗi:

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

Định cấu hình trình điều khiển ODBC

Tập tin /etc/odbcinst.ini

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

Định cấu hình nguồn dữ liệu ODBC

Tập tin /etc/odbc.ini

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

<SERVERNAME>là giống nhau hơn trong freetds.conf.

Kết nối với 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>

Lưu ý rằng @<HOST>là bắt buộc. Nếu không, kết nối kết thúc với một lỗi:

[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

Các @<HOST>xuất hiện không còn được yêu cầu.
Adrian Keister

7

Trong trường hợp của tôi, vấn đề phát sinh do các thụt lề đơn giản trong tệp cấu hình của tôi. Vì vậy /etc/odbc.ini, tôi đã loại bỏ tất cả các vết lõm và voila!

( odbcinst.inicư xử như một đứa trẻ bình thường và dường như không nổi cơn thịnh nộ nào.)


CẢM ƠN BẠN! Tôi đã nhìn chằm chằm rằng cấu hình này trong 2 giờ cố gắng tìm ra rằng khoảng trắng là vấn đề.
Alex Barker

3

Ubuntu trước ngày 12.04 có đường dẫn odbc khác trong tệp /etc/odbcinst.ini.

Con đường lái xe cũ là:

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

Tôi đã đổi nó thành:

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

Đây là cấu hình đầy đủ:

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

Làm việc giống như một nét duyên dáng bây giờ! Cảm ơn!


Là dòng thiết lập không dùng nữa, bây giờ?
Adrian Keister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.