.net - 如何使用相同的代码从 DataRow 或 DataReader 读取数据?

标签 .net datareader datarow

目前,我正在使用加载了简单数据库“选择”查询的 SqlDataReader。每行代表一个领域对象,所以我像这样膨胀每个对象:

Dim loadedItems As New List(Of Item)
Dim dr As SqlDataReader = GetItemsDataReader()
While dr.Read()
  Dim item As Item = GetItemFromData(dr)
  loadedItems.Add(item)
End While

我编写的 GetItemFromData 方法如下所示:

Private Function GetItemFromData(dr As SqlDataReader) As Item
  Dim loadedItem As New Item()
  loadedItem.ID = dr("ID")
  loadedItem.Name = dr("Name")
  'etc., etc.'
  Return loadedItem
End Function

在某些情况下,我必须从 DataRow 而不是 SqlDataReader 读取数据。但是代码是完全一样的!当我查看我的 GetItemFromData 方法时,我想在 dr 参数中接受更通用的对象类型,以便我可以处理 DataReaderDataRow 相同,因为如果我编写一个旨在使用 DataRow 的代码,我将在方法中编写完全相同的代码。有办法吗?

最佳答案

我能想到的唯一方法是包装一些类并实现一个接口(interface)——类似于:

Interface IIndexer
    Default ReadOnly Property Item(ByVal index As String)
End Interface

Class DataReaderWrapper
    Implements IIndexer

    Private ReadOnly _reader As IDataReader

    Public Sub New(reader As IDataReader)
        _reader = reader
    End Sub

    Public ReadOnly Property Item(index As String) As Object Implements IIndexer.Item
        Get
            Return _reader(index)
        End Get
    End Property
End Class

Class DataRowWrapper
    Implements IIndexer

    Private ReadOnly _row As DataRow

    Public Sub New(row As DataRow)
        _row = row
    End Sub

    Public ReadOnly Property Item(index As String) As Object Implements IIndexer.Item
        Get
            Return _row(index)
        End Get
    End Property
End Class

然后您必须在将行或阅读器传递给您的方法之前包装它:

Private Function GetItemFromData(indexer As IIndexer) As Item
    Dim loadedItem As New Item()
    loadedItem.ID = indexer("ID")
    loadedItem.Name = indexer("Name")
    'etc., etc.'
    Return loadedItem
End Function

Dim i As Item = GetItemFromData(New DataRowWrapper(dr))

关于.net - 如何使用相同的代码从 DataRow 或 DataReader 读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666943/

相关文章:

c# - 如何计算 MySqlDataReader 中的行数?

c# - 带空格的枚举 .TryParse 不起作用 - C#

c# - 根据其他选定的下拉列表项更改一个下拉列表数据

c# - SQL Server CLR 与第 3 方 SDK 集成 : Error on missing assembly System. 绘图

c# - 也许 monad 使用表达式树?

python - 学习使用 pandas datareader 绘制雅虎股价,但似乎不正确

c# - IDataReader - 有什么方法可以获取总行数?

C# 反射 : Getting the fields of a DataRow from a Typed DataSet

c# - RowState.Added 和 DataRowVersion.Original 之间有什么区别

c# - DataRow 列和字符串值比较