2

我正在尝试使用 odbc 连接到 node.js 中的 monetDB。但是,我不断收到以下错误:

The driver reported the following diagnostics whilst running SQLDriverConnect

IM002:1:0:[unixODBC][Driver Manager]Data source name not found, and no default driver      specified
DEBUG: []

这是源代码:

var sys  = require("util");
var odbc = require("/home/vash/node_modules/odbc/odbc.js");

var db = new odbc.Database();
db.open("Driver={ODBC for MonetDB};Setup=/usr/lib/libMonetODBCs.so;UsageCount= 1;SERVER=vash-G75VW;USER=monetdb;PASSWORD=monetdb;PORT=5000;DATABASE=demo", function(err)
{
    db.query("select * from demo", function(err, rows, moreResultSets)
    {
        sys.debug(sys.inspect(rows));
        db.close(function(){});
    });
});

使用命令“isql -v monetdb”,我可以使用带有以下 odbc.ini 和 odbcinst.ini 内容的 ODBC 连接到 monetDB:

[monetdb]
Description             = "ODBC for MonetDB"
Driver          = /usr/lib/libMonetODBC.so
Setup           = /usr/lib/libMonetODBCs.so
UsageCount              = 1
SERVER = vash-G75VW
USER = monetdb
PASSWORD = monetdb
PORT = 5000 
DATABASE = demo

由于我使用 isql 连接,我猜问题在于代码行:

"Driver={ODBC for MonetDB};Setup=/usr/lib/libMonetODBCs.so;UsageCount= 1;SERVER=vash-G75VW;USER=monetdb;PASSWORD=monetdb;PORT=5000;DATABASE=demo"

任何想法有什么问题,我是否正确设置了上面的连接字符串?

4

1 回答 1

4

首先是你混淆了你的 odbc.ini 和 odbcinst.ini 设置(尽管你部分地摆脱了它)。odbcinist.ini 文件包含驱动程序列表,其中每个驱动程序在 [] 中命名,以下是驱动程序属性。因此,如果您的 odbcinst.ini 文件的内容如上所示,您已经命名了一个名为“monetdb”的驱动程序,它具有各种属性。驱动程序绝对需要的唯一属性是驱动程序属性,它应该指向驱动程序的共享对象。附加属性 usagecount、description 和 setup 是可选的。描述可以从一些 ODBC API 中返回,并且设置库告诉驱动程序管理器在需要时加载哪个设置库(在 unix 上很少这样)(例如,如果驱动程序想要提示输入密码或者您给的密码不足要连接的属性)。因此,您的 odbcinst.ini 文件应如下所示(注意,我特意重命名了您的驱动程序密钥以使事情变得明显):

[monetdb_driver]
Description             = "ODBC Driver for MonetDB"
Driver          = /usr/lib/libMonetODBC.so
Setup           = /usr/lib/libMonetODBCs.so
UsageCount              = 1

/etc/odbc.ini 文件包含 SYSTEM DSN,其创建方式与 odbcinst.ini 文件类似,但 [] 中的每个条目都是 DSN 名称。DSN 绝对需要的唯一属性是 Driver 属性,因为它命名了用于此 DSN 的 ODBC 驱动程序。命名的驱动程序应该是 odbcinst.ini 文件中的一个键,因此对您而言,您的 odbc.ini 文件应该如下所示(记住我再次重命名了您的驱动程序):

[monetdb]
Description             = "DSN for MonetDB"
Driver          = monetdb_driver
SERVER = vash-G75VW
USER = monetdb
PASSWORD = monetdb
PORT = 5000 
DATABASE = demo

请记住,您可以拥有 USER DSN,它们通常位于 ~/.odbc.ini 中(请参阅下面的 odbcinst -j 的输出)。

你会发现 unixODBC 的 odbcinst 命令也很有用,因为你可以运行它来检查你的 ini 文件应该在哪里:

$odbcinst -j
unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/martin/.odbc.ini
SQLULEN Size.......: 4
SQLLEN Size........: 4
SQLSETPOSIROW Size.: 2

完成此操作后,您的 isql 命令(和以前一样)应该可以工作 - 例如:

isql -v monetdb your_username your_password

现在为您调用 SQLDriverConnect。

db.open("Driver={monetdb_driver};SERVER=vash-G75VW;USER=monetdb;PASSWORD=monetdb;PORT=5000;DATABASE=demo",

我不使用 monetdb,因此我无法确定“驱动程序”以外的属性,但 ODBC 通常使用属性 UID 和 PWD 作为用户名和密码。我可以相信 monetdb 具有端口和数据库属性。

您可以从Linux/UNIX ODBCODBC -我编写的连接过程中找到更多关于 unix 上的 ODBC 以及连接过程的工作人员。

如果您只打算使用无 DSN 连接字符串(上面对 SQLDriverConnect 的调用)进行连接,您现在可以删除 odbc.ini 文件的内容。

于 2012-07-13T08:20:18.833 回答