web-dev-qa-db-ja.com

freeTDSはその構成を使用していません

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
    

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

17
khartvin

今日、私は同じような問題のデバッグに長い時間を費やしました。 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などの環境変数を常に尊重します。

24
Max Bolingbroke

私の本能は、あなたが変える必要がある tdsバージョン= 7.0 に tdsバージョン= 8.0 freetds.confおよびodbc.iniファイルにあり、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
10
Benny Hill

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

4
jmsq

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

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

IPに接続する代わりに、構成セクションの名前に接続してみますか?例えば:

isql -v MSSQL
0
Andomar