从 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
但是你可以创建一个具有正确类型的类,它代表一行的数据,只实例化一次以供使用。
或者摆脱DataSet
、DataTable
和DataRow
类型,并使用具有已定义属性类型的轻型“POCO”类。
通过使用类,您可以使您的应用程序对未来的更改更具可扩展性 - 例如从 DataSet 迁移到某些 ORM 框架,使用类您可以更改数据访问而不影响主要业务逻辑。
【讨论】:
感谢专家的观点。我将尝试其中的一些解决方案。以上是关于从 DataAdapter 拉数据时如何处理 DBNull的主要内容,如果未能解决你的问题,请参考以下文章