首页 > 解决方案 > .NET/C#:使用 IN OUT 参数调用存储过程时,Oracle.ManagedDataAccess.Client.OracleCommand 内部出现 NullReferenceException

问题描述

使用以下存储过程:

create or replace procedure sp_param_test(p_1 number, p_2 in out number) as
begin
    p_2 := p_2 * 2;
end;

以及以下 C# 代码:

    using var connection = new OracleConnection("Data Source=localhost/ORCL;User ID=...");
    connection.Open();
    using var command = connection.CreateCommand();
    command.CommandText = "call sp_param_test(:p_1, :p_2)";
    
    var p_2 = command.CreateParameter();
    p_2.ParameterName = "p_2";
    p_2.Direction = ParameterDirection.InputOutput;
    p_2.Value = 123;
    command.Parameters.Add(p_2);

    var p_1 = command.CreateParameter();
    p_1.ParameterName = "p_1";
    p_1.Value = 0;
    command.Parameters.Add(p_1);
    
    command.ExecuteNonQuery();
    var value = p_2.Value;
    connection.Close();

ExecuteNonQuery 引发 NullReferenceException。如果将参数更改为仅输入参数(删除“IN OUT”规范)并从 C# 中删除参数方向,则调用有效。

第一个参数未使用的原因是我试图使用命名参数(例如“p_1 => :p1”)调用该过程,但在我可以这样做之前,我需要解决空引用问题。

以前有人见过这种行为吗?(使用 Oracle.ManagedDataAccess.Core 版本 2.19.100)

顺便提一句。使用 CommandType = StoredProcedure 有效,但.NET 代码需要知道参数的顺序(我试图避免的事情)。参数名称被忽略,仅使用对 Parameters.Add 的调用顺序来构造调用)

标签: c#oraclestored-procedures

解决方案


推荐阅读