当字符串为空时,将 NULL 插入 SQL 中
本文关键字:NULL 插入 SQL 字符串 | 更新日期: 2023-09-27 18:30:41
当我的组合框中没有选择任何内容时尝试插入 NULL,但是当我这样做时:
prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
null : cb_odjezd.Text);
我收到以下异常:
参数化查询需要参数 @ odjezd
有人可以帮我解决这个问题吗?
尝试改用 DbNull.Value 值。
所以它变成了
prikaz.Parameters.AddWithValue("@odjezd",
string.IsNullOrEmpty(cb_odjezd.Text) ? DbNull.Value : cb_odjezd.Text);
编辑
在这里接受答案,在您的情况下应该足以(object)DBNull.Value
问题是 C# 需要在此处条件中具有相同的类型值,但在一种情况下,您在另一个string
中设置DbNull.Value
。因此,将DbNull.Value
投向对象使"通过"该规则。
使用 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 表示数据库字段中不存在的值。
first_expression
和second_expression
的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。
?:
不能强制type
本身,这里你返回的要么是string
要么是DbNull
类型值,所以你必须将_objezd.Text
的实例强制转换为对象类型以使其兼容。
prikaz.Parameters.AddWithValue("@odjezd",
_odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);
DBNull 坦率地说有点像 PITA - 它咬了很多人。但是,避免这种痛苦的一种方法是使用ORM或micro-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 在物化方面也有很棒的工具,以避免数据读取器的所有痛苦。
试试我从这篇文章中回复的解决方案我的回复
实际上这是一个类型混淆问题,应该是一个编译器 时间问题。 但是在运行时将可为空的字符串传递给
AddWithValue(string, object)
.如果你想要
string
,DBNull.Value
强制string
由Microsoft C#进行 DBNull 库内置方法等效DBNull.Value.ToString()
string.Empty
.如果需要泛型类型,则强制转换字符串 (对象)str。