当我的组合框中没有选择任何内容时尝试插入 NULL 但是当我这样做时:
prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
null : cb_odjezd.Text);
我收到以下异常:
参数化查询需要参数@odjezd
有人可以帮我解决这个问题吗?
当我的组合框中没有选择任何内容时尝试插入 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# 在这里的条件中需要相同的类型值,但在一种情况下,您DbNull.Value
在另一种情况下设置了string
. 因此,投射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
必须相同,或者必须存在从一种类型到另一种类型的隐式转换。- MSDN。
?:
不能type
自行转换,在这里您返回的是 astring
或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
-references 和 emptyNullable<T>
视为DBNull.Value
. 另外,这意味着您可以避免 ADO.NET 的所有“乐趣”,只需担心:
请注意,dapper 在物化方面也有很好的工具,以避免数据读取器的所有痛苦。
试试我从这篇文章中回复的解决方案 我的回复
实际上这是一个类型混淆问题,应该是编译器时间问题。但是当可空字符串传递给
AddWithValue(string, object)
.如果需要
string
,DBNull.Value
可以string
通过 microsoft c# DBNull 库内置方法DBNull.Value.ToString()
等效地 转换为string.Empty
。如果你想要一个泛型类型转换字符串(对象)str。