提问人:David Wengier 提问时间:8/16/2008 最后编辑:burning_LEGIONDavid Wengier 更新时间:8/12/2012 访问量:15233
C# 数据库访问:DBNull 与 null
C# Database Access: DBNull vs null
问:
我们在这里使用自己的 ORM,并为所有 db 表提供强类型包装器。我们还允许执行弱类型的即席 SQL,但这些查询仍然通过相同的类从数据读取器中获取值。
在调整该类以使用 Oracle 时,我们遇到了一个有趣的问题。使用 DBNull.Value 还是 null 更好?使用 DBNull.Value 有什么好处吗?使用 null 似乎更“正确”,因为我们已经将自己与数据库世界分开了,但也有影响(例如,当一个值为 null 时,你不能盲目地这样做),所以它绝对是我们需要做出有意识的决定。ToString()
答:
根据我的经验,.NET DataTables 和 TableAdapter 可以更好地与 DBNull 配合使用。它还会在强类型时打开一些特殊方法,例如 DataRow.IsFirstNameNull。
我希望我能给你一个比这更好的技术答案,但对我来说,底线是在处理数据库相关对象时使用 DBNull,然后在处理对象和 .NET 相关代码时使用“标准”null。
用。
我们在使用 null 时遇到了一些问题。
如果我没记错的话,您不能将空值插入到字段中,只能插入 DBNull。
可能只与Oracle有关,对不起,我不知道细节了。DBNull
我发现最好使用 null 而不是 DB null。
原因是,正如你所说,你正在将自己与DB世界分开。
通常,最好检查引用类型,以确保它们无论如何都不为 null。您将检查数据库数据以外的内容是否为 null,我发现最好在整个系统中保持一致性,并使用 null,而不是 .DBNull
从长远来看,从架构上讲,我发现它是更好的解决方案。
如果你已经编写了自己的 ORM,那么我会说只使用 null,因为你可以随心所欲地使用它。我相信 DBNull 最初只是为了解决值类型(int、DateTime 等)不能为 null 的事实,因此他们没有返回一些值,例如 zero 或 DateTime.Min,这意味着 null(bad,bad),他们创建了 DBNull 来指示这一点。也许还有更多,但我一直认为这就是原因。但是,现在我们在 C# 3.0 中拥有可为 null 的类型,因此不再需要 DBNull。事实上,LINQ to SQL 只是到处使用 null。完全没问题。拥抱未来...使用 null。;-)
评论