Как я могу читать из DataRow или DataReader, используя один и тот же код? - PullRequest
1 голос
/ 05 октября 2011

В настоящее время я использую 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.Есть ли способ сделать это?

Ответы [ 2 ]

5 голосов
/ 06 октября 2011

Единственный способ, который я могу придумать, - это обернуть несколько классов и реализовать промежуточный интерфейс - что-то вроде:

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))
0 голосов
/ 06 октября 2011

Как насчет использования DataTable вместо:

Dim DataTable table AS new DataTable()
table.Load(GetItemsDataReader())
foreach (DataRow row in table.Rows) {
   Dim item As Item = GetItemFromData(row)
   loadedItems.Add(item)
}

Измените метод GetItemFromData (), чтобы он принимал DataRow вместо DataReader (извините за гибридное псевдо VB.NET/C#код).

...