4

我正在使用 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;

这里是填写命令参数的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:参数“消息”:没有为可变长度数据类型设置大小:字符串。

我想不用担心。Oracle 期望“消息”参数上的字符串长度。所以我在“消息”参数上添加了一个大小参数:

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

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

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

我到底应该怎么调用这个程序并把消息传出去?我认为这个问题是特定于字符串数据类型的。这是一个错误吗?还是我做错了什么?

4

2 回答 2

1

After reading one of @psaraj12's comments I realized the problem parameter may not be the "message" parameter after all. After eliminating variables from the stored procedure one by one I discovered a mis-match in parameter names. In the procedure:

machine_dump_name IN NVARCHAR2, 

and in the C# code:

new OracleParameter("machine_dumper_name",OracleType.NVarChar)

Thank you for all your ideas everyone! When I used the actual name of the parameter (machine_DUMP_name) everything worked perfectly!

于 2012-05-03T23:12:33.143 回答
1

尝试

var messageParam = new OracleParameter("message", OracleDbType.NVarchar2,UInt16.MaxValue) { Direction = ParameterDirection.Output};
messageParam.Value = DbNull.Value
于 2012-05-02T13:39:27.733 回答