从 DataAdapter 拉数据时如何处理 DBNull

Posted

技术标签:

【中文标题】从 DataAdapter 拉数据时如何处理 DBNull【英文标题】:How To Handle DBNull When Pulling data from DataAdapter 【发布时间】:2017-02-17 19:57:42 【问题描述】:

我已将 MSSQL 数据集导入 Visual Studio 的数据集设计器,但遇到不可为空类型的问题。我的数据库允许使用空整数(如果可能的话,我希望保持这种状态),但.NET 中的整数不能为空。我很想在 .NET 中使用可为空的整数,但该数据类型似乎不是 DataSet Designer 的 DataType 属性的下拉列表中允许的选项。

我不希望每次为了将数据类型更改为可为空的整数而进行架构更改时都必须手动编辑 DataSet.Designer 类文件。当我引用 DBNull 属性时,我只想让我的属性返回 Null/Nothing,而不是抛出 StrongTypingException。

我看到数据集设计器中有一个 NullValue 列属性,但我不允许选择“返回 Null”,除非我的数据类型是 Object

有没有使用设计器中的设置或简洁的包装函数来处理 DBNULL > Null 转换的干净方法?我不想每次调用这些属性之一时都对每一列使用 IsColumnNameNull() 函数。我也不想每次都将对象转换为它们的实际类型。

如果我看错了这个问题,请告诉我。任何反馈表示赞赏。谢谢!

【问题讨论】:

msdn.microsoft.com/en-us/library/1t3y8s4s.aspx; .net 中的可空类型。 您也可以使用 int32.tryparse 并将所有空整数视为负值或其他默认值,如果您想将它们保留为普通整数。 【参考方案1】:

您可以使用来自System.Data.DataSetExtensions 程序集的通用扩展方法.Field<T>("ColumnName")

int? intValue = datarow.Field<int?>("CustomerId"); // c#
Dim intValue As Integer? = datarow.Field(Of Integer?)("CustomerId") ' vb.net

但是你可以创建一个具有正确类型的类,它代表一行的数据,只实例化一次以供使用。

或者摆脱DataSetDataTableDataRow 类型,并使用具有已定义属性类型的轻型“POCO”类。

通过使用类,您可以使您的应用程序对未来的更改更具可扩展性 - 例如从 DataSet 迁移到某些 ORM 框架,使用类您可以更改数据访问而不影响主要业务逻辑。

【讨论】:

感谢专家的观点。我将尝试其中的一些解决方案。

以上是关于从 DataAdapter 拉数据时如何处理 DBNull的主要内容,如果未能解决你的问题,请参考以下文章

查询时如何处理db中随机字母大小写实例?

连接停止时如何处理猫鼬数据库

从 watchkit 请求数据时如何处理这个错误

从 JSON + Swift 或 ObjC 检索数据时如何处理 CoreData 中的关系

访问从不同线程访问的控件时如何处理无效的跨线程操作?

从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?