【问题标题】:Insert NULL into SQL when string is empty当字符串为空时将 NULL 插入 SQL
【发布时间】:2013-09-13 18:25:35
【问题描述】:

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

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

我收到以下异常:

参数化查询需要参数@odjezd

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

【问题讨论】:

    标签: c# sql sql-server winforms


    【解决方案1】:

    尝试改用DbNull.Value 值。

    所以变成了

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

    编辑

    接受回答here,在你的情况下(object)DBNull.Value应该足够了

    问题是 C# 期望 same type 值在此条件下,但在一种情况下,您 在另一个string 中设置DbNull.Value。因此,将DbNull.Value 转换为对象可以“通过”该规则。

    【讨论】:

    • 它说:无法确定条件表达式的类型,因为Systém.DBnull和字符串之间没有隐式转换。有什么想法吗?
    • 将一侧或另一侧的演员表插入(object) 以使其编译,例如? (object)DbNull.Value : cb_objezd.Text
    • @Marek 有一件事,你的datatypenullable
    【解决方案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 类表示数据库字段中不存在的值。

    【讨论】:

    • 无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换
    • 它说:无法确定条件表达式的类型,因为 Systém.DBnull 和字符串之间没有隐式转换,请您帮我解决这个问题吗?
    • @Marek 错误告诉你?(Operator ,branches etc.)的两边有不同的类型,你必须将它们隐式转换为通用类型。
    【解决方案3】:

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

    ?: 本身不能转换type,这里你返回一个stringDbNull 类型值,所以你必须将_objezd.Text 的实例转换为对象类型以使其兼容。

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

    【讨论】:

      【解决方案4】:

      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-references 和空的 Nullable<T> 视为 DBNull.Value。另外,这意味着您可以避免 ADO.NET 的所有“乐趣”,只需担心:

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

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

      【讨论】:

        【解决方案5】:

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

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

        如果你想要string,请将DBNull.Value 转换为string by microsoft c# DBNull 库内置方法DBNull.Value.ToString() 等效 string.Empty.

        如果你想要一个泛型类型转换字符串(对象)str。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-16
          • 2013-06-22
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 2014-09-10
          • 1970-01-01
          相关资源
          最近更新 更多