node.js - Ubuntu 12.04 LTS 64 + unixODBC 2.3.1 + Informix clientdk 4.10 + node.js v0.10.20

标签 node.js ubuntu-12.04 informix unixodbc

阅读您的问题和答案我会学到很多东西。

但现在我迷路了

正如你在标题中看到的,我使用 Ubuntu 12.04 LTS 64 + unixODBC 2.3.1 + Informix clientdk 4.10 + node.js v0.10.20....

一切都是正确的,直到我尝试在 node.js 环境中使用 unixODBC 和 Informix 驱动程序进行连接。

我对 SQLServer 没有任何问题。所以 Node 没问题,unixODBC 没问题,SQLServer 驱动程序也是如此。 Informix 驱动程序看起来也是正确的,但是。

我可以 $ isql -v MYDSN 并查询数据库。

但是当 Node App尝试连接时崩溃。

DSN真的很简单,isql也能玩:

/usr/local/etc/odbc.ini
[NIFX]
Driver=/opt/IBM/informix/lib/cli/iclit09b.so
Server=explotacion
LogonID=informix
pwd=enterpass
Database=data

isql 的播放宽度看起来不错

$ isql  NIFX
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>  SELECT COUNT(*) FROM PACIENTES   
+------------------+
|                  |
+------------------+
| 414396           |
+------------------+
SQLRowCount returns -1
1 rows fetched
SQL> 

我的 Node testifx.js 看起来

var Database = require("odbc").Database,
    db = new Database(),
    cn="DSN=NIFX"

db.open(cn, function (err) {
  if (err) return console.log(err);

  db.query('SELECT COUNT(*) FROM PACIENTES', [], function (err, data) {
    if (err) console.log(err);

    console.log(data);

    db.close(function () {
      console.log('done');
    });
  });
});

结果...

$ node testifx
{ error: '[node-odbc] SQL_ERROR',
  message: '[unixODBC][',
  state: '0' }
$ 

谁能帮我解决这个问题吗?

odbc.ini 的宽度有什么问题,或者可能在连接字符串中放置了一些其他参数(我已经在谷歌空间中找到了所有托盘)

非常感谢。

<小时/>

谢谢迈克尔 抱歉日志很长。

我已经按照你说的做了。 首先将跟踪记录到 odbcinst.ini 中适当环境的文件设置

[ODBC]
TraceFile = /home/srlopez/Dev/unixODBC.log
Trace = Yes

其次,运行isql -v NIFX,并执行单个命令SELECT COUNT(*) FROM FSIGBLO。 我只是通过名称来指示 DSN。

做得正确,跟踪是:

[ODBC][7151][1380810414.400667][__handles.c][460]
        Exit:[SQL_SUCCESS]
            Environment = 0x63c750
[ODBC][7151][1380810414.400743][SQLAllocHandle.c][375]
        Entry:
            Handle Type = 2
            Input Handle = 0x63c750
[ODBC][7151][1380810414.400773][SQLAllocHandle.c][493]
        Exit:[SQL_SUCCESS]
            Output Handle = 0x63d070
[ODBC][7151][1380810414.400803][SQLConnect.c][3700]
        Entry:
            Connection = 0x63d070
            Server Name = [NIFX][length = 4 (SQL_NTS)]
            User Name = [NULL]
            Authentication = [NULL]
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'

[ODBC][7151][1380810414.803879][SQLConnect.c][4273]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810414.810623][SQLGetFunctions.c][151]
        Entry:
            Connection = 0x63d070
            Id = SQLMoreResults
            Supported = 0x6061d8
[ODBC][7151][1380810414.810759][SQLGetFunctions.c][186]
        Exit:[SQL_SUCCESS]
            Supported = 0x6061d8 -> 1
[ODBC][7151][1380810428.644512][SQLAllocHandle.c][540]
        Entry:
            Handle Type = 3
            Input Handle = 0x63d070
[ODBC][7151][1380810428.644621][SQLAllocHandle.c][1081]
        Exit:[SQL_SUCCESS]
            Output Handle = 0x6b7aa0
[ODBC][7151][1380810428.644661][SQLPrepare.c][196]
        Entry:
            Statement = 0x6b7aa0
            SQL = [SELECT COUNT(*) FROM FSIGBLO ][length = 29]
