我正在使用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'
时参数的数量或类型错误
我该如何调用此程序并将消息输出?我认为这个问题特定于字符串数据类型。这是一个错误吗?或者我做错了什么?
答案 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)时,一切都很完美!