使用FreeTDS和UnixODBC。能够连接但不能执行来自isql或RODBC的任何SQL命令

时间:2014-07-18 12:49:02

标签: sql-server freetds unixodbc isql osql

这个真的开始让我感到困惑。我正在运行Ubuntu 12.04并且正在尝试连接到运行MS SQL server 2012的盒子。首先,我将提供有关我的设置的一些信息:

我的freetds.conf:

[EXNAME]
    host = IP
    port = 1433
    tds version = 7.0
    client charset = UTF-8

在设置我的freetds.conf后,我首先用tsql测试我的连接,这产生了预期的(和欢迎的)提示符:

 ...
 using default charset "UTF-8"
 1> 

所以我的FreeTDS设置似乎正常。接下来我设置odbc.ini和obdcinst.ini:

ODBC.INI:

 [EXNAME]
 Driver = FreeTDS
 ServerName = EXNAME
 UID = Me
 PWD = Pass

ODBCINST.INI:

 [FreeTDS]
 Description = FreeTDS Driver
 Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
 Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
 UsageCount = 1

按照此设置,我运行osql进行检查。它输出所有预期的响应,它能够在ondcb.ini中找到驱动程序和正确的段落,例如:

 [EXNAME] found in /etc/odbc.ini
 found this section:
     [EXNAME]
     Driver = FreeTDS
     ServerName = EXNAME
     UID = Me
     PWD = Pass

     looking for driver for DSN [EXNAME] in /etc/odbc.ini
     found driver line: "   Driver = FreeTDS"

依此类推:

     DSN [EXNAME] has servername "" (from /etc/odbc.ini)

osql似乎没有检测到odbc.ini中的servername。

执行此检查后,我可以通过isql连接,但我无法运行任何SQL命令。我收到以下错误:

 SQL> SELECT name FROM master..sysdatabases;
 [37000][unixODBC][FreeTDS][SQL Server]Could not find stored procedure 'SELECT'.
 [ISQL]ERROR: Could not SQLExecute

我尝试了什么:

A。)几乎所有配置和命名约定都可以通过freetds.conf和两个.ini文件来考虑。发布更改我执行上述相同的测试并得出相同的结果

B。)在isql之外重现错误。 ROBC给了我完全相同的错误。当然,这是预期的,但我想为什么不

C。)除MS SQL Server之外的SQL变体。我想,如果有人误通知我,我也尝试了一些MySQL命令。这可能是一个SQL问题,但我不确定。

D。)我最接近发现osql吐出的类似错误(我猜)结果是here。正如上一篇文章中所建议的那样,问题,至少就与osql的响应有关,可能与awk有关。正如所建议的那样,我通过创建变量并尝试解析服务器名来测试awk

$ SERVER_LINE='ServerName = SERVER'
$ echo ${SERVER_LINE} | awk -F '=[[:space:]]*' '{print $2}'

这应该导致SERVER,但我得到“”。

这就是我的全部。总之,OSQL似乎无法在odbc.ini中找到servername,这可能会也可能不会导致我无法执行来自ISQL或ROBC的任何命令。我开始怀疑这些问题是不相交的,但任何帮助都会非常感激。

修改:2014年7月31日 这一切都有效。除了我强调的内容之外,还有一些其他问题正在发生。我最终不得不在Mac和Linux机器上设置类似的连接。以下是两者的说明: http://www.joecjr.com/2014/07/27/install-and-use-freetds-unixodbc-and-rodbc-or-pyodbc/

1 个答案:

答案 0 :(得分:1)

我花了很长时间才能用TDS正确配置unixODBC,但是为了它的价值,这套说明是我的拯救恩典,最终让我的工作得以实现:

http://www.unixodbc.org/doc/FreeTDS.html

特别注意引用此命令的第二个:

odbcinst -i -s -f tds.datasource.template 

这是我最大的问题所在。发生了什么事我是以root身份执行此操作(这很好),但如果仔细阅读,则表明使用该驱动程序的每个用户都必须运行此命令才能注册'用户ID的连接。一旦我在每个其他用户下运行相同的命令,一切正常(因为我的实际代码不以root身份运行)。

另一个想法......一个快速简单的测试,看看连接是否真的与TDS一起使用(甚至在你尝试ODBC之前)是运行bcp并导出一个非常小的表。

尝试这样的事情,只是为了排除TDS安装问题。

freebcp <database>.dbo.<tablename> out $HOME/foo.out -c -t '|' \
    -S <hostname>:<port> -U <userid> -P <password>

很遗憾,微软和Unix不能在一起玩得更好。