[ODBC][7151][1380810428.646046][SQLPrepare.c][371]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.646087][SQLExecute.c][187]
        Entry:
            Statement = 0x6b7aa0
[ODBC][7151][1380810428.646913][SQLExecute.c][348]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.646949][SQLNumResultCols.c][156]
        Entry:
            Statement = 0x6b7aa0
            Column Count = 0x7fffc7b20e8e
[ODBC][7151][1380810428.646984][SQLNumResultCols.c][248]
        Exit:[SQL_SUCCESS]
            Count = 0x7fffc7b20e8e -> 1
[ODBC][7151][1380810428.647030][SQLNumResultCols.c][156]
        Entry:
            Statement = 0x6b7aa0
            Column Count = 0x7fffc7b20bae
[ODBC][7151][1380810428.647057][SQLNumResultCols.c][248]
        Exit:[SQL_SUCCESS]
            Count = 0x7fffc7b20bae -> 1
[ODBC][7151][1380810428.647090][SQLColAttribute.c][293]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Field Identifier = SQL_DESC_DISPLAY_SIZE
            Character Attr = (nil)
            Buffer Length = 0
            String Length = (nil)
            Numeric Attribute = 0x7fffc7b20a08
[ODBC][7151][1380810428.647129][SQLColAttribute.c][664]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.647156][SQLColAttribute.c][293]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Field Identifier = SQL_DESC_LABEL
            Character Attr = 0x7fffc7b20a10
            Buffer Length = 301
            String Length = (nil)
            Numeric Attribute = (nil)
[ODBC][7151][1380810428.647192][SQLColAttribute.c][664]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.647218][SQLColAttribute.c][293]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Field Identifier = SQL_DESC_LABEL
            Character Attr = 0x7fffc7b20cf0
            Buffer Length = 301
            String Length = (nil)
            Numeric Attribute = (nil)
[ODBC][7151][1380810428.647244][SQLColAttribute.c][664]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.647295][SQLNumResultCols.c][156]
        Entry:
            Statement = 0x6b7aa0
            Column Count = 0x7fffc7b20bbe
[ODBC][7151][1380810428.647322][SQLNumResultCols.c][248]
        Exit:[SQL_SUCCESS]
            Count = 0x7fffc7b20bbe -> 1
[ODBC][7151][1380810428.647347][SQLFetch.c][162]
        Entry:
            Statement = 0x6b7aa0
[ODBC][7151][1380810428.648100][SQLFetch.c][348]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.648137][SQLColAttribute.c][293]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Field Identifier = SQL_DESC_DISPLAY_SIZE
            Character Attr = (nil)
            Buffer Length = 0
            String Length = (nil)
            Numeric Attribute = 0x7fffc7b20a28
[ODBC][7151][1380810428.648164][SQLColAttribute.c][664]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.648189][SQLColAttribute.c][293]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Field Identifier = SQL_DESC_LABEL
            Character Attr = 0x7fffc7b20a30
            Buffer Length = 301
            String Length = (nil)
            Numeric Attribute = (nil)
[ODBC][7151][1380810428.648218][SQLColAttribute.c][664]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810428.648254][SQLGetData.c][237]
        Entry:
            Statement = 0x6b7aa0
            Column Number = 1
            Target Type = 1 SQL_CHAR
            Buffer Length = 301
            Target Value = 0x7fffc7b20d00
            StrLen Or Ind = 0x7fffc7b20bb0
[ODBC][7151][1380810428.648358][SQLGetData.c][501]
        Exit:[SQL_SUCCESS]                
            Buffer = [2]                
            Strlen Or Ind = 0x7fffc7b20bb0 -> 1
[ODBC][7151][1380810428.648453][SQLFetch.c][162]
        Entry:
            Statement = 0x6b7aa0
[ODBC][7151][1380810428.648485][SQLFetch.c][348]
        Exit:[SQL_NO_DATA]
[ODBC][7151][1380810428.677380][SQLRowCount.c][173]
        Entry:
            Statement = 0x6b7aa0
            Row Count = 0x7fffc7b20e48
