如何检查输出的DbParameter是否为null值?

4
我正在使用System.Data.Common.DbCommand.ExecuteNonQueryAsync 调用一个Oracle存储过程,该过程有一个输出参数o_err_msg,当出现异常时是一个VARCHAR2错误消息(您猜对了),当过程成功时为null。因此,在调用 `ExecuteNonQueryAsync` 之后,我试图检查该参数是否为null,以查看是否发生了错误。但是找不到实际执行它的方法。
我尝试将参数的Value属性与null、DBNull.Value以及在其上调用System.Convert.IsDBNull进行比较(通过==运算符和Equals方法)。所有这些都返回null。我甚至试图将其转换为字符串(通过ToString方法或System.Convert.ToString),然后调用string.IsNullOrEmpty,但是结果字符串是"null"
我运行的代码与以下代码类似:
DbCommand cmd = dbConnection.CreateCommand();
cmd.CommandText = "PCKG_FOO.PROC_BAR";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("o_err_msg", OracleDbType.Varchar2, 4000, "", ParameterDirection.Output));

await cmd.ExecuteNonQueryAsync();

if (cmd.Parameters["o_err_msg"].Value != null)
    throw new InvalidOperationException(cmd.Parameters["o_err_msg"].Value.ToString());

尽管在此示例中,我将参数初始化为 OracleParameter,但在我的代码中,我只能访问 DbParameter,并且我希望不必将其强制转换为 OracleParameter 或任何特定于 Oracle 的内容。
是否有任何方法可以做到这一点?
提前感谢。

一个解决这个问题的方法是调试一个你知道会输出null的调用,并检查参数中的值。这应该能让你知道在运行时需要与什么进行比较。 - Nkosi
if (cmd.Parameters["o_err_msg"].Value is DBNull) 这段代码是否有效?ADO.NET 使用占位符来表示数据库中的 null,即 DBNull.Value - Marc Gravell
1
@LuisCosta 我在想...这是不是那种“Oracle没有空字符串的概念”的事情? - Marc Gravell
使用 DBNull.Value 来引用 DBNull 的确切值 @LuisCosta - Black Hole
尝试使用 !DBNull.Value.Equals(cmd.Parameters["o_err_msg"].Value) - Joel Coehoorn
显示剩余4条评论
2个回答

0

我曾经遇到过同样的问题,输出参数返回了一个{null}值,似乎它与C#中的null不同。

我通过将输出参数值转换为OracleString来解决这个问题。就像这样:

if ((OracleString)cmd.Parameters["o_err_msg"].Value != null)

0
我今天遇到了同样的问题,下面的代码应该是一个解决方法。
OracleParameter out1 = new OracleParameter("out1", OracleDbType.Varchar2, ParameterDirection.Output);
                out1.Size = 1000;
Oracle.ManagedDataAccess.Types.OracleString out1Value = (Oracle.ManagedDataAccess.Types.OracleString)out1.Value;
if (!out1Value.IsNull)
{
   // do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接