当字符串为空时将 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 有一件事,你的datatype
是nullable
?【参考方案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_expression
和second_expression
的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。-MSDN。
?:
本身不能转换type
,这里你返回一个string
或DbNull
类型值,所以你必须将_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 的所有“乐趣”,只需担心:
请注意,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