2009-02-04 11 views
8

Ich arbeite an einer DAL, die einen DataReader asynchron erhält.Die beste Methode zum Füllen von DataSet aus einem SQLDataReader

Ich möchte eine einzelne Methode zum Umwandeln des DataReader in ein DataSet schreiben. Es muss mit einem anderen Schema umgehen, so dass diese eine Methode alle meine Abrufanforderungen verarbeiten kann.

P.S. Ich bearbeite den SQLDataReader asynchron, bitte gebe keine Antworten, die den DataReader loswerden.

+0

War DataSet.Load () nicht gut? http://msdn.microsoft.com/en-us/library/5fd1ahe2.aspx –

+0

Eigentlich war ich dieser Option nicht bewusst. Ich kann es kaum erwarten zu sehen, wie komplex das .Net-Framework in Version 5 usw. sein wird. –

+0

Entweder war ich, danke dafür, Matt! – Phaedrus

Antwort

9

Versuchen Sie DataSet.Load(). Es hat mehrere Überladungen unter Verwendung eines IDataReader.

+0

Beendet mit einer DataTable (die die gleiche Methode hat) –

+2

es benötigt string [] oder DataTable [] als dritter Parameter. Gibt es eine Möglichkeit, anfänglich leeres DataSet ohne Tabellen zu füllen, ohne vorher dessen Schema zu kennen? Es sieht auch so aus, als ob diese Lösung teilweise blockiert, da DataSet.Load() die ReadAsync() - und NextResultAsync() - Methoden von SqlDataReader nicht nutzt – KolA

14

DataTable.load() kann für einen generischen Ansatz verwendet werden.

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

Dies ist die Antwort auf die gestellte Frage. Vielen Dank. – mcNux

0

Wenn aus irgendeinem Grund die Load-Methode fehlschlägt, hier eine manuelle Art und Weise ist, es zu tun:

    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); 
         } 

Ein anderer Weg ist SqlTableAdapter zu verwenden:

var adapter = new SqlDataAdapter(command); 
DataSet ds = new DataSet(); 
adapter.Fill(ds); 
Verwandte Themen