3

当我的组合框中没有选择任何内容时尝试插入 NULL 但是当我这样做时:

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

我收到以下异常:

参数化查询需要参数@odjezd

有人可以帮我解决这个问题吗?

4

5 回答 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到对象使“通过”该规则。

于 2013-09-10T06:46:17.420 回答
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 类表示数据库字段中不存在的值。

于 2013-09-10T06:45:03.970 回答
2

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

?:不能type自行转换,在这里您返回的是 astringDbNull类型值,因此您必须将实例_objezd.Text转换为对象类型以使其兼容。

 prikaz.Parameters.AddWithValue("@odjezd", 
  _odjezd.Text == string.Empty ? DbNull.Value : (object)cb_odjezd.Text);
于 2013-09-10T08:12:22.363 回答
1

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 的所有“乐趣”,只需担心:

  • 连接管理
  • sql
  • 参数值是什么(但不是参数化本身)

请注意,dapper 在物化方面也有很好的工具,以避免数据读取器的所有痛苦。

于 2013-09-10T07:17:56.377 回答
1

试试我从这篇文章中回复的解决方案 我的回复

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

如果需要stringDBNull.Value可以string通过 microsoft c# DBNull 库内置方法DBNull.Value.ToString()等效地 转换为string.Empty

如果你想要一个泛型类型转换字符串(对象)str。

于 2020-06-01T14:29:21.820 回答