2010-10-07 2 views

Répondre

4

Peut-être quelque chose comme une copie en bloc serait une réponse. L'exemple dans Code Project ci-dessous montre comment le faire en utilisant un DataTable, mais vous devriez être capable de changer l'exemple pour utiliser un DataSet. Voici une petite partie du code qui couvre la connexion et l'exection dans SQL Server (extrait de CodeProject).

La partie clé à noter est bulkcopy.WriteToServer (SourceTable); ont été le SourceTable serait la partie du DataSet vous passeriez à ce

//First create a connection string to destination database 
string connectionString; 
connectionString = <EM>YourConnectionString</EM>and 
    Initial Catalog=TestSMODatabase"; 

//Open a connection with destination database; 
using (SqlConnection connection = 
     new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    //Open bulkcopy connection. 
    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(connection)) 
    { 
    //Set destination table name 
    //to table previously created. 
    bulkcopy.DestinationTableName = "dbo.TestTable"; 

    try 
    { 
     bulkcopy.WriteToServer(SourceTable); // SourceTable would come from your DataSet 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

    connection.Close(); 
    } 
} 
+1

Définition d'une BatchSize appropriée et l'utilisation SqlBulkCopyOptions.TableLock peut entraîner une performance bien meilleure. Testez votre scénario. Voir http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx pour une analyse détaillée. –

+0

@Winston - Merci pour le lien utile – kevchadders

3

Alors que SqlBulkCopy œuvres pour inserts en vrac, vous ne pouvez pas faire des mises à jour en vrac. Cela peut être ou ne pas être un problème pour vous, mais dans tous les cas, vous pouvez utiliser une procédure stockée qui utilise OPENXML pour permettre les insertions en vrac et les mises à jour. Vous aurez également besoin de sp_xml_preparedocument et sp_xml_removedocument.

Un autre grand avantage de cette méthode est que vous pouvez obtenir les ID des entités que vous venez d'insérer en masse, à l'aide de la clause OUTPUT.

Exemple d'insertion en masse.

En supposant que vous avez défini un paramètre @p_XmlData VARCHAR(MAX) sur le processus stocké définissant les données à insérer ou à mettre à jour. Pour un exemple de XML vous devez passer, vous pouvez faire:

SELECT TOP 1 *, 0 AS __ORDERBY FROM dbo.YourEntity AS YourEntity FOR XML AUTO, ROOT('ROOT') 

Ensuite, la procédure stockée ressemblera à quelque chose comme ça

DECLARE @hDoc INT 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData 

INSERT INTO dbo.YourEntity 
(
     [Field1], 
     [Field2] 
) 
SELECT 
     XMLData.Field1, 
     XMLData.Field2 
FROM OPENXML (@hdoc, 'ROOT/YourEntity', 1) 
WITH 
(
     [Field1] int, 
     [Field2] varchar(50), 
     [__ORDERBY] int 
) AS XMLData 

EXEC sp_xml_removedocument @hDoc 
+0

Belle expansion sur ma réponse + 1 – kevchadders

0

Je propose que vous envoyez vos DataTables de vous DataSet une procédure stockée utilisant un paramètre Table Valued. Vous pouvez ensuite exécuter une instruction d'insertion pour remplir la base de données avec vos enregistrements de jeu de données.

http://msdn.microsoft.com/en-us/library/bb510489.aspx

Questions connexes