无法在C#中将类型为'System.String'的对象转换为类型为'Oracle.DataAccess.Client.OracleParameter'

时间:2018-07-05 01:44:11

标签: c# oracle plsql parameters casting

我试图在一个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;
/

1 个答案:

答案 0 :(得分:1)

线路有问题

cmd.Parameters.Add("ptipo");

您必须要做的

   cmd.Parameters.Add(ptipo);

注意:您必须将变量而不是变量名作为字符串传递。