从ADO.NET调用存储过程时,不能使用带有ParameterDirection的NVarChar类型的OracleParameter

时间:2012-05-01 05:23:17

标签: oracle stored-procedures ado.net

我正在使用ADO.Net来调用Oracle数据库中的存储过程。存储过程的out参数是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;

以下是填写命令参数的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期望"消息中的字符串长度为#34;参数。所以我在"消息"上添加了一个大小参数。参数:

var messageParam = new OracleParameter("message", OracleType.NVarChar, 255) { Direction = ParameterDirection.Output};

然后当我运行它时,我得到了这个System.Data.OracleClient.OracleException:

  

PLS-00306:调用' VALIDATE_Bin'

时参数的数量或类型错误

我该如何调用此程序并将消息输出?我认为这个问题特定于字符串数据类型。这是一个错误吗?或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试

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

答案 1 :(得分:0)

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

machine_dump_name IN NVARCHAR2, 

并在C#代码中:

new OracleParameter("machine_dumper_name",OracleType.NVarChar)

感谢大家的所有想法!当我使用参数的实际名称(machine_DUMP_name)时,一切都很完美!