当我尝试在未选择任何选项的组合框中插入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);
}
System.DBNull
" 和 "string
" 之间不存在隐式转换。 - MarcinJuraszek?
(运算符、分支等)两侧具有不同的类型,你必须将它们隐式转换为一个公共类型。 - Suraj Singhfirst_expression
和second_expression
的类型必须相同,或者存在从一种类型到另一种类型的隐式转换。- MSDN.
?:
不能转换type
本身,这里你返回了一个string
或DbNull
类型的值,所以你需要将_objezd.Text
的实例强制转换为对象类型使其兼容。
prikaz.Parameters.AddWithValue("@odjezd",
_odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);
DBNull有点麻烦,而且影响很多人。然而,避免这种痛苦的一种方法是使用ORM或微ORM,它可以让这个问题消失。例如,使用dapper:
int id = ...
string odjezd = ...
...
connection.Execte("insert SomeTable (...) values (@id, @odjezd, ...)",
new {id, odjezd, ... });
null
引用和空的Nullable<T>
视为DBNull.Value
。此外,这意味着您可以避免所有ADO.NET的“有趣”之处,只需要关注以下内容:
尝试使用我在此帖子中回复的解决方案my reply
实际上这是一个类型混淆问题,应该是编译器时间问题。但是当可空字符串传递给
AddWithValue(string, object)
时会在运行时出现问题。如果您想要
string
,请通过Microsoft C# DBNull库内置方法DBNull.Value.ToString()
将DBNull.Value
强制转换为string
,等效于string.Empty
。如果您想要一个通用类型,请将字符串(object)str进行类型转换。
(object)
到一边或另一边,使其编译通过,例如? (object)DbNull.Value : cb_objezd.Text
- Damien_The_Unbelieverdatatype
是nullable
吗? - Suraj Singh