1

注意:这是转发。由于未公开的原因,此问题之前已被删除

好的,我一直在努力让它像一整天一样工作,而我离开始的时候几乎没有任何进展。

我正在尝试让 Ruby On Rails 连接到 SQL Server。我已经安装并配置了 unixODBC 和 FreeTDS,并安装了几乎所有与存在的 ODBC 相关的 Ruby gem。

这已更新以显示带有 -v 的 isql 的输出)

[earlz@earlzarch myproject]$ tsql -S AVP1 -U sa -P pass
locale is "en_US.UTF-8"
locale charset is "UTF-8"
1> quit
[earlz@earlzarch ~]$ isql -v AVP1 sa pass
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect
[earlz@earlzarch myproject]$ rake db:version
(in /home/earlz/myproject)
rake aborted!
IM002 (0) [unixODBC][Driver Manager]Data source name not found, and no default driver specified

(See full trace by running task with --trace)

因此,如您所见,tsql 有效,但 isql 无效。打破它的两者有什么区别?

/etc/odbc.ini

[AVP1]
      Description     = ODBC connection via FreeTDS
      Driver = TDS
      Servername      = my.server
      UID = sa
      PWD = pass
      port = 1232
      Database        = mydatabase

/etc/odbcinst.ini

[TDS]
     Description     = v0.6 with protocol v7.0
     Driver          = /usr/lib/libtdsodbc.so
     Setup           = /usr/lib/libtdsS.so
     CPTimeout       =
     CPReuse         =
     FileUsage       = 1

(是的,我已确保.so文件存在)

freetds.conf 中的相关部分

[AVP1]
      host = my.server
      port = 1232
      tds version = 8.0

最后,我的 database.yml

development:
    adapter: sqlserver
    mode: odbc
    dsn: AVP1
    username: sa
    password: pass

在我拔掉所有头发之前,有人可以帮我吗?

我使用的是完全最新的 64 位 Arch Linux。

什么可能导致 isql 失败。对于这个问题,我已经尝试了迄今为止我看到的所有解决方案,但它们都没有真正为我工作。我是否必须重新编译 FreeTDS 或其他什么?

好的,我还使用 strace 验证了它正在查找配置文件,如以下摘录所示:

open("/etc/odbc.ini", O_RDONLY)         = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=159, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc71fe09000
read(3, "[AVP1]\n      Description = ODBC "..., 4096) = 159
4

3 回答 3

3

如果有人已经让 tsql 正常工作,但在 Internet 上进行了广泛搜索,并对他们的配置进行了故障排除,但仍然无法让 isql 正常工作,请检查您的服务器日志。

我已经对 Xubuntu 12.04 unixodbc 安装和配置进行了一周的故障排除,当我决定检查我的 Windows 服务器事件查看器以查看请求进入服务器或请求时发生了什么时,我尝试了一切可能的方法来修复它甚至进入服务器并发现问题是我无法进入特定数据库。我可以进入 SQL Server,但不能进入我在 odbc.ini 文件中列出的实际数据库。

这是事件日志中的特定文本“用户 'ePMX' 登录失败。

原因:无法打开明确指定的数据库。[客户:192.168.27.25]”。

引起我兴趣的是“显式”这个词。所以我只是简单地注释掉了Database = <DB Name>,突然一切正常,经过无数小时的研究和尝试一切可能的事情后,我得到了 SQL 提示。

因此,如果您在使用 unixodbc 时遇到问题,请不要忘记对服务器端以及客户端进行故障排除,因为我已经看到大量帖子中人们遇到了与我完全相同的问题,但从来没有任何回应如何解决解决它,所以我猜测有很多人遇到问题是服务器端问题。

对于一个出色的故障排除工具,请使用 osql 而不是 isql(osql 实际上实际上使用 isql 进行连接),因为它会逐步完成连接过程并为您提供有关故障发生位置的详细信息。它的使用方式与使用 isql 的方式相同: osql <DSN> <user> <password>.

因此,正如我所说,如果您尝试了其他所有方法并且无法找出问题所在,请务必检查您的服务器日志。

于 2012-09-05T18:03:28.807 回答
0

好吧,在连续两天把头撞在墙上之后,我终于弄明白了。

我将尝试提供尽可能多的信息,以便如果有人在与我相同的情况下发现此信息,他们会发现这很有用。

[earlz@earlzarch ~]$ cat /etc/odbc.ini
[AVP1]
Description=ODBC connection via FreeTDS
Driver=/usr/lib/libtdsodbc.so
Server=192.168.0.100
UID=sa
PWD=pass
Port=1232
ReadOnly=No
[earlz@earlzarch ~]$ cat /etc/odbcinst.ini
[TDS]
     Description     = v0.60 with protocol v7.0
     Driver          = /usr/lib/libtdsodbc.so
     Driver64 = /usr/lib
     Setup           = /usr/lib/libtdsS.so
     Setup64 = /usr/lib
     CPTimeout       =
     CPReuse         =
     FileUsage       = 1
[earlz@earlzarch ~]$ cat /etc/freetds/freetds.conf
[global]
        tds version = 8.0
        initial block size = 512
        swap broken dates = no
        swap broken money = no
        try server login = yes
        try domain login = no
        cross domain login = no
        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 64512

[TDS]
        host = 192.168.0.100
        port = 1232
        tds version = 8.0

如果你幸运的话,在那之后:

[earlz@earlzarch ~]$ isql -v AVP1
[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
[earlz@earlzarch ~]$ isql -v AVP1 sa pass
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

我不必设置任何类型的环境变量,也不必使用 Arch Linux 64 位(日期为 2010 年 4 月 7 日)手动编译任何东西。让 isql 工作后,Rails 也立即连接到数据库。现在我只需要弄清楚为什么db:schema:load不起作用,但那是另一个问题:)

另外,请注意这组文件和最后一组文件之间的唯一真正区别在于/etc/odbc.ini我将Driver字段设置为驱动程序的实际文件名,而不是为某些配置条目命名。

于 2011-06-16T20:12:52.097 回答
0

在构建 FreeTDS 时,当前版本的 SQL Server 需要 TDS 协议 v8 ( http://www.freetds.org/userguide/config.htm ):

./configure --with-tdsver=8.0 --enable-msdblib
于 2011-06-16T21:25:59.847 回答