freeTDS没有使用它的配置文件

22
我决定使用FreeTDS驱动程序和unixODBC来管理我的基于LAMP的应用程序与远程MsSQL数据库之间的PDO连接。不幸的是,该驱动程序似乎无法读取freetds.conf文件,也无法读取通过服务器CLI直接设置或通过putenv()函数在php文件中指定的环境变量。

现在是一些数据:

  1. 当我ping服务器时 - 没有数据包丢失。
  2. 当我telnet服务器的1433端口时 - 连接已建立
  3. 当我使用命令

    TDSVER=7.0 tsql -H >IP< -p 1433 -U username
    

    我被提示输入密码,连接已建立。

  4. 如果没有TDSVER在命令前 - 连接将失败并出现这样的消息:

  5. 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
    
  6. 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
    
  7. 在上述给定的位置中,freetds.conf 有这个条目:

  8. [MSSQL]
    host = >IP<
    port = 1433
    tds version = 7.0
    
  9. ISQL 也未能成功执行:

  10. 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
    
  11. 我的odbc.ini文件:

  12. [MSSQL]
    Description = MS SQL Server
    Driver = FreeTDS
    TDS_Version = 7.0
    Server = >IP<
    UID = username
    PWD = password
    ReadOnly = No
    Port = 1433
    

    我猜解决方案真的很简单,但是我太蠢了找不到它...


我通过ddg找到了这个问题:“freetds linux not working”,我的问题是我没有明确定义端口。 - bgStack15
5个回答

31

我今天花了很长时间调试一个类似的问题。我在freetds.conf中设置了"TDS版本",但在我的ODBC连接中没有使用它。在阅读freetds源代码(connectparams.c:odbc_parse_connect_string)后,我发现:

  • 如果您的连接字符串使用"SERVER=",则freetds.conf和odbc.ini都将被忽略
  • 如果您的连接字符串使用"SERVERNAME=",则将使用适当freetds.conf服务器中的设置
  • 如果您的连接字符串使用"DSN=",则将使用适当odbc.ini DSN中的设置

odbcinst.ini是一个红鲱鱼。FreeTDS从不检查该文件以获取设置。

您在连接字符串中指定的设置始终受到尊重。它还始终尊重环境变量,如TDSVER。


2
感谢您的研究:它证实了我现在正在努力解决的问题:DBI:ODBC在使用DSN-less连接字符串中的Server=参数时无法读取 /etc/freetds/freetds.conf(并且 strings /usr/lib/odbc/libtdsodbc.so|grep conf 显示库知道如何定位配置文件。运行strace ... -e open ... 也确认没有尝试读取 freetds.conf)。 - kostix
1
这个例子4.3 在这里 证实了你的研究。再次感谢。 - kostix
如果我尝试使用SERVERNAME=...通过PHP连接,那么我会收到错误消息:"SQLSTATE[08001] SQLDriverConnect: 0 [unixODBC][FreeTDS][SQL Server]无法连接到数据源"。只有使用SERVER=...才能正常工作。你知道为什么吗? - kinske
@kinske 我使用 SERVERNAME 时也遇到了同样的错误,而 SERVER 却可以正常工作。 - katalin_2003
1
我正在连接到 HOST=xx.xx.xx.xx,在连接之前我的 PHP 代码需要一个 putenv("TDSVER=8.0"); - Chuck

9
我的直觉告诉我,您需要将您的 tds版本=7.0 更改为 tds版本=8.0 ,并在您的freetds.conf和odbc.ini文件中添加一些内容。同时,您还需要在odbcinst.ini文件中进行设置。以下是我在Ubuntu 12.04服务器上配置连接远程MSSQL服务器的方法:
# 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

非常感谢,我明天上班会尝试应用你的建议。 - khartvin
1
我刚在CentOS 6 64位上复制了这个,但它不起作用。 - shorif2000
有人知道在哪里可以免费获取适用于Mac OS X的MSSQL驱动程序吗? - Carl

5

我遇到了与此完全相同的问题,但我的配置已经正确设置。问题是freetds.conf识别的TDS版本在较新版本中发生了更改,但显然旧版本仍可以在TDSVER环境变量中使用。一旦我将配置文件中的版本设置为7.1而不是8.0,所有内容都开始正常工作。


对我有用!谢谢。经过数小时的测试和搜索,我简直不敢相信只需要这么做就可以让系统运行起来了。 - Jim
我通过在~/.bashrc中设置export TDSDUMP=/temp/freetds.log来调试我的设置,这使得清楚地看到配置文件没有设置tds版本。一旦我设置了环境变量export TDSVER=8.0,一切都正常工作了。 - DragonSpit

1

通过在我的odbc.ini文件末尾添加以下内容,解决了最初的TDSVER=7.0问题:

[Default]
Driver=/usr/local/lib/libtdsodbc.so

0

尝试连接配置部分的名称而不是IP地址?例如:

isql -v MSSQL

你是否也有一个 odbc.ini 文件?请参考 https://dev59.com/NlzUa4cB1Zd3GeqP7uch - Andomar
尝试将 odbc.ini 中的 Server = 10.2.201.2 更改为 Server = MSSQL - Andomar
我非常确定这种行为的原因在于FreeTDS没有使用TDSVER=7.0,而这是Microsoft SQL Server所必需的。 - khartvin
尝试将“TDS_Version”更改为“TDS版本”?虽然它应该从tds配置文件中获取 - Andomar
是的,应该可以,我已经更改了,但结果与之前相同。 - khartvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接