尝试在我的组合框中没有选择任何内容时插入NULL但是当我这样做时:
prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
null : cb_odjezd.Text);
我收到以下异常:
参数化查询需要参数@ odjezd
有人可以帮我解决这个问题吗?
答案 0 :(得分:7)
尝试使用DbNull.Value值。
所以它变成
prikaz.Parameters.AddWithValue("@odjezd",
string.IsNullOrEmpty(cb_odjezd.Text) ? DbNull.Value : cb_odjezd.Text);
编辑
加入 acepted 回答here,对您而言,(object)DBNull.Value
问题是C#期望相同类型的值在这里有条件,但在一种情况下你
在另一个DbNull.Value
中设置string
。因此,将DbNull.Value
强制转换为对象会使“通过”该规则。
答案 1 :(得分: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类表示数据库字段中不存在的值。
答案 2 :(得分:2)
first_expression
和second_expression
的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换.- MSDN。
?:
无法投放type
本身,您要返回string
或DbNull
类型的值,因此您必须投射_objezd.Text
的实例对象类型以使其兼容。
prikaz.Parameters.AddWithValue("@odjezd",
_odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);
答案 3 :(得分:1)
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
- 引用并将Nullable<T>
清空为DBNull.Value
。此外,它意味着您可以避免ADO.NET的所有“乐趣”,只需担心:
请注意,dapper在实现方面也有很好的工具,以避免数据读取器的所有痛苦。
答案 4 :(得分:0)
尝试我在这篇文章中回复的解决方案 my reply
实际上是类型混淆问题,应该是编译器 时间问题。但是在运行时将可空字符串传递给
AddWithValue(string, object)
。如果要
string
,请通过Microsoft c#将DBNull.Value
强制转换为string
DBNull库内置方法DBNull.Value.ToString()
等效string.Empty
。如果要使用泛型类型,则将字符串(对象)str强制转换。