SqlDataReader vs SqlDataAdapter: lequel a la meilleure performance pour retourner un DataTable?

je veux savoir qui a la meilleure performance pour retourner un DataTable . Ici pour SqlDataReader j'utilise DataTable.Load(dr)

utilisant SqlDataReader :

public static DataTable populateUsingDataReader(string myQuery)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlCommand cmd = new SqlCommand(myQuery, con);
        con.Open();
        SqlDataReader dr = null;
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        if (dr.HasRows)
        {
            dt.Load(dr);
        }
        return dt;
    }
}

utilisant SqlDataAdapter :

public DataTable populateUsingDataAdapter(string myQuery)
{
    SqlDataAdapter dap = new SqlDataAdapter(myQuery,cn);
    DataSet ds = new DataSet();
    dap.Fill(ds);
    return ds.Tables[0];
}
23
demandé sur Breeze 2013-02-21 13:51:46

5 réponses

la différence sera négligeable, il est donc probablement préférable d'utiliser la version plus concise: SqlDataAdapter.Fill .

SqlDataReader.Fill crée une classe interne LoadAdapter (dérivée de DataAdapter ), et appelle sa méthode Fill : la performance sera très similaire à SqlDataAdapter.Fill(DataTable) .

il y aura quelques petites différences dans l'initialisation / validation des arguments, mais au fur et à mesure que le nombre de lignes augmentera, cela deviendra moins et de moins en moins importants.

Notez aussi que votre second échantillon doit être modifié pour être comparable au premier:

public DataTable populateUsingDataAdapter(string myQuery)
{
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlDataAdapter dap = new SqlDataAdapter(myQuery,con);
        DataTable dt = new DataTable();
        dap.Fill(dt);
        return dt;
    }
}
23
répondu Joe 2013-07-14 17:01:34

cette question , et plus spécifiquement, cette réponse suggère que votre deuxième exemple est plus rapide. Il ne s'agit certainement pas d'un point de repère exhaustif, mais d'un test intéressant.

reflétant le code source de DataTable montre que l'appel DataTable.Load () crée en fait une sous-classe interne DataAdapter appelée LoadAdapter et appelle la méthode Fill() de DataAdapter . SqlDataAdapter , fait l'essentiel de son travail de chargement dans le même endroit exact.

plus important encore, j'aurais tendance à favoriser le second exemple pour la lisibilité. Ni exemple compare à l'accès rapide fournie par l'utilisation directe de la DataReader , donc j'opterais pour le nettoyeur de code.

8
répondu Tim Medora 2017-05-23 12:34:17

SqlDataReader a toujours été beaucoup plus rapide que le SqlDataAdapter . Des améliorations ont peut-être été apportées dans .NET 4.5, mais je doute qu'elles aient été suffisantes pour dépasser les performances du lecteur de données.

4
répondu Rob Epstein 2013-02-21 09:59:20

SqlDataReader sera plus rapide que SQlDataAdapter parce qu'il fonctionne dans un état connecté qui signifie que le premier résultat est retourné de la requête dès que son disponible ..

0
répondu coder 2013-02-21 10:19:37

en plus de la solution choisie, je voudrais ajouter que:

en utilisant le DataReader, vous n'avez pas besoin de savoir quel type de connexion db vous avez.

vous N'avez besoin que d'une instance qui implémente IDbConnection, avec laquelle vous pouvez utiliser "connection".CreateCommand" et ensuite " dbCommand.ExecuteReader " and then datable.Charge.

mais lorsque vous utilisez DataAdapter vous devez savoir quelle connexion est utilisée (i.e. oracle, sqlserver, etc.)

(ce N'est pas pertinent pour le thread starter, mais j'ai atterri ici en utilisant g**gle tout en cherchant ce sujet.)

0
répondu just_a_guest 2016-01-26 13:57:12