在 Ubuntu 上使用 isql 连接到 MS SQL 服务器数据库
Connect to MS SQL Server Database Using isql on Ubuntu
最终目标:使用 pyodbc
.
将我的 Xubuntu 16.04 机器连接到远程 MS SQL Server 2017 数据库
中期目标:让 isql
工作; tsql
有效,但 isql
无效。
我尝试在我的 Mac 上镜像设置 - 请参阅 以了解有效的方法。不幸的是,没有快乐。我浏览了许多 SO 问题,例如:
One, Two, and Three,
并尝试了他们的方法,none 其中有效。我确信 Linux 机器打开了正确的端口,因为 tsql
在我的 Xubuntu 16.04 机器上运行。不幸的是,我无法让 isql
工作。我得到了可怕的
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect
错误。同样不幸的是,我看到的许多文档似乎都过时且自相矛盾。例如:
- 在
odbc.ini
文件中,它应该是 Server = stuff, 1433
或 Server = stuff
或 ServerName = stuff
并带有单独的 port =
行,还是我应该使用 instance
?选项太多,但没有足够的文档来解决这个问题。
odbcinst.ini
文件中究竟应该包含什么?我在 /usr/lib/x86_64-linux-gnu/odbc
目录中没有 libtdsS.so
文件。我应该省略设置行吗?
freetds.conf
文件中究竟应该包含什么?我应该使用实际的 IP 地址吗?
- 如果我想强制 FreeTDS 使用特定的协议版本,我该怎么做?更改
freetds.conf
似乎不会影响 tsql -C
的结果。还是我只需要注销并重新登录?
- 退后一步:是否有更好的方法来处理整个该死的事情?我对
pymssql
不感兴趣,因为它现在似乎是废弃软件,支持 pyodbc
.
- 我注意到
tsql -LH stuff
命令没有输出。该命令是否已弃用?或者我怎样才能从任何命令获得正确的设置?
- 是否有最新、清晰的文档随处可用?还是任何地方的最新、清晰的安装和使用指南,以及针对更常见问题的故障排除步骤?
非常感谢您的宝贵时间!
[编辑] 以下是启用后跟踪日志的内容:
[ODBC][34479][1567549751.158470][__handles.c][460]
Exit:[SQL_SUCCESS]
Environment = 0x1913750
[ODBC][34479][1567549751.158517][SQLAllocHandle.c][377]
Entry:
Handle Type = 2
Input Handle = 0x1913750
[ODBC][34479][1567549751.158532][SQLAllocHandle.c][493]
Exit:[SQL_SUCCESS]
Output Handle = 0x1914060
[ODBC][34479][1567549751.158551][SQLConnect.c][3721]
Entry:
Connection = 0x1914060
Server Name = [ROEFDN806Q][length = 10 (SQL_NTS)]
User Name = [mfad\m210028][length = 12 (SQL_NTS)]
Authentication = [********][length = 8 (SQL_NTS)]
[ODBC][34479][1567549751.158987][SQLConnect.c][3929]Error: IM002
[ODBC][34479][1567549751.159017][SQLError.c][424]
Entry:
Connection = 0x1914060
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159034][SQLError.c][474]
Exit:[SQL_SUCCESS]
SQLState = IM002
Native = 0x7ffd099daf0c -> 0
Message Text = [[unixODBC][Driver Manager]Data source name not found and no default driver specified]
[ODBC][34479][1567549751.159066][SQLError.c][424]
Entry:
Connection = 0x1914060
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159079][SQLError.c][474]
Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159089][SQLError.c][424]
Entry:
Environment = 0x1913750
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159099][SQLError.c][474]
Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159130][SQLFreeHandle.c][290]
Entry:
Handle Type = 2
Input Handle = 0x1914060
[ODBC][34479][1567549751.159144][SQLFreeHandle.c][339]
Exit:[SQL_SUCCESS]
[ODBC][34479][1567549751.159156][SQLFreeHandle.c][220]
Entry:
Handle Type = 1
Input Handle = 0x1913750
这是我当前的 odbc.ini
文件:
[ROEFDN806Q]
Description = "EOAM_RA Server"
Driver = FreeTDS
ServerName = ROEFDN806Q
Server = 10.146.186.7
Port = 1433
Database = EOAM_RA
UsageCount = 1
TDS_Version = 7.3
这是我的 odbcinst.ini
文件:
[FreeTDS]
Description = "FreeTDS ODBC Driver"
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
[ODBC]
Trace = yes
TraceFile = /tmp/odbctrace.txt
Microsoft 的 "ODBC Driver 17 for SQL Server" 是连接到 SQL 服务器的首选驱动程序。但是,如果您需要将 Windows 凭据从 Linux 框传递到 SQL 服务器实例,那么您实际上需要使用 FreeTDS,至少现在是这样。
我们通过
获得所需的组件
sudo apt install tdsodbc unixodbc
然后我们使用sudo nano -w /etc/odbcinst.ini
创建一个这样的条目:
[FreeTDS]
DESCRIPTION=FreeTDS ODBC driver
DRIVER=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
接下来我们使用 sudo nano -w /etc/odbc.ini
创建一个条目,如下所示:
[SQLServer01]
DRIVER=FreeTDS
SERVER=192.168.0.179
PORT=49242
DATABASE=myDb
TDS_Version=7.2
最后,我们可以通过 isql 连接(注意双反斜杠):
isql SQLServer01 mydomain\myusername mypassword
最终目标:使用 pyodbc
.
中期目标:让 isql
工作; tsql
有效,但 isql
无效。
我尝试在我的 Mac 上镜像设置 - 请参阅 tsql
在我的 Xubuntu 16.04 机器上运行。不幸的是,我无法让 isql
工作。我得到了可怕的
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect
错误。同样不幸的是,我看到的许多文档似乎都过时且自相矛盾。例如:
- 在
odbc.ini
文件中,它应该是Server = stuff, 1433
或Server = stuff
或ServerName = stuff
并带有单独的port =
行,还是我应该使用instance
?选项太多,但没有足够的文档来解决这个问题。 odbcinst.ini
文件中究竟应该包含什么?我在/usr/lib/x86_64-linux-gnu/odbc
目录中没有libtdsS.so
文件。我应该省略设置行吗?freetds.conf
文件中究竟应该包含什么?我应该使用实际的 IP 地址吗?- 如果我想强制 FreeTDS 使用特定的协议版本,我该怎么做?更改
freetds.conf
似乎不会影响tsql -C
的结果。还是我只需要注销并重新登录? - 退后一步:是否有更好的方法来处理整个该死的事情?我对
pymssql
不感兴趣,因为它现在似乎是废弃软件,支持pyodbc
. - 我注意到
tsql -LH stuff
命令没有输出。该命令是否已弃用?或者我怎样才能从任何命令获得正确的设置? - 是否有最新、清晰的文档随处可用?还是任何地方的最新、清晰的安装和使用指南,以及针对更常见问题的故障排除步骤?
非常感谢您的宝贵时间!
[编辑] 以下是启用后跟踪日志的内容:
[ODBC][34479][1567549751.158470][__handles.c][460]
Exit:[SQL_SUCCESS]
Environment = 0x1913750
[ODBC][34479][1567549751.158517][SQLAllocHandle.c][377]
Entry:
Handle Type = 2
Input Handle = 0x1913750
[ODBC][34479][1567549751.158532][SQLAllocHandle.c][493]
Exit:[SQL_SUCCESS]
Output Handle = 0x1914060
[ODBC][34479][1567549751.158551][SQLConnect.c][3721]
Entry:
Connection = 0x1914060
Server Name = [ROEFDN806Q][length = 10 (SQL_NTS)]
User Name = [mfad\m210028][length = 12 (SQL_NTS)]
Authentication = [********][length = 8 (SQL_NTS)]
[ODBC][34479][1567549751.158987][SQLConnect.c][3929]Error: IM002
[ODBC][34479][1567549751.159017][SQLError.c][424]
Entry:
Connection = 0x1914060
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159034][SQLError.c][474]
Exit:[SQL_SUCCESS]
SQLState = IM002
Native = 0x7ffd099daf0c -> 0
Message Text = [[unixODBC][Driver Manager]Data source name not found and no default driver specified]
[ODBC][34479][1567549751.159066][SQLError.c][424]
Entry:
Connection = 0x1914060
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159079][SQLError.c][474]
Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159089][SQLError.c][424]
Entry:
Environment = 0x1913750
SQLState = 0x7ffd099daf10
Native = 0x7ffd099daf0c
Message Text = 0x7ffd099daf20
Buffer Length = 500
Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159099][SQLError.c][474]
Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159130][SQLFreeHandle.c][290]
Entry:
Handle Type = 2
Input Handle = 0x1914060
[ODBC][34479][1567549751.159144][SQLFreeHandle.c][339]
Exit:[SQL_SUCCESS]
[ODBC][34479][1567549751.159156][SQLFreeHandle.c][220]
Entry:
Handle Type = 1
Input Handle = 0x1913750
这是我当前的 odbc.ini
文件:
[ROEFDN806Q]
Description = "EOAM_RA Server"
Driver = FreeTDS
ServerName = ROEFDN806Q
Server = 10.146.186.7
Port = 1433
Database = EOAM_RA
UsageCount = 1
TDS_Version = 7.3
这是我的 odbcinst.ini
文件:
[FreeTDS]
Description = "FreeTDS ODBC Driver"
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
[ODBC]
Trace = yes
TraceFile = /tmp/odbctrace.txt
Microsoft 的 "ODBC Driver 17 for SQL Server" 是连接到 SQL 服务器的首选驱动程序。但是,如果您需要将 Windows 凭据从 Linux 框传递到 SQL 服务器实例,那么您实际上需要使用 FreeTDS,至少现在是这样。
我们通过
获得所需的组件sudo apt install tdsodbc unixodbc
然后我们使用sudo nano -w /etc/odbcinst.ini
创建一个这样的条目:
[FreeTDS]
DESCRIPTION=FreeTDS ODBC driver
DRIVER=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
接下来我们使用 sudo nano -w /etc/odbc.ini
创建一个条目,如下所示:
[SQLServer01]
DRIVER=FreeTDS
SERVER=192.168.0.179
PORT=49242
DATABASE=myDb
TDS_Version=7.2
最后,我们可以通过 isql 连接(注意双反斜杠):
isql SQLServer01 mydomain\myusername mypassword