0

经过大量的 google-fu 之后,我找到了一种查询古老 sybase 数据库的方法,以开始为我正在使用 node-odbc 开发的移动应用程序构建一个 rest api ( https://github.com/markdirish/node- odbc/blob/master/README.md#callprocedurecatalog-schema-name-parameters-callback)。

我已经成功地使用 select 语句进行了查询,但出于安全目的,我不希望这样做。当我尝试使用存储过程时,我得到了一个奇怪的响应。我需要在这里进行健全性检查并找出我缺少的东西。

我尝试的一个示例存储过程是一个简单的 sp,它带有一个参数来使用帐号检查电子邮件地址(当然这是一个假 sp,但格式相同):

"DB"."spGetEmail"(@acctnum varchar(50))

文档显示了这一点:

常量 odbc = 要求('odbc');

odbc.connect( ${process.env.CONNECTION_STRING}, (error, connection) => { connection.callProcedure(null, null, 'MY_PROC', [undefined], (error, result) => { if (error) { console.error(error) } / /handle // result 包含一个结果数组,并且有一个parameters属性来访问过程返回的参数。console.log(result); }); });

我将其解释为如下所示:

odbc.connect(${process.env.CONNECTION_STRING}, (error, connection) => { connection.callProcedure(null, "DB", "spGetEmail", [123456], (error, result) => { if (error ) { console.error(error) } // 句柄 // result 包含一个结果数组,并且有一个parameters属性可以访问过程返回的参数。console.log(result); }); });

然后我得到这个:

[错误:[odbc] 过程期望的参数个数和传递的参数个数不相等] { odbcErrors: [] } undefined Segmentation fault

似乎很简单,我缺少一些参数,但我知道我没有。dang sp 采用一个参数!

我在这里想念什么?

4

1 回答 1

0

[已解决] 我不确定内置的 .callProcedure() 方法是否损坏或不适合 Sybase16,但我找到了解决方法,以防将来对任何人都有帮助。不要使用 callProcedure() 方法,而是这样做:

  odbc.connect(connectionString, (error, connection) => {

    let my_procedure = "exec spGetEmail @acct='12345678'"

    connection.query(my_procedure, (error, result) => {
        if (error) { console.error(error) }
        console.log(result);
    });
}); 
于 2020-12-16T14:43:14.733 回答