freeTDS not using its config
Asked Answered
K

5

23

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...

Kozhikode answered 25/10, 2012 at 10:35 Comment(1)
I found this question via ddg: "freetds linux not working," and my problem was I did not have the port specifically defined.Pickaxe
G
31

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.

Gouge answered 25/4, 2013 at 16:9 Comment(5)
Thanks for the research: it confirms what I was bashing my head against just now: DBI:ODBC not reading /etc/freetds/freetds.conf when I'm using the Server= parameter in my DSN-less connection string (and strings /usr/lib/odbc/libtdsodbc.so|grep conf showing the library knows where to locate the config file. Running strace ... -e open ... also confirmed no freetds.conf is attempted to be read.Lovell
And example 4.3 here confirms your research. Thanks again.Lovell
If I try to connect via PHP with SERVERNAME=... then I get the error: "SQLSTATE[08001] SQLDriverConnect: 0 [unixODBC][FreeTDS][SQL Server]Unable to connect to data source" It only works with SERVER=... Any idea why?Rhee
@Rhee I get the same error with SERVERNAME, while SERVER works.Goop
I am connecting with HOST=xx.xx.xx.xx and needed a putenv("TDSVER=8.0"); in my PHP code before connect.Norinenorita
P
9

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
Presage answered 25/10, 2012 at 13:35 Comment(3)
thanks a lot man, i will try to apply your suggestions as i will be @ work tomorrowKozhikode
i just copied this on centos 6 64bit. it does not workReassure
Anyone have any ideas where to get MSSQL drivers for Mac OS X for FreeTDS?Schweinfurt
N
5

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.

Norris answered 7/3, 2013 at 15:25 Comment(2)
WORKED FOR ME! Thanks. After hours of testing and googling I couldn't believe this is all that it took to get the system up and running.Spousal
I debugged my setup thru export TDSDUMP=/temp/freetds.log in ~/.bashrc, which made it clear that the tds version was not being set by the config file. Once I set the environment variable export TDSVER=8.0 everything worked.Wen
K
1

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
Kneedeep answered 26/9, 2013 at 13:40 Comment(0)
D
0

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

isql -v MSSQL
Deweydewhirst answered 25/10, 2012 at 10:43 Comment(5)
Do you also have an odbc.ini ? See #8010861Deweydewhirst
Try to change Server = 10.2.201.2 in odbc.ini to Server = MSSQL ?Deweydewhirst
i'm pretty sure the reason for that behaviour is in the fact that FreeTDS doesn't use TDSVER=7.0, which is required for Microsoft's SQL ServersKozhikode
Try to change TDS_Version to TDS Version? Though it should have picked that up from the tds config fileDeweydewhirst
yes it should, i changed, but the result is the same as before.Kozhikode

© 2022 - 2024 — McMap. All rights reserved.