2

这个真的开始难倒我了。我正在运行 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 中的服务器名称。

完成此检查后,我可以通过 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 中找到服务器名称,这可能会也可能不会导致我无法执行来自 ISQL 或 ROBC 的任何命令。我开始怀疑这些问题是不相交的,但任何帮助将不胜感激。

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

4

1 回答 1

3

我花了很长时间来正确配置带有 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 不能一起玩得更好。

于 2014-07-18T13:53:06.990 回答