2016-08-24 3 views
0

Учитывая существующий DataReader (в данном случае OleDbDataReader), я могу построить DataTable с помощью DataTable.Load:DataReader на пустой DataTable

// C# 
OleDbDataReader dr = SomeMethodThatReturnsADataReader(); 
var dt = new DataTable(); 
dt.Load(dr); 
' VB.NET 
Dim dr As OleDbDataReader = SomeMethodThatReturnsADataReader(); 
Dim dt = New DataTable() 
dt.Load(dr); 

Однако это загружает данные из DataReader в DataTable ,

Я хочу создать DataTable, который соответствует структуре существующего DataReader, но не содержит данных.

Как я могу это сделать?

Редактировать

На дальнейших размышлений, я понимаю, нет встроенного метода, чтобы сделать это. Однако может ли проблема разбиться на две части?

  1. Извлечение информации схемы из DataReader
  2. нагрузки этой схемы информации в новую DataTable
+0

Вам может понадобиться объяснить далее - те DataReaders просто объявлены; мы не можем создавать DataReaders, они всегда созданы для нас. Итак, откуда вы пришли? – Plutonix

+0

@Plutonix «DataReader» фактически создан в другом месте; Я изменил код, чтобы уточнить это. –

+0

Я бы создал еще один метод для возврата DataTable с загруженной таблицей def - DataReader на самом деле не предназначен для этого. Учитывая то, как они могут заблокировать соединение, может быть неплохо, чтобы читатель просто лежал вокруг. – Plutonix

ответ

0

The DataAdapter Class, который является базовым классом OleDbDataAdapter и других, имеет Protected FillSchema Method, который принимает IDataReader, чтобы заполнить пустую схему DataTable в соответствии с полями читателя.

Чтобы использовать эту функцию, вам нужно построить небольшой класс утилиты.

Friend Class ReaderAdapter 
    Inherits System.Data.Common.DataAdapter 

    Public Function GetTypedTable(dataReader As IDataReader) As DataTable 
     Dim ret As New DataTable 
     FillSchema(ret, Data.SchemaType.Source, dataReader) 
     Return ret 
    End Function 
End Class 

Пример использования:

Dim rdr As OleDb.OleDbDataReader = cmd.ExecuteReader 
Dim ra As New ReaderAdapter() 
Dim emptyTypedTable As DataTable = ra.GetTypedTable(rdr) 
Смежные вопросы