这个真的开始让我感到困惑。我正在运行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/
答案 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不能在一起玩得更好。