处理OracleCommand参数中的空值

时间:2009-07-22 15:19:43

标签: c# odp.net

我正在尝试使用以下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() ;

6 个答案:

答案 0 :(得分:17)

尝试null System.DBNull {{1}}。{/ p>

  

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

答案 1 :(得分:6)

无法将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 :(得分:1)

DBNull.Value适用于某些人,但我需要将其转换为实现INullable的Oracle类型。如果您使用Nullable数据类型,我建议使用此方法:

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

答案 3 :(得分:1)

您可以检查OracleParameter对象的状态 - 如果它等于OracleParameterStatus.NullFetched,则不提取任何内容,否则使用param的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 );

答案 4 :(得分:0)

对我来说DBNull.Value没有用,所以我这样做了:

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

并且效果很好。

答案 5 :(得分:0)

您可以添加一个空参数(启动时为空),只设置sal_id != 0的值:

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