Insérer des éléments de dictionnaire dans la table SQL sous forme de lignes à l'aide de IDatareader et SqlBulkCopy

c# datareader dictionary sql sqlbulkcopy

Question

J'ai besoin d'améliorer considérablement le temps d'exécution d'un processus qui ressemble actuellement à ceci:

private Dictionary<int, SingleElement> elements_buffer;

// ... Create and load values into "elements_buffer"
// (string, Datetime, double)

string query = "INSERT INTO Tests.dbo.test_table "
    + "(element_name,element_init,element_width) VALUES";

SingleElement element_aux;

for (int i = 0; i < MAX_ELEMS_IN_DICT; i++)
{
    element_aux = elements_buffer[i];

    query = query
        + "('"
        + element_aux.name
        + "','"
        + element_aux.init
        + "',"
        + element_aux.width
        + ")";

    if (i < MAX_ELEMS_IN_DICT+1) {
        query = query + ",";
    }
}

// ... Execute the query

J'allais utiliser Datatable pour la nouvelle version, mais je lisais comment utiliser SqlBulkCopy avec IDatareader , comme indiqué dans:

Performances de SqlBulkCopy

Boucles C # et insert de masse

Cela me semble être un meilleur choix pour mon code, mais je n'arrive pas à comprendre comment le coder, bien que j'aimerais l'utiliser.

Puis-je avoir de l'aide avec le code traduit, s'il vous plaît?

Merci d'avance

Réponse acceptée

Comme vous l'avez déjà compris, vous devez implémenter IDataReader personnalisé. Comme votre source est Dictionary - seuls quelques méthodes / propriétés relativement simples telles que int FieldCount, bool Read (), objet Get (int i) doivent être implémentées.

Vous pouvez trouver des exemples utiles ( simples ) d’implémentations personnalisées d’IDataReader en recherchant idatareader personnalisé par sqlbulkcopy .

N'oubliez pas non plus que SqlBulkCopy ignore les déclencheurs, les clés étrangères et les autres contraintes et qu'il n'est pas en mesure de gérer les exceptions.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi