经过大量的谷歌搜索,我找到了一种查询古老的sybase数据库的方法,开始为我正在使用nodeodbc开发的移动应用程序构建rest api(https://github.com/markdirish/node-odbc/blob/master/README.md#callprocedurecatalog-架构名称参数回调)。
我已经成功地使用select语句进行了查询,但出于安全考虑,我不希望这样做。当我尝试使用存储过程时,我会得到一个奇怪的响应。我需要在这里检查一下,弄清楚我遗漏了什么。
我尝试过的一个示例存储过程是一个简单的sp,它有一个参数来使用帐号检查电子邮件地址(这当然是一个假的sp,但格式相同):
"DB"spGetEmail";(@acctnum varchar(50))
文档显示:
const odbc=require('dbc');
odbc.connect(${process.env.CONNECTION_STRING}
,(错误,连接)=>{connection.callProcedure(null,null,'MY_PROC',[未定义],(error,result)=>{if(error){console.error(error)}//句柄//result包含一个结果数组,并具有parameters
属性以访问过程返回的参数。console.log(结果);});});
我把它解释成这样:
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(结果);});});
然后我得到这个:
[Error:[odbc]过程所需的参数数量,以及传递的参数数不相等]{odbcErrors:[]}未定义的分段故障
看起来很直接,我错过了一些参数,但我知道我不是。当sp需要一个参数!
我在这里错过了什么??
[已解决]我不确定内置的.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);
});
});