2009-02-14 8 views
2

J'ai besoin d'insérer un tas d'enregistrements similaires dans une table, et je me demandais s'il y avait une façon agréable/facile de le faire. Je sais qu'il serait facile de construire une grosse chaîne, mais j'espérais que je pourrais trouver une façon plus gracieuse de le faire.meilleure façon de générer une instruction d'insertion en masse dans C#?

+0

Quelle est cette « bande »? –

+0

codera les générateurs comme l'aide de codesmith? –

+0

Où ces enregistrements sont-ils actuellement stockés? –

Répondre

5

La classe SqlBulkCopy a WriteToServer méthodes qui écrivent plusieurs enregistrements.

I a créé une classe qui met en œuvre l'interface IDataReader, que je peux transmettre en tant que paramètre à une méthode SqlBulkCopy.WriteToServer (voir ADO.NET: Building a Custom Data Provider for Use with the .NET Data Access Framework pour un exemple de la façon de mettre en œuvre l'interface IDataReader).

Il pourrait être plus simple d'implémenter IDataReader (c'est-à-dire en utilisant l'une des autres méthodes SqlBulkCopy.WriteToServer).

0

Si vos données sont stockées dans format CSV ou XML, vous pouvez importer les enregistrements avec le serveur SQL (en supposant que vous utilisez SQL Server)

+0

désolé, je viens de vous voir commenter plus tôt. Toutes les données sont en mémoire/classe simple. – Dano

3

Je pense que la règle générale est que vous ne voulez pas ouvrir/fermer une connexion pour chaque insertion. Aussi évident que cela puisse paraître, il vaut la peine de mentionner que j'ai été témoin de ce problème deux fois, à la fois avec SQL Server. Dans une boucle, le code que j'ai corrigé s'appelait une bibliothèque de classes externe qui ouvrait/fermait une connexion avec chaque insertion. Lors d'une journée chargée, le pool de connexion s'est rempli et les exceptions sont devenues folles. Il a également provoqué des erreurs dans d'autres applications, car aucune connexion n'a pu être établie. Le correctif, bien sûr, était d'ouvrir la connexion avant la boucle, d'appeler la fonction ExecuteNonQuery() dans la boucle (encore et encore), et de fermer la connexion après la boucle. Cela semble trivial, mais c'est vraiment une erreur commune.

Cordialement ...

0

Si les données source est dans un fichier texte (CSV ou d'un standard, vous pouvez lire), utiliser un StreamReader pour lire chaque ligne, et une fonction qui prend cette ligne et le convertit à une seule instruction d'insertion. Ensuite, il suffit de laisser voler

Par exemple, disons que vous avez un fichier comme celui-ci:

foo 1 
bar 2 
baz 3 
... 


using(StreamReader sr = new StreamReader(File.Open("sourcefile.txt", FileMode.Open))) 
{ 
    using(SqlConnection conn = new SqlConnection(connectionString)) 
    { 
    conn.Open(); 
    string line =""; 
    while((line = sr.ReadLine()) != "") 
    { 
    string[] parts = line.split(new string[]{" "}, StringSplitOptions.None); 
    string cmdTxt = String.Format("INSERT INTO MyTable(name, value) VALUES('{0}','{1}')", parts[0], parts[1]); 

     using(SqlCommand cmd = new SqlCommand(cmdTxt, conn)) 
     { 
     cmd.ExecuteNonQuery(); 
     } 
    } 
} 

}

Questions connexes