从ADO.NET调用存储过程时,无法将NVarChar类型的OracleParameter与ParameterDirection的输出一起使用

从ADO.NET调用存储过程时,无法将NVarChar类型的OracleParameter与ParameterDirection的输出一起使用,oracle,stored-procedures,ado.net,Oracle,Stored Procedures,Ado.net,我正在使用ADO.Net调用Oracle数据库中的存储过程。存储过程有一个输出参数,该参数是NVARCHAR2。以下是存储过程: CREATE OR replace PROCEDURE VALIDATE_Bin ( machine_dump_name IN NVARCHAR2, lpn IN NVARCHAR2, result OUT NUMBER, message OUT NVARCHAR2) IS BEGIN

我正在使用ADO.Net调用Oracle数据库中的存储过程。存储过程有一个输出参数,该参数是NVARCHAR2。以下是存储过程:

CREATE OR replace PROCEDURE VALIDATE_Bin ( 
machine_dump_name IN NVARCHAR2, 
lpn               IN NVARCHAR2, 
result            OUT NUMBER, 
message           OUT NVARCHAR2) 
IS 
BEGIN 
    IF lpn LIKE 'A%' THEN 
      result := 1; 
      message := NULL; 
    ELSE 
      IF lpn IS NULL THEN 
        result := 0; 
        message := 'Failed Read'; 
      ELSE 
        result := 0; 
        message := 'Invalid Barcode'; 
      END IF; 
    END IF; 
END;
machine_dump_name IN NVARCHAR2, 
下面是填写命令参数的c代码:

command.Parameters.Add(new OracleParameter("machine_dumper_name",OracleType.NVarChar){Value = "My Dumper"});
command.Parameters.Add(new OracleParameter("lpn", OracleType.NVarChar) { Value ="XYZ1234"});
var resultParam = new OracleParameter("result", OracleType.Number) { Direction = ParameterDirection.Output};
command.Parameters.Add(resultParam);
var messageParam = new OracleParameter("message", OracleType.NVarChar) { Direction = ParameterDirection.Output};
command.Parameters.Add(messageParam);

command.ExecuteNonQuery();
如果我这样执行,我会得到一个异常:

System.Exception:参数“message”:未为可变长度数据类型设置大小:String

我想不用担心。Oracle要求“message”参数具有字符串长度。因此,我在“message”参数上添加了一个size参数:

var messageParam = new OracleParameter("message", OracleType.NVarChar, 255) { Direction = ParameterDirection.Output};
然后,当我运行它时,我得到这个System.Data.OracleClient.OracleException:

PLS-00306:调用“VALIDATE_Bin”时参数的数量或类型错误

我该怎么调用这个过程来传达信息呢?我认为这个问题特定于字符串数据类型。这是虫子吗?还是我做错了什么?

试试看

var messageParam = new OracleParameter("message", OracleDbType.NVarchar2,UInt16.MaxValue) { Direction = ParameterDirection.Output};
messageParam.Value = DbNull.Value

在阅读了@psaraj12的一条评论后,我意识到问题参数可能根本不是“message”参数。在逐个从存储过程中删除变量后,我发现参数名中存在不匹配。在程序中:

CREATE OR replace PROCEDURE VALIDATE_Bin ( 
machine_dump_name IN NVARCHAR2, 
lpn               IN NVARCHAR2, 
result            OUT NUMBER, 
message           OUT NVARCHAR2) 
IS 
BEGIN 
    IF lpn LIKE 'A%' THEN 
      result := 1; 
      message := NULL; 
    ELSE 
      IF lpn IS NULL THEN 
        result := 0; 
        message := 'Failed Read'; 
      ELSE 
        result := 0; 
        message := 'Invalid Barcode'; 
      END IF; 
    END IF; 
END;
machine_dump_name IN NVARCHAR2, 
在C代码中:


谢谢大家的想法!当我使用参数的实际名称(machine\u DUMP\u name)时,一切都很好

请尝试下面的var messageParam=newOracleParameter(“message”,OracleType.NVarChar){Direction=ParameterDirection.Output}{Value=”“};不行。我尝试了“”、DBNull.Value“”,它们都会导致PLS-00306:调用中的参数数量或类型错误尝试将message out nvarchar2更改为message outnvarchar@psaraj12这也不行,如果这是唯一能让它工作的方法,我会非常惊讶!OracleClient处理out参数的方式似乎存在一个潜在的问题。我找到了解决这个问题的方法,那就是使用OleDbConnection,并在连接字符串前面加上“Provider=OraOLEDB”;不过我仍在寻找答案。如何在System.Data.OracleClient库中注册错误?相同错误:PLS-00306:调用中的参数数量或类型错误。正如我所说,我尝试了每一种排列,但似乎System.Data.OracleClient程序集中有一个bug。请尝试将该值显式设置为DbNull.value