Bulk Insert de Liste Générique de C# dans SQL Server
Comment puis-je en vrac insérer une liste générique en c#, SQL Server, plutôt qu'en parcourant la liste et l'insertion de la personne les éléments un par un?
J'ai actuellement;
private void AddSnapshotData()
{
var password = Cryptography.DecryptString("vhx7Hv7hYD2bF9N4XhN5pkQm8MRfxi+kogALYqwqSuo=");
var figDb = "ZEUS";
var connString =
String.Format(
"Data Source=1xx.x.xx.xxx;Initial Catalog={0};;User ID=appuser;Password={1};MultipleActiveResultSets=True",
figDb, password);
var myConnection = new SqlConnection(connString);
myConnection.Open();
foreach (var holding in _dHoldList)
{
lbStatus.Text = "Adding information to SQL for client: " + holding.ClientNo;
_reports.AddZeusData("tblAllBrooksHoldingsSnapshot", "CliNo, SEDOL, ISIN, QtyHeld, DateOfSnapshot",
"'" + holding.ClientNo + "','" + holding.Sedol + "','" + holding.ISIN + "','" +
holding.QuantityHeld + "','" + DateTime.Today.ToString("yyyyMMdd") + "'", false, myConnection);
}
myConnection.Close();
lbStatus.Visible = false;
}
Où dHoldList
est une liste de DHOLDS
;
public class DHOLDS : ExcelReport
{
public String ClientNo { get; set; }
public String Sedol { get; set; }
public Double QuantityHeld { get; set; }
public Double ValueOfStock { get; set; }
public String Depot { get; set; }
public String ValC4 { get; set; }
public String StockR1 { get; set; }
public String StockR2 { get; set; }
public Double BookCost { get; set; }
public String ISIN { get; set; }
}
Plus d'infos sur la façon dont vous prévoyez de stocker, il serait utile, vous pouvez utiliser vos propres méthodes? ou avez-vous d'utiliser certaines réponses dans "_reports"?
Je peux utiliser mes propres méthodes, et la base de données appartient à moi afin que je puisse ajouter ou de faire toutes les modifications que je souhaite.
Je peux utiliser mes propres méthodes, et la base de données appartient à moi afin que je puisse ajouter ou de faire toutes les modifications que je souhaite.
OriginalL'auteur David Johnson | 2012-12-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire un plan de votre liste à un datatable et ensuite utiliser SqlBulkCopy pour insérer toutes les lignes à la fois.
Détaché. J'ai trouvé ce le moyen le plus rapide pour charger les données dans SQL Server à partir de l'extérieur du serveur.
Bonne chance à vous si vous voulez obtenir les valeurs d'identité arrières. Quelqu'un sait de quoi que ce soit qui fonctionne le mieux avec les données relationnelle?
C'est la réponse correcte. Cochez cette article par exemple comment utiliser SqlBulkCopy avec un minimum de lignes de code.
OriginalL'auteur Habib
4 ans plus tard, c'est ma contribution. J'ai eu le même problème, je voulais d'insertion en bloc, mais en passant sur certains champs qui n'allait pas dans la base de données, spécifiquement EF propriétés de navigation, j'ai donc écrit cette classe générique:
Son utilisation serait:
Le rendement obtenu et les possibilités de réutilisation de cette classe ont été vaut ce message. J'espère que cela aide:
Juan
Je Devrais l'avoir fait remarquer que, bien que résoudre un problème courant lorsque vous utilisez des données géospatiales avec Entity Framework, les types ne sont pas les mêmes, votre entités utilisation DbGeography, le type EF connaît et utilise à cette fin, mais pour l'insérer dans SQL il faut SqlGeography.
OriginalL'auteur Juan
Vous pouvez également convertir votre liste de XML ainsi, comme décrit dans cet article sur le blog: http://charleskong.com/blog/2009/09/insert-aspnet-objects-to-sql-server/
Mais le SqlBulkCopy approche semble mieux.
Une autre remarque: si vous voulez résoudre en adoptant une itération sur les éléments dans le code, qu'il serait possible d'améliorer les performances si vous n'tous les inserts en une seule transaction.
Je veux dire en faisant appel à un SQLTransaction. par l'ouverture d'une Transaction sur la Connexion comme var t = connexion.BeginTransaction(); ajoutant à la SQLMethod qui exécute le querry et en appelant t.Commit(); après la boucle. Voir ce stackoverflow-question pour info, à propos de pourquoi il peut être plus rapide: stackoverflow.com/questions/5091084/...
OriginalL'auteur SwissCoder