freeTDS not using its config

2019-01-10 19:52发布

I've decided to use FreeTDS driver and unixODBC to manage the PDO connection between my LAMP-based app with a remote MsSQL database. unfortunately it appears that the driver doesn't read the freetds.conf file, nor the environmental variables set either directly via server's CLI or specified in php file by putenv() function.

now some data:

  1. as I ping the server - no packets are lost.
  2. as I telnet the server on 1433 port - the connection is established
  3. as I use the command

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

    I am prompted to enter password and connection is established.

  4. without the TDSVER preceding the command - the connection fails with such a message:

    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. the tsql -C commands echos such an output:

    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 in the location given above has this entry:

    [MSSQL]
    host = >IP<
    port = 1433
    tds version = 7.0
    
  7. the ISQL also fails:

    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. my odbc.ini :

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

I suppose the solution is really simple, but i'm just too stupid to find it...

5条回答
做个烂人
2楼-- · 2019-01-10 20:02

The initial TDSVER=7.0 issue was resolved by adding the following at the end of my odbc.ini file:

[Default]
Driver=/usr/local/lib/libtdsodbc.so
查看更多
唯我独甜
3楼-- · 2019-01-10 20:08

I experienced this exact same problem, but my config was already correctly set up. The problem was that the TDS versions that freetds.conf recognizes has changed in newer versions, but apparently the old versions still work in the TDSVER environment variable. Once I set the version in the config files to 7.1 rather than 8.0 everything started working.

查看更多
Root(大扎)
4楼-- · 2019-01-10 20:10

I spent a long time today debugging a similar problem. I had set "TDS version" in freetds.conf but it was not being used in my ODBC connection. After reading the freetds source code (connectparams.c:odbc_parse_connect_string) I discovered that:

  • If your connection string uses "SERVER=" then both freetds.conf and odbc.ini are ignored
  • If your connection string uses "SERVERNAME=" then the settings in the appropriate freetds.conf server are used
  • If your connection string uses "DSN=" then the settings in the appropriate odbc.ini DSN are used

odbcinst.ini is a red herring. FreeTDS never checks that for settings.

The settings you specify in the connection string are always respected. It also always respects the environment variables like TDSVER.

查看更多
在下西门庆
5楼-- · 2019-01-10 20:12

Instead of connecting to an IP, try to connect to the name of the configuration section? For example:

isql -v MSSQL
查看更多
戒情不戒烟
6楼-- · 2019-01-10 20:18

My gut instinct is you need to change your tds version = 7.0 to tds version = 8.0 in your freetds.conf and odbc.ini files AND you need something in your odbcinst.ini file. Here's what I've got working on an Ubuntu 12.04 server talking to a remote MSSQL server:

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
查看更多
登录 后发表回答