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

本文关键字:NULL 插入 SQL 字符串 | 更新日期: 2023-09-27 18:30:41

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

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

我收到以下异常:

参数

化查询需要参数 @ odjezd

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

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

尝试改用 DbNull.Value 值。

所以它变成了

prikaz.Parameters.AddWithValue("@odjezd", 
         string.IsNullOrEmpty(cb_odjezd.Text) ? DbNull.Value : cb_odjezd.Text);

编辑

在这里接受答案

在您的情况下应该足以(object)DBNull.Value

问题是 C# 需要在此处条件中具有相同的类型值,但在一种情况下,您在另一个string中设置DbNull.Value。因此,将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_expressionsecond_expression的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

?:不能强制type本身,这里你返回的要么是string要么是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引用和空Nullable<T>视为DBNull.Value。此外,这意味着您可以避免 ADO.NET 的所有"乐趣",只需担心:

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

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

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

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

如果你想要stringDBNull.Value强制string由Microsoft C#进行 DBNull 库内置方法等效DBNull.Value.ToString() string.Empty .

如果需要泛型类型,则强制转换字符串 (对象)str。