让替换 Null 为 DBNull.Value 更加容易
一个帮助将 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日:首次发布