目前,我正在使用加载了简单数据库“选择”查询的 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
参数中接受更通用的对象类型,以便我可以处理 DataReader
与 DataRow
相同,因为如果我编写一个旨在使用 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/