2010-01-08 5 views
0

Je recherche des conseils sur la manière optimale d'insérer un grand nombre d'enregistrements dans une base de données (SQL2000 et versions ultérieures) en fonction d'une collection d'objets. Actuellement, mon code ressemble à l'extrait ci-dessous et chaque enregistrement est inséré à l'aide d'une seule commande simple INSERT (ouvrant et fermant la connexion à la base de données chaque fois que la fonction est appelée!) - Je suis sûr que cela doit ralentir ?).Insérer des enregistrements dans une base de données à partir d'une table de hachage

La routine doit être capable de gérer l'insertion régulière de 100 000 enregistrements et je me demandais s'il y avait un moyen plus rapide (je suis sûr qu'il doit y avoir ???). J'ai vu quelques articles mentionnant l'utilisation de données XML et de routines de copie en masse - est-ce quelque chose que je devrais envisager ou quelqu'un peut-il fournir des exemples simples sur lesquels je pourrais me baser?

foreach (DictionaryEntry de in objectList) 
{ 
    eRecord record = (eRecord)de.Value; 

    if (!record.Deleted) 
    { 
    createDBRecord(record.Id,    
        record.Index, 
        record.Name, 
        record.Value); 
    } 
} 

Merci pour tout conseil,

Paul.

Répondre

2

Faire de cette façon sera relativement lent. Vous devez envisager une technique INSERT groupée en utilisant BCP ou BULK INSERT, ou si vous utilisez .NET 2.0, vous pouvez utiliser le SqlBulkCopy class. Voici un exemple d'utilisation SqlBulkCopy: SqlBulkCopy - Copy Table Data Between SQL Servers at High Speeds

Voici un exemple simple pour SQL Server 2000:

Si vous disposez d'un fichier CSV, csvtest.txt, dans le format suivant:

1, John, Smith

2, Bob Hope

3, Kate, Curie

4, Peter, vert

Ce script SQL va charger le contenu du fichier csv dans une table de base de données (si une ligne contient des erreurs, il ne sera pas insérée, mais d'autres lignes seront):

USE myDB 
GO 

CREATE TABLE CSVTest 
(
    ID INT, 
    FirstName VARCHAR(60), 
    LastName VARCHAR(60) 
) 
GO 

BULK INSERT 
CSVTest 
FROM 'c:\temp\csvtest.txt' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 


SELECT * 
FROM CSVTest 
GO 

Vous pouvez écrire le contenu du dictionnaire dans un fichier CSV, puis BULK INERT ce fichier.

Voir aussi: Using bcp and BULK INSERT

Si vous implémentez votre propre méthode de IDataReader, vous pouvez éviter d'écrire dans un fichier imtermediate. Voir ADO.NET 2.0 Tutorial : SqlBulkCopy Revisited for Transferring Data at High Speeds

question connexe SO: how to pass variables like arrays/datatable to SQL server?

+0

Merci pour la réponse et oui je suis en utilisant .NET 2.0, donc je vais regarder dans la classe que vous avez mentionné que je voudrais faire l'opération directement sur la base de données si possible. Avez-vous une expérience de la classe SqlBulkCopy? Un grand merci, Paul – Paul

+0

@Paul: Bien sûr. Fait correctement le SqlBulkCopy est très rapide. J'ai aidé des équipes à atteindre 3 ordres de grandeur avec cela. –

+0

Merci Mitch - Je commence à lire et à apprendre! À la votre – Paul

Questions connexes