2009-02-04 6 views
8

Je travaille sur une couche d'accès au client qui reçoit un DataReader de manière asynchrone.Meilleure méthode de remplissage de DataSet à partir d'un SQLDataReader

Je voudrais écrire une méthode unique pour transformer le DataReader en un DataSet. Il doit gérer différents schémas afin que cette méthode puisse gérer tous mes besoins de récupération.

P.S. Je remplis le SQLDataReader de manière asynchrone, s'il vous plaît ne donnez pas de réponses qui se débarrassent du DataReader.

+0

était-DataSet.Load () pas bien? http://msdn.microsoft.com/en-us/library/5fd1ahe2.aspx –

+0

En fait, je n'étais pas au courant de cette option. Vous ne pouvez pas attendre pour voir à quel point le framework .Net sera complexe dans la version 5 etc –

+0

Soit j'étais, merci Matt! – Phaedrus

Répondre

9

Essayez DataSet.Load(). Il a plusieurs surcharges prenant un IDataReader.

+0

Terminé en utilisant un DataTable (qui a la même méthode) –

+2

il a besoin de string [] ou DataTable [] comme troisième paramètre. Est-il possible de remplir un DataSet initialement vide sans tables sans connaître préalablement son schéma? Il semble également que cette solution bloque partiellement car DataSet.Load() ne tire pas parti des méthodes ReadAsync() et NextResultAsync() de SqlDataReader – KolA

14

DataTable.load() peut être utilisé pour une approche générique.

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

Ceci est la réponse à la question posée. Merci. – mcNux

0

Si pour une raison quelconque la méthode de chargement échoue, voici un moyen manuel pour le faire:

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

Une autre façon est d'utiliser SqlTableAdapter:

var adapter = new SqlDataAdapter(command); 
DataSet ds = new DataSet(); 
adapter.Fill(ds); 
Questions connexes