如何从一个DataRow或使用相同的code DataReader的阅读? [英] How can I read from a DataRow or a DataReader using the same code?
问题描述
目前,我使用的是 SqlDataReader的
装了一个简单的数据库选择查询。每一行再presents域对象,所以我吹这样的每个对象:
Currently, I am using a SqlDataReader
loaded up with a simple database 'Select' query. Each row represents a domain object, so I inflate each object like this:
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 code>方法我写看起来是这样的:
The GetItemFromData
method I wrote looks something like this:
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的
的读取数据。但是,code将是完全相同的!当我看着我的 GetItemFromData code>的方法,我要接受在
博士
参数,以便对象更宽泛的类型我可以把一个的DataReader
一样的的DataRow
,因为我会在里面写完全相同的code如果我写了一个意在使用的DataRow
的方法。有没有办法做到这一点?
In some cases, I have to read data from a DataRow
instead of a SqlDataReader
. But the code would be the exact same! As I look at my GetItemFromData
method, I want to accept a more generic type of object in the dr
parameter so that I can treat a DataReader
the same as a DataRow
, since I would be writing the exact same code inside the method if I wrote one that was meant to use a DataRow
. Is there a way to do that?
推荐答案
只有这样我能想到把我的头顶部将包裹几类和实施inferface - 是这样的:
Only way I can think of off the top of my head would be to wrap a few classes and implement an inferface - something like:
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
您将不得不将它传递给你的方法之前,包装你的行或阅读器:
You would then have to wrap your row or reader before passing it to your method:
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))
这篇关于如何从一个DataRow或使用相同的code DataReader的阅读?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!