21

FreeTDSドライバーとunixODBCを使用して、LAMPベースのアプリとリモートMsSQLデータベース間のPDO接続を管理することにしました。残念ながら、ドライバーはfreetds.confファイルを読み取らず、サーバーのCLIを介して直接設定された環境変数も、putenv()関数によってphpファイルで指定された環境変数も読み取らないようです。

今いくつかのデータ:

  1. サーバーにpingを実行すると、パケットが失われることはありません。
  2. 1433ポートでサーバーにTelnet接続すると、接続が確立されます
  3. コマンドを使用するとき

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

    パスワードの入力を求められ、接続が確立されます。

  4. コマンドの前に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
    
  5. 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
    
  6. 上記の場所にあるfreetds.confには、次のエントリがあります。

    [MSSQL]
    host = >IP<
    port = 1433
    tds version = 7.0
    
  7. 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
    
  8. 私のodbc.ini:

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

解決策は本当に簡単だと思いますが、私はそれを見つけるにはあまりにも愚かです...

4

5 に答える 5

29

私は今日、同様の問題のデバッグに長い時間を費やしました。freetds.confで「TDSバージョン」を設定しましたが、ODBC接続で使用されていませんでした。freetdsソースコード(connectparams.c:odbc_parse_connect_string)を読んだ後、私は次のことを発見しました。

  • 接続文字列が「SERVER=」を使用している場合、freetds.confとodbc.iniの両方が無視されます
  • 接続文字列で「SERVERNAME=」が使用されている場合は、適切なfreetds.confサーバーの設定が使用されます
  • 接続文字列で「DSN=」が使用されている場合は、適切なodbc.iniDSNの設定が使用されます

odbcinst.iniは赤いニシンです。FreeTDSは、設定についてそれをチェックすることはありません。

接続文字列で指定した設定は常に尊重されます。また、TDSVERのような環境変数も常に尊重します。

于 2013-04-25T16:09:56.560 に答える
9

私の直感では、freetds.confファイルとodbc.iniファイルでtdsバージョン=7.0からtdsバージョン=8.0に変更する必要があり、odbcinst.iniファイルで何かが必要です。リモートMSSQLサーバーと通信しているUbuntu12.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
于 2012-10-25T13:35:03.583 に答える
5

これとまったく同じ問題が発生しましたが、構成はすでに正しく設定されています。問題は、freetds.confが認識するTDSバージョンが新しいバージョンで変更されていることでしたが、明らかに古いバージョンはTDSVER環境変数で引き続き機能します。設定ファイルのバージョンを8.0ではなく7.1に設定すると、すべてが機能し始めました。

于 2013-03-07T15:25:44.790 に答える
1

最初の問題は、ファイルTDSVER=7.0の最後に次を追加することで解決されました。odbc.ini

[Default]
Driver=/usr/local/lib/libtdsodbc.so
于 2013-09-26T13:40:42.743 に答える
0

IPに接続する代わりに、構成セクションの名前に接続してみてください。例えば:

isql -v MSSQL
于 2012-10-25T10:43:56.740 に答える