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

Posted

技术标签:

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

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

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

我收到以下异常:

参数化查询需要参数@odjezd

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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于当字符串为空时将 NULL 插入 SQL的主要内容,如果未能解决你的问题,请参考以下文章

当使用 Ajax Laravel 的 datepicker 为空时在 DB 中插入 NULL

怎样用SQL语句在某一值为空时赋值给它另一个值

SQL 将某列数据赋值到上一行

Sql Server 2005中当两个整型字段中一个为空时如何比较大小?

当日期为空时,在访问中的日期列中插入空值

Gson教程九(译):强制序列化null值