c# - .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 的调用顺序来构造调用)
解决方案
推荐阅读
- r - 使用 R 基于其他列在时间序列中重复删除
- flutter - 类似 Spotify 的外观的 Sliver 导航颤动
- docker - 来自 Docker 的 Flutter Web 读取自定义环境
- reactjs - 如何在使用 redux-saga 的调度中等待完整的返回值?
- elasticsearch - 在 ElasticSearch 中,有没有办法获取 ES 为术语查询请求返回的每个匹配项匹配的术语数?
- android - 我如何在颤动中使用资产图像在android中设置壁纸
- verilog - Verilog If 语句 - 似乎在 Condition 之前触发
- azure - 如何在 Azure 中设置 PHP 7x 64 位 FastCGI?
- python - 是否值得缓存 Python 的范围(开始、停止、步进)?
- javascript - 为什么 export const helloWorld 在 firebase deploy 中出现错误而 export.helloWorld 没有?