【发布时间】: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 DBNull和cmd.Parameters["o_err_msg"] is DBNull但都返回false -
@LuisCosta 我想知道...这是“Oracle 没有空字符串的概念”之一吗?