2010-06-09 7 views
2

J'essaie de trouver une manière plus efficace et plus rapide d'insérer une quantité de données assez importante (~ 50 000 lignes) que le Linq que j'utilise maintenant. Les données que j'essaie d'écrire sur une base de données locale figurent dans une liste de données mappées ORM sérialisées et reçues de WCF. Je suis désireux d'utiliser SqlBulkCopy, mais le problème est que les tables sont normalisées et sont en fait une séquence ou des tables interconnectées avec des relations un-à-plusieurs.Insertion rapide des tables de données relationnelles (normalisées) dans la base de données SQL Server 2008

est ici un code qui illustre mon point:

foreach (var meeting in meetingsList) 
    { 
     int meetingId = dbAccess.InsertM(value1, value2...); 
     foreach (var competition in meeting.COMPETITIONs) 
     { 
       int competitionId = dbAccess.InsertC(meetingid, value1, value2...); 
       foreach(var competitor in competition.COMPETITORs) 
       { 
         int competitorId = dbAccess.InsertCO(comeetitionId, value1,....) 
         // and so on 
       } 
     } 
    } 

où dbAccess.InsertMeeting ressemble à ceci:

// check if meeting exists 
int meetingId = GetMeeting(meeting, date); 

if (meetingId == 0) 
{ 
    // if meeting doesn't exist insert new 
    var m = new MEETING 
    { 
     NAME = name, 
     DATE = date 
    } 
    _db.InsertOnSubmit(m); 
    _db.SubmitChanges(); 
} 

Merci à l'avance pour les réponses. Bojan

Répondre

4

Je encore utiliser SqlBulkCopy pour copier rapidement vos données à partir du fichier externe dans une table de mise en scène qui a la même structure (plat) que le fichier (vous devrez créer à l'avance cette table)

Une fois chargé, vous pouvez diviser les données entre plusieurs tables en utilisant par exemple une procédure stockée ou quelque chose - devrait être assez rapide puisque tout est déjà sur le serveur.

+4

+1 J'utilise toujours une table de mise en scène en premier ... il y a toujours un problème avec les données tierces et il faut nettoyer – SQLMenace

+0

c'est une idée intéressante ... Je vais essayer, merci – TheBoyan

+1

Vous pouvez obtenir les identifiants retour à partir de l'insertion de la table parente à l'aide de la clause OUTPUT, lisez comment dans Livres en ligne. – HLGEM

Questions connexes