目录
介绍
只是一个关于函数的快速提示,该函数将处理所有可为null的类型并使其更容易插入DBNull.Value到数据库中。
背景
很久以前,我在The Weird & the Wonderful上发布了类似的方法,今天我又需要它了。但是,今天我使它变得更好,通过使它成为通用的——采用所有可为空的类型。
使用代码
这是(Update)方法
一位评论员提到我仍然可以使用??操作符。
我忘了,我可以在实际方法中使用合并运算符,因此该方法仅变为一行。简洁啦!
private Object convertDbNull<T>(T origValue){
if (origValue == null){
return System.DBNull.Value;
}返回原始值;
}
private Object convertDbNull<T>(T origValue){
return (Object)origValue ?? System.DBNull.Value;
}
这是我花在小提示/技巧上的时间最多的一次。😆
这是如何使用它
command.Parameters.AddWithValue("$screenName", convertDBNull(task.screenName));
现在,如果task.screenName == 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);
但是,这就是我的方法所做的,该方法再次处理所有类型。
也许还有其他人认为他们也可以在这里使用合并运算符,他们是对这篇文章投反对票的人?不确定,但这应该可以解决这个问题。
https://www.codeproject.com/Tips/5355559/Making-It-Easier-to-Replace-Null-with-DBNull-Value