freeTDS not using its config
Solution 1
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.
Solution 2
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
Solution 3
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.
Solution 4
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
khartvin
Updated on July 09, 2022Comments
-
khartvin almost 2 years
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:
- as I ping the server - no packets are lost.
- as I telnet the server on 1433 port - the connection is established
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.
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
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
freetds.conf in the location given above has this entry:
[MSSQL] host = >IP< port = 1433 tds version = 7.0
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
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...
-
Andomar over 11 yearsDo you also have an
odbc.ini
? See stackoverflow.com/questions/8010361/… -
Andomar over 11 yearsTry to change
Server = 10.2.201.2
inodbc.ini
toServer = MSSQL
? -
khartvin over 11 yearsi'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 Servers
-
Andomar over 11 yearsTry to change
TDS_Version
toTDS Version
? Though it should have picked that up from the tds config file -
khartvin over 11 yearsyes it should, i changed, but the result is the same as before.
-
khartvin over 11 yearsthanks a lot man, i will try to apply your suggestions as i will be @ work tomorrow
-
kostix over 10 yearsThanks 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 theServer=
parameter in my DSN-less connection string (andstrings /usr/lib/odbc/libtdsodbc.so|grep conf
showing the library knows where to locate the config file. Runningstrace ... -e open ...
also confirmed nofreetds.conf
is attempted to be read. -
kostix over 10 yearsAnd example 4.3 here confirms your research. Thanks again.
-
kinske over 10 yearsIf 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?
-
shorif2000 about 10 yearsi just copied this on centos 6 64bit. it does not work
-
Jim almost 10 yearsWORKED 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.
-
Carl over 9 yearsAnyone have any ideas where to get MSSQL drivers for Mac OS X for FreeTDS?
-
katalin_2003 about 8 years@kinske I get the same error with
SERVERNAME
, whileSERVER
works. -
Chuck almost 7 yearsI am connecting with
HOST=xx.xx.xx.xx
and needed aputenv("TDSVER=8.0");
in my PHP code before connect. -
DragonSpit almost 5 yearsI 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 variableexport TDSVER=8.0
everything worked.