[ODBC][7151][1380810428.677455][SQLRowCount.c][244]
        Exit:[SQL_SUCCESS]
            Row Count = 0x7fffc7b20e48 -> -1
[ODBC][7151][1380810428.677539][SQLMoreResults.c][162]
        Entry:
            Statement = 0x6b7aa0
[ODBC][7151][1380810428.678583][SQLMoreResults.c][317]
        Exit:[SQL_NO_DATA]
[ODBC][7151][1380810428.678630][SQLFreeStmt.c][144]
        Entry:
            Statement = 0x6b7aa0
            Option = 1
[ODBC][7151][1380810428.678661][SQLFreeHandle.c][381]
        Entry:
            Handle Type = 3
            Input Handle = 0x6b7aa0
[ODBC][7151][1380810428.679476][SQLFreeHandle.c][491]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810430.715614][SQLDisconnect.c][208]
        Entry:
            Connection = 0x63d070
[ODBC][7151][1380810430.719032][SQLDisconnect.c][364]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810430.719070][SQLFreeHandle.c][284]
        Entry:
            Handle Type = 2
            Input Handle = 0x63d070
[ODBC][7151][1380810430.719093][SQLFreeHandle.c][333]
        Exit:[SQL_SUCCESS]
[ODBC][7151][1380810430.719116][SQLFreeHandle.c][219]
        Entry:
            Handle Type = 1
            Input Handle = 0x63c750

然后运行node test.js,连接字符串cn='NIFX' 将 odbc.ini 上的相同信息传递到环境 isql 和 node。 痕迹是

[ODBC][7171][1380810558.770556][__handles.c][460]
        Exit:[SQL_SUCCESS]
            Environment = 0x1438f10
[ODBC][7171][1380810558.770647][SQLSetEnvAttr.c][189]
        Entry:
            Environment = 0x1438f10
            Attribute = SQL_ATTR_ODBC_VERSION
            Value = 0x3
            StrLen = -5
[ODBC][7171][1380810558.770677][SQLSetEnvAttr.c][363]
        Exit:[SQL_SUCCESS]
[ODBC][7171][1380810558.781819][SQLAllocHandle.c][375]
        Entry:
            Handle Type = 2
            Input Handle = 0x1438f10
[ODBC][7171][1380810558.782068][SQLAllocHandle.c][493]
        Exit:[SQL_SUCCESS]
            Output Handle = 0x7fc6000008c0
[ODBC][7171][1380810558.782802][SQLSetConnectAttrW.c][332]
        Entry:
            Connection = 0x7fc6000008c0
            Attribute = SQL_ATTR_LOGIN_TIMEOUT
            Value = 0x7fc607ffee4c
            StrLen = 4
[ODBC][7171][1380810558.782922][SQLSetConnectAttrW.c][616]
        Exit:[SQL_SUCCESS]
