当字符串为空时,将NULL插入SQL

3

当我尝试在未选择任何选项的组合框中插入NULL时,出现问题:

prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
                                               null : cb_odjezd.Text);

我收到了以下异常:

参数化查询需要参数 @odjezd

请有人帮我解决这个问题吗?
5个回答

8

尝试使用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强制转换为对象可以使其符合规则。


它说:无法确定条件表达式的类型,因为Systém.DBnull和字符串之间没有隐式转换。有什么想法吗? - Marek
插入一个强制转换 (object) 到一边或另一边,使其编译通过,例如 ? (object)DbNull.Value : cb_objezd.Text - Damien_The_Unbeliever
@Marek 有一件事,你的 datatypenullable 吗? - Suraj Singh

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 类表示数据库字段中不存在的值。

4
无法确定条件表达式的类型,因为 "System.DBNull" 和 "string" 之间不存在隐式转换。 - MarcinJuraszek
它说:无法确定条件表达式的类型,因为Systém.DBnull和字符串之间没有隐式转换,请您帮我解决这个问题好吗? - Marek
@Marek,错误提示告诉你?(运算符、分支等)两侧具有不同的类型,你必须将它们隐式转换为一个公共类型。 - Suraj Singh

2

first_expressionsecond_expression的类型必须相同,或者存在从一种类型到另一种类型的隐式转换。- MSDN.

?:不能转换type本身,这里你返回了一个stringDbNull类型的值,所以你需要将_objezd.Text的实例强制转换为对象类型使其兼容。

 prikaz.Parameters.AddWithValue("@odjezd", 
  _odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);

1

DBNull有点麻烦,而且影响很多人。然而,避免这种痛苦的一种方法是使用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的“有趣”之处,只需要关注以下内容:
  • 连接管理
  • SQL语句
  • 参数值是什么(但不包括参数化本身)
请注意,Dapper还具有出色的实体转换工具,以避免所有数据读取器的痛苦。

1

尝试使用我在此帖子中回复的解决方案my reply

实际上这是一个类型混淆问题,应该是编译器时间问题。但是当可空字符串传递给AddWithValue(string, object)时会在运行时出现问题。

如果您想要string,请通过Microsoft C# DBNull库内置方法DBNull.Value.ToString()DBNull.Value强制转换为string,等效于string.Empty

如果您想要一个通用类型,请将字符串(object)str进行类型转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接