【发布时间】:2015-06-22 16:07:20
【问题描述】:
我正在开发一个通过 ODBC、SQLR 连接到旧数据库 Eloquence 的应用程序。我使用 UnixODBC 设置我的服务器并设置驱动程序和数据源,如下所示:
/etc/odbcinst.ini:
[SQLR]
Description=SQLR for Elqouence
Driver=/opt/sqlr/lib/libsqlrodbc.so
Driver64=/opt/sqlr/lib64/libsqlrodbc64.so
FileUsage = 1
/etc/odbc.ini:
[reservations]
Description = SQLR datasource for RES database
Driver = SQLR
Database = res
Servername = eloq-dev
Port = 8003
UserName = sqlrodbc
我确认我可以通过运行isql reservations 连接到数据源,并且我运行了几个查询以确保。没有问题。然后我使用 ODBC gem 和以下代码将我的 Ruby 代码连接到数据库:
require 'rdbi-driver-odbc'
RDBI.connect :ODBC, db: "reservations"
输出如下错误:
Unable to connect to host.
Host 127.0.0.1, Service sqlrodbc
errno 111: Connection refused
ODBC::Error: 08001 (3047) [unixODBC][Marxmeier][SQL/R ODBC Client]connection failure
我担心它使用 127.0.0.1 作为主机,即使 eloq-dev 主机名在 /etc/hosts 中设置为不同的地址。我还担心isql 有效,但 ODBC gem 无效。
编辑
作为附加说明,当我使用tcpdump 命令时,与我的连接相关的唯一输出是:
$ tcpdump -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
18:38:39.688264 IP localhost.50447 > localhost.mcreport: Flags [S], seq 3355035364, win 43690, options [mss 65495,sackOK,TS val 1655798115 ecr 0,nop,wscale 7], length 0
18:38:39.688280 IP localhost.mcreport > localhost.50447: Flags [R.], seq 0, ack 3355035365, win 0, length 0
根本没有数据包通过网络发送出去。
我还更改了我的代码以使用 RDBI 而不是 Ruby-ODBC,但有同样的问题。
【问题讨论】:
-
顺便说一句,考虑使用Sequel 给你一个ORM 层。它可以很好地与 ODBC 配合使用,并且无需使用特定于 DBM 的查询,从而使您的代码更具可移植性。
-
铁皮人:在我看来,这与我的问题完全无关。我的用例涉及对遗留数据库的几个只读查询,并且不需要添加 ORM 层的开销。
-
这是一个试图提供帮助的建议。要么接受,要么离开它。你的反应出奇的防御性。
-
铁皮人:我并不想在我的回应中进行防御。我的挣扎是,在不知道我的用例的情况下,你建议我使用 Sequel。如果我是编程新手,我可能会毫无疑问地接受这一点,并为我的应用程序增加不必要的开销。如果你愿意,我可以在聊天或其他方式上多谈。任何防御都来自我的斗争,即开发社区忘记了数据库非常强大和可用,即使没有 ORM。
-
虽然也没有回答,但我很幸运(在与其他 gem 进行了多次试验和错误之后)使用
rdbi和rdbi-driver-odbc与 sql 建立 odbc 连接以及甚至访问(mdb ) 数据库。这没有 ORM,您可以相当轻松地编写手动查询。在一些应用程序中,我实际上已经成功地编写了自己的轻量级 ORM,以促进基本功能,而不会出现社区版本的臃肿。