处理 OracleCommand 参数中的空值

问题描述 投票:0回答:7

我试图确定如何使用以下 C# 代码在 OracleCommand 中指定 null 作为参数值。我摘录了相关位,但基本上要点是,如果 sal_id 的值为 0,则应将其存储为 null。我尝试过 Null、“Null”和其他一些方法,但到目前为止还没有成功。

cmd.CommandText = "INSERT INTO tcustomer(cust_id, salutation_id) VALUES(ORADBA.SEQCUST.NEXTVAL, :salid) RETURNING cust_id INTO :newcid" ;

if (sal_id==0) {
  cmd.Parameters.Add("salid", Null) ;
} else {
  cmd.Parameters.Add("salid", sal_id) ;
}

cmd.Parameters.Add("newcid", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue ;

cmd.ExecuteNonQuery() ;

String newcidval = cmd.Parameters["newcid"].Value.ToString() ;
cmd.Dispose() ;
c# odp.net
7个回答
19
投票

尝试用

System.DBNull
代替
null

DBNull 类代表一个 不存在的价值。在数据库中,对于 例如,表的一行中的一列 可能不包含任何数据。 也就是说,该列被认为是 根本不存在而不是根本不存在 有一个价值。 DBNull 对象 代表不存在的列


8
投票

DBNull 不能分配给任何其他数据类型,因此必须将其隐式转换为对象。

cmd.Parameters.Add(new OracleParameter(":number_column", OracleType.Number)).Value = (s.Class.HasValue) ? s.Class.Value : (object)DBNull.Value;

s.Class 是 int 吗?如果参数值为空,则将其设置为

(object)DBNull.Value


2
投票

DBNull.Value
适用于某些人,但我需要将其转换为实现
INullable
的 Oracle 类型。如果您使用可空数据类型,我推荐这种方法:

    (Oracle.ManagedDataAccess.Types.OracleDecimal)command.Parameters["pKey"].Value)).IsNull

2
投票

您可以检查 OracleParameter 对象的状态 - 如果它等于 OracleParameterStatus.NullFetched,则未获取任何内容,否则使用参数的 Value 属性。

示例:

var _myParam = new OracleParameter( "p_param", OracleDbType.Object, ParameterDirection.Output ) { UdtTypeName = "my_schema.MY_TYPE" };

... (add command parameter)
... (execute command)

var _myResponse = _myParam.Status == OracleParameterStatus.NullFetched ? null : MapMyTypeFromOracleType( (MyType)_myParam.Value );

0
投票

您可以添加一个空参数(开始时为空),并且仅在

sal_id != 0
:

时设置该值
var p = cmd.Parameters.Add("salid", OracleDbType.Int32);
if (sal_id != 0) {
    p.Value = sal_id;
}

0
投票

if(((Oracle.DataAccess.Types.OracleString)comm.Parameters["P_MSG"].Value).IsNull) { // 一片空白 } else { // 不为空 }


-2
投票

对我来说

DBNull.Value
不起作用,所以我这样做了:

cmd.Parameters.Add("salid", "Null") ;

效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.