【问题标题】:How to check an output DbParameter for null value?如何检查输出 DbParameter 的空值?
【发布时间】:2019-05-31 15:25:56
【问题描述】:

我正在使用System.Data.Common.DbCommand.ExecuteNonQueryAsync 调用一个Oracle 存储过程,该过程具有一个输出参数o_err_msg(您猜对了),当异常发生时是VARCHAR2 错误消息,或者在过程成功时是null。所以,在调用 `ExecuteNonQueryAsync 之后,我试图检查那个参数是否为空,看看是否有错误。但找不到真正做到这一点的方法。

我尝试比较(通过== 运算符和Equals 方法)参数的Value 属性为null,DBNull.Value 并在其上调用System.Convert.IsDBNull。所有这些都返回 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 的调用并检查参数中的值是什么。这应该让您知道在运行时要比较什么
  • if (cmd.Parameters["o_err_msg"].Value is DBNull) 有效吗? ADO.NET 使用数据库占位符null,即DBNull.Value
  • @Nkosi 感谢您的建议!不过,这就是我试图做到的方式。为参数的 Value 属性添加 Watch 会导致:cmd.Parameters["o_err_msg"].Value {null} object {Oracle.ManagedDataAccess.Types.OracleString}
  • @MarcGravell 它不起作用。我试过cmd.Parameters["o_err_msg"].Value is DBNullcmd.Parameters["o_err_msg"] is DBNull 但都返回false
  • @LuisCosta 我想知道...这是“Oracle 没有空字符串的概念”之一吗?

标签: c# .net-core


【解决方案1】:

我今天也遇到了同样的问题,fowling 代码应该可以解决。

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多