[ODBC][7171][1380810558.782968][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x7fc6000008c0
            Window Hdl = (nil)
            Str In = [DSN=NIFX][length = 9]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = (nil)
            Completion = 0
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'

**[ODBC][7171][1380810558.787449][SQLDriverConnectW.c][699]
        Exit:[SQL_ERROR]**
[ODBC][7171][1380810558.787689][SQLGetDiagFieldW.c][792]
        Entry:
            Connection = 0x7fc6000008c0
            Rec Number = 1
            Diag Ident = 2
            Diag Info Ptr = 0x7fffdc53aca8
            Buffer Length = -6
            String Len Ptr = 0x7fffdc53acae
[ODBC][7171][1380810558.787802][SQLGetDiagFieldW.c][812]
        Exit:[SQL_SUCCESS]
[ODBC][7171][1380810558.787839][SQLGetDiagRecW.c][508]
        Entry:
            Connection = 0x7fc6000008c0
            Rec Number = 1
            SQLState = 0x7fffdc53aeb0
            Native = 0x7fffdc53aca4
            Message Text = 0x7fffdc53acb0
            Buffer Length = 512
            Text Len Ptr = 0x7fffdc53acae
[ODBC][7171][1380810558.787873][SQLGetDiagRecW.c][550]
        Exit:[SQL_SUCCESS]
            SQLState = H
            Native = 0x7fffdc53aca4 -> -11060
            Message Text = [[unixODBC][]
[ODBC][7171][1380810558.788053][SQLGetDiagRecW.c][508]
        Entry:
            Connection = 0x7fc6000008c0
            Rec Number = 2
            SQLState = 0x7fffdc53aeb0
            Native = 0x7fffdc53aca4
            Message Text = 0x7fffdc53acb0
            Buffer Length = 512
            Text Len Ptr = 0x7fffdc53acae
[ODBC][7171][1380810558.788174][SQLGetDiagRecW.c][550]
        Exit:[SQL_SUCCESS]
            SQLState = 0
            Native = 0x7fffdc53aca4 -> -11005
            Message Text = [[unixODBC][]

这是我的结论。 Node 使用unixODBC调用不同的函数。 isql 调用 SQLConnect.cnode 调用 SQLDriverConnectW.c,如下所示:

NODE 仅在连接之前执行调用

[ODBC][7171][1380810558.770556][__handles.c][460]
[ODBC][7171][1380810558.770647][SQLSetEnvAttr.c][189]
[ODBC][7171][1380810558.770677][SQLSetEnvAttr.c][363]
[ODBC][7171][1380810558.781819][SQLAllocHandle.c][375]
[ODBC][7171][1380810558.782068][SQLAllocHandle.c][493]
[ODBC][7171][1380810558.782802][SQLSetConnectAttrW.c][332]
[ODBC][7171][1380810558.782922][SQLSetConnectAttrW.c][616]
[ODBC][7171][1380810558.782968][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x7fc6000008c0
            Window Hdl = (nil)
            Str In = [DSN=NIFX][length = 9]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = (nil)
            Completion = 0
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'

[ODBC][7171][1380810558.787449][SQLDriverConnectW.c][699]
        Exit:[SQL_ERROR]

isql 仅在连接之前执行调用

[ODBC][7151][1380810414.400667][__handles.c][460]
[ODBC][7151][1380810414.400743][SQLAllocHandle.c][375]
[ODBC][7151][1380810414.400773][SQLAllocHandle.c][493]
[ODBC][7151][1380810414.400803][SQLConnect.c][3700]
        Entry:
            Connection = 0x63d070
            Server Name = [NIFX][length = 4 (SQL_NTS)]
            User Name = [NULL]
            Authentication = [NULL]
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'

**[ODBC][7151][1380810414.803879][SQLConnect.c][4273]
        Exit:[SQL_SUCCESS]**

这个问题该怎么回答呢? 再次提前致谢。

桑蒂

最佳答案

您可以启用 ODBC 调用跟踪。首先运行isql来获取有效调用的日志。然后对 node.js 执行相同的操作。比较它们应该可以告诉你问题出在哪里。

我的问题和答案是关于如何在 Linux 上为 Informix 启用 ODBC 跟踪:Tracing ODBC calls for Informix Client for Linux

编辑:

从日志来看,node.js 使用 SQLDriverConnectW() 并以错误结束:-11005。 Informix 显示错误将此描述为“无效的连接字符串属性。”。

您可以使用与 isql 相同的连接字符串:

cn="NIFX"

如果它不起作用,那么您可能应该添加用户/密码:

cn="Dsn=NIFX;Uid=myUsername;Pwd=myPassword;"

在Python中我经常使用它的形式:

dsn/user/password

您还可以尝试添加连接字符串更多信息,就像显示在:http://www.connectionstrings.com/informix 上一样。

关于node.js - Ubuntu 12.04 LTS 64 + unixODBC 2.3.1 + Informix clientdk 4.10 + node.js v0.10.20,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19143782/

相关文章:

node.js - NodeJS/Nodemon - 服务器重新启动时重置环境变量

node.js - Mongoose - 故意将重复的属性插入到同一文档中

linux - 如何禁止更新命令来查找 google-chrome 依赖项

MySQL 相当于 informix 中的日期时间年份到分数(3)

c# - 这两种方法有什么区别?是什么让第二个比第一个更好?

javascript - 在 js 中使用 Proxy 使 Promise 看起来同步实际上是如何工作的?

javascript - 存钱为整数

c++ - 安装新的 g++ 后无法编译

node.js - phantomjs-pdf 不工作

sql - 为什么 "WITH"子句会在 Informix 上给出语法错误?