如何从一个DataRow或使用相同的code DataReader的阅读? [英] How can I read from a DataRow or a DataReader using the same code?

查看:104
本文介绍了如何从一个DataRow或使用相同的code DataReader的阅读?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前,我使用的是 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 方法我写看起来是这样的:

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 的方法,我要接受在博士参数,以便对象更宽泛的类型我可以把一个的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