我试图在一个C#项目中调用一个存储过程,该存储过程除了Oracle 11g中的某些输入参数外还返回2个值。 该过程是一个简单的登录,如果存储的用户名和密码匹配,则返回varchar2(“ T”或“ F”)( oracle不接受布尔值?),并且应该返回其用户类型的数字(1或2)。
如果我仅使用“ pexito ”(成功)输出参数测试过程,它就可以工作,但不能与“ ptipo”一起使用 strong>'(用户类型))参数。
我尝试在c#代码中将'ptipo'参数的数据类型更改为varchar2和string,以不同的方式进行解析,转换为string,然后转换为int以及许多其他东西。什么都不起作用,总是出现相同的错误。
“无法将类型为'System.String'的对象转换为类型为'Oracle.DataAccess.Client.OracleParameter'”
这是PL / SQL SP代码:
module.exports = {
getTechnicPackInfo: function(id){
var http = require("https");
var options = {
"method": "GET",
"hostname": "solder.io",
"path": "/api/aurora-crafters/modpacks/" + id,
"headers": {
"accept": "application/json",
"content-type": "application/Json",
"authorization": "Bearer 00000000000000000000000000000"
}
};
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
var obj = JSON.parse(body);
return obj;
});
});
req.end();
}
}
这是C#代码:
CREATE OR REPLACE PROCEDURE sp_login
(puser IN VARCHAR2, ppass IN VARCHAR2, pexito OUT VARCHAR2, ptipo OUT NUMBER )
AS
lfila NUMBER;
ltipo number;
BEGIN
SELECT COUNT(*)
INTO lfila
FROM usuario
WHERE user_login = puser AND pass_login = ppass;
SELECT idtipo_user
INTO ltipo
FROM usuario
WHERE user_login = puser AND pass_login = ppass;
IF lfila = 0 THEN pexito:='F';
ELSE pexito:='T';
END IF;
IF ltipo =NULL THEN ptipo:=NULL;
ELSE ptipo:=ltipo;
END IF;
END;
/
答案 0 :(得分:1)
线路有问题
cmd.Parameters.Add("ptipo");
您必须要做的
cmd.Parameters.Add(ptipo);
注意:您必须将变量而不是变量名作为字符串传递。