当字符串为空时,将NULL插入SQL

时间:2013-09-10 06:43:01

标签: c# sql sql-server winforms

尝试在我的组合框中没有选择任何内容时插入NULL但是当我这样做时:

prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
                                               null : cb_odjezd.Text);

我收到以下异常:

  

参数化查询需要参数@ odjezd

有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:7)

尝试使用DbNull.Value值。

所以它变成

prikaz.Parameters.AddWithValue("@odjezd", 
         string.IsNullOrEmpty(cb_odjezd.Text) ? DbNull.Value : cb_odjezd.Text);

编辑

加入 acepted 回答here,对您而言,(object)DBNull.Value

就足够了

问题是C#期望相同类型的值在这里有条件,但在一种情况下你 在另一个DbNull.Value中设置string。因此,将DbNull.Value强制转换为对象会使“通过”该规则。

答案 1 :(得分:2)

使用DBNull

prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ? DBNull.value : cb_odjezd.Text);

尝试使用:

if (cb_odjezd.Text== string.Empty)
{
    prikaz.Parameters.AddWithValue("@odjezd", DBNull.Value);
}
else
{
    prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text);
}

关键字null表示无效的引用。 System.DbNull类表示数据库字段中不存在的值。

答案 2 :(得分:2)

first_expressionsecond_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换.- MSDN

?:无法投放type本身,您要返回stringDbNull类型的值,因此您必须投射_objezd.Text的实例对象类型以使其兼容。

 prikaz.Parameters.AddWithValue("@odjezd", 
  _odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);

答案 3 :(得分:1)

DBNull是frankly a bit of a PITA - and it bites lots of people。但是,避免这种痛苦的一种方法是使用ORM或微观ORM,这将使这个问题消失。例如,使用dapper

int id = ...
string odjezd = ...
...
connection.Execte("insert SomeTable (...) values (@id, @odjezd, ...)",
     new {id, odjezd, ... });

此处dapper会自动正确地参数化值,包括处理null - 引用并将Nullable<T>清空为DBNull.Value。此外,它意味着您可以避免ADO.NET的所有“乐趣”,只需担心:

  • 连接管理
  • sql
  • 参数值是什么(但不是参数化本身)

请注意,dapper在实现方面也有很好的工具,以避免数据读取器的所有痛苦。

答案 4 :(得分:0)

尝试我在这篇文章中回复的解决方案 my reply

实际上是类型混淆问题,应该是编译器 时间问题。但是在运行时将可空字符串传递给 AddWithValue(string, object)

如果要string,请通过Microsoft c#将DBNull.Value强制转换为string DBNull库内置方法DBNull.Value.ToString()等效 string.Empty

如果要使用泛型类型,则将字符串(对象)str强制转换。