2009-02-04 12 views
8

Sto lavorando a un DAL che sta ricevendo un DataReader in modo asincrono.Metodo migliore per il popolamento di DataSet da SQLDataReader

Vorrei scrivere un singolo metodo per trasformare il DataReader in un DataSet. Ha bisogno di gestire diversi schemi in modo che questo metodo gestirà tutte le mie esigenze di recupero.

P.S. Sto popolando SQLDataReader in modo asincrono, per favore non dare risposte che si stanno sbarazzando di DataReader.

+0

Was DataSet.Load () non buono? http://msdn.microsoft.com/en-us/library/5fd1ahe2.aspx –

+0

In realtà non ero a conoscenza di questa opzione. Non vedo l'ora di vedere quanto sarà complesso il framework .Net nella versione 5, ecc. –

+0

O sono stato io, grazie per questo Matt! – Phaedrus

risposta

9

Prova DataSet.Load(). Ha diversi overload che richiedono un IDataReader.

+0

Terminato l'utilizzo di un DataTable (che ha lo stesso metodo) –

+2

ha bisogno di string [] o DataTable [] come terzo parametro. C'è un modo per popolare inizialmente DataSet vuoto senza tabelle senza conoscere il suo schema in anticipo? Sembra inoltre che questa soluzione stia parzialmente bloccando DataSet.Load() non sfrutterà i metodi ReadAsync() e NextResultAsync() di SqlDataReader – KolA

14

DataTable.load() può essere utilizzato per un approccio generico.

do { 
    var table = new DataTable(); 
    table.Load(reader); 
    dataset.Tables.Add(table); 
} while(!reader.IsClosed); 
+0

Questa è la risposta alla domanda posta. Grazie. – mcNux

0

Se per qualche motivo il metodo Load non riesce, ecco un modo manuale per farlo:

    DataTable dt = new DataTable(); 
        dt = sdr.GetSchemaTable(); 
        //dt.Constraints.Clear(); 
        //dt.PrimaryKey = null; 
        //dt.BeginLoadData(); 
        if (sdr.HasRows) 
        { 
         DataRow row; 
         while (sdr.Read()) 
         { 
          row = dt.NewRow(); 
          sdr.GetValues(row.ItemArray); 
          dt.Rows.Add(row); 
         } 

Un altro modo è quello di utilizzare SqlTableAdapter:

var adapter = new SqlDataAdapter(command); 
DataSet ds = new DataSet(); 
adapter.Fill(ds); 
Problemi correlati