65.9K
CodeProject 正在变化。 阅读更多。
Home

让替换 Null 为 DBNull.Value 更加容易

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (12投票s)

2023年2月26日

CPOL

2分钟阅读

viewsIcon

35462

一个帮助将 null 转换为 DBNull.Value 的函数,用于数据库插入

引言

只是一个关于函数的快速提示,它可以处理所有可空类型,并使将 DBNull.Value 插入数据库变得更容易。

背景

我很久以前在 The Weird & the Wonderful 中发布了一个类似的方法,今天我又需要它了。 但是,今天我通过使其成为泛型方法来改进它——接受所有可空类型。

Using the Code

这是(更新后的)方法

一位评论者提到我仍然可以使用 ?? 运算符。
我忘了,我可以在实际方法中使用合并运算符,这样方法就只有一行了。简洁至上!

private Object convertDbNull<T>(T origValue){
  if (origValue == null){
   return System.DBNull.Value;
  }
  return origValue;
}

private Object convertDbNull<T>(T origValue){
  return (Object)origValue ?? System.DBNull.Value;
}

呼...这是我花在这么一个小技巧/窍门上的最多时间。😆

以下是如何使用它

command.Parameters.AddWithValue("$screenName", convertDBNull(task.screenName));

现在,如果 task.screenName == null 的值为 null,那么它将被转换为 DBNull.Value
但是,如果该值不是 null,那么该值将被返回并插入到数据库中。

模板代码:泛型

此外,由于该方法接受任何可空类型(String 默认情况下是可空的),例如 Int32? 或 bool?,因此该方法将适用于该类型。

不再需要烦恼和担心将 null 转换为 DBNull.Value

更新 - 有人询问了 ?? 运算符

有人发表评论询问以下代码为什么不起作用

command.Parameters.AddWithValue("$screenName", task.screenName ?? DBNull.Value);

这段代码使用了 null 合并运算符,它是一个很好的简写方式。

这正是我也希望能够起作用的代码。 不幸的是,它无法编译。

你知道为什么吗? 你能看到为什么这段代码无法编译吗? 这并不明显,你会得到一个有点神秘的错误,看起来像

运算符 '??' 不能应用于类型为 'string' 和 'DBNull' 的操作数

它试图表明你正在比较两种不同的类型(一个 string 和一个 dbnull),并且编译器无法在 null 合并运算符上执行此操作。

你可以通过将 String 强制转换为 object 使用以下代码来修复该代码

command.Parameters.AddWithValue("$screenName", (object) task.screenName ?? DBNull.Value);

但是,这正是我的方法所做的,而且再次强调,该方法处理所有类型。

也许还有其他人认为他们可以使用合并运算符,并且他们是那些投票反对这篇文章的人? 不确定,但这应该能澄清这个问题。

历史

  • 2023年3月9日:更新了有关使用合并运算符的信息
  • 2023年2月26日:首次发布
© . All rights reserved.