ODP.NET delete语句不能将DBNull作为参数值传递

时间:2013-09-02 08:40:26

标签: .net vb.net ado.net odp.net

使用:.NET 4,ODP.NET 11.2.0.3.0,Oracle数据库10g版本10.2.0.3.0

我疯狂地试图确定为什么我的删除语句不起作用。也许这里有人可以帮助我。

以下是 DOES 的代码:

cmd = New OracleCommand("delete from u_parameters where pkey = :pkey and user_id = :user_id and computer is null", Con)
cmd.Parameters.Add("pkey", OracleDbType.NVarchar2).Value = "Test"
cmd.Parameters.Add("user_id", OracleDbType.Decimal).Value = 1
cmd.ExecuteNonQuery()  ' -- this returns 1 as it should

以下是的代码:

cmd = New OracleCommand("delete from u_parameters where pkey = :pkey and user_id = :user_id and computer = :computer", Con)
cmd.Parameters.Add("pkey", OracleDbType.NVarchar2).Value = "Test"
cmd.Parameters.Add("user_id", OracleDbType.Decimal).Value = 1
cmd.Parameters.Add("computer", OracleDbType.NVarchar2).Value = DBNull.Value
cmd.ExecuteNonQuery()  ' -- this returns 0!!

By不起作用我的意思是语句执行但数据库中没有任何反应(并且ExecuteNonQuery的结果为0,这意味着没有受影响的行)。我真的不明白这里可能出现什么问题。我已经尝试将'computer'参数IsNullable设置为True但它不会改变任何东西。

请帮忙。

2 个答案:

答案 0 :(得分:2)

当x为null时,

AND x = NULL不等于true。

尝试使用IS NULLisnull()功能。

有关详细信息,请参阅Not equal <> != operator on NULL

答案 1 :(得分:0)

您可以对任何可以为空的参数执行以下操作。

  oleDBCmd.Parameters.Add(new OracleParameter("computer", OracleType.NVarChar));`

if(string.IsNullOrEmpty(toStr)) {
    oleDBCmd.Parameters["computer"].Value = DBNull.Value;
} else {
    oleDBCmd.Parameters["computer"].Value = toStr;
}

`