一尘不染

freeTDS不使用其配置

linux

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

现在一些数据:

  1. 当我ping服务器时-没有任何数据包丢失。
  2. 当我在1433端口上远程登录服务器时-建立连接
  3. 当我使用命令
        TDSVER=7.0 tsql -H >IP< -p 1433 -U username

系统提示我输入密码并建立连接。

  1. 在命令前没有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
  1. 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
  1. 上面给定位置的freetds.conf中包含以下条目:
        [MSSQL]
    host = >IP<
    port = 1433
    tds version = 7.0
  1. 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
  1. 我的odbc.ini:
        [MSSQL]
    Description = MS SQL Server
    Driver = FreeTDS
    TDS_Version = 7.0
    Server = >IP<
    UID = username
    PWD = password
    ReadOnly = No
    Port = 1433

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


阅读 523

收藏
2020-06-02

共1个答案

一尘不染

我今天花了很长时间调试类似的问题。我在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之类的环境变量。

2020-06-02