我决定使用FreeTDS驱动程序和unixODBC来管理基于LAMP的应用程序与远程MsSQL数据库之间的PDO连接。 不幸的是,驱动程序似乎没有读取freetds.conf文件,也没有直接通过服务器的CLI设置或通过putenv()函数在php文件中指定的环境变量。
现在有些数据:
我使用命令
TDSVER=7.0 tsql -H >IP< -p 1433 -U username
我被提示输入密码并建立连接。
没有命令前面的TDSVER - 连接失败并显示以下消息:
Error 20017 (severity 9):
Unexpected EOF from the server
OS error 115, "Operation now in progress"
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server
tsql -C命令回显了这样一个输出:
Compile-time settings (established with the "configure" script)
Version: freetds v0.91
freetds.conf directory: /usr/local/etc
MS db-lib source compatibility: yes
Sybase binary compatibility: no
Thread safety: yes
iconv library: yes
TDS version: 5.0
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: no
freetds.conf有这个条目:
[MSSQL]
host = >IP<
port = 1433
tds version = 7.0
ISQL也失败了:
isql -v MSSQL
[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:
[MSSQL]
Description = MS SQL Server
Driver = FreeTDS
TDS_Version = 7.0
Server = >IP<
UID = username
PWD = password
ReadOnly = No
Port = 1433
我认为解决方案非常简单,但我找到它太愚蠢......
答案 0 :(得分:23)
我今天花了很长时间调试类似的问题。我在freetds.conf中设置了“TDS版本”,但它没有在我的ODBC连接中使用。在阅读了freetds源代码(connectparams.c:odbc_parse_connect_string)后,我发现:
odbcinst.ini是一只红鲱鱼。 FreeTDS从不检查设置。
始终遵守您在连接字符串中指定的设置。它也始终尊重环境变量,如TDSVER。
答案 1 :(得分:10)
我的直觉是你需要在freetds.conf和odbc.ini文件中将 tds version = 7.0 更改为 tds version = 8.0 并且你需要一些东西你的odbcinst.ini文件。这是我在与远程MSSQL服务器通信的Ubuntu 12.04服务器上工作的内容:
freetds.conf
# Define a connection to the MSSQL server.
[mssql]
host = myserver
port = 1433
tds version = 8.0
ODBC.INI
# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description = MSSQL Server
Driver = freetds
Database = MyDB
ServerName = myserver
TDS_Version = 8.0
ODBCINST.INI
# Define where to find the driver for the Free TDS connections.
[freetds]
Description = MS SQL database access with Free TDS
Driver = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount = 1
答案 2 :(得分:3)
我遇到了同样的问题,但我的配置已经正确设置了。问题是freetds.conf识别的TDS版本在较新版本中已经改变,但显然旧版本仍然在TDSVER环境变量中工作。一旦我将配置文件中的版本设置为7.1而不是8.0,一切都开始工作。
答案 3 :(得分:1)
通过在TDSVER=7.0
文件末尾添加以下内容解决了初始odbc.ini
问题:
[Default]
Driver=/usr/local/lib/libtdsodbc.so
答案 4 :(得分:0)
尝试连接到配置部分的名称,而不是连接到IP?例如:
isql -v MSSQL