Comment puis-je utiliser une requête unique pour insert plusieurs loggings de Dataset dans SQL Server 2005?

J'ai un set de données dans ADO.NET contenant plusieurs loggings du côté de l'user. J'ai besoin d'insert toutes ces lignes dans une seule requête dans la database, afin d'éviter plusieurs requêtes

Peut-être que quelque chose comme une copy en vrac 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 conenction et l'exection dans SQL Server (tiré de CodeProject ).

La partie key à noter est bulkcopy.WriteToServer ( SourceTable ); était le SourceTable serait la partie du DataSet que vous lui passeriez

//First create a connection ssortingng to destination database ssortingng connectionSsortingng; connectionSsortingng = <EM>YourConnectionSsortingng</EM>and Initial Catalog=TestSMODatabase"; //Open a connection with destination database; using (SqlConnection connection = new SqlConnection(connectionSsortingng)) { 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(); } } 

Bien que SqlBulkCopy fonctionne pour les insertions en bloc, vous ne pouvez pas effectuer de mises à jour en bloc. Cela peut ou peut 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 et les mises à jour en masse. Vous aurez également besoin de sp_xml_preparedocument et de sp_xml_removedocument .

Un autre grand avantage de cette méthode est que vous pouvez get les identifiants des entités que vous venez d'insert, en utilisant la clause OUTPUT .

Exemple d'insertion en vrac.

En supposant que vous avez défini un paramètre @p_XmlData VARCHAR(MAX) sur le proc stocké définissant datatables à insert ou à mettre à jour. Pour un exemple de XML que vous devez transmettre, 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 à ceci

 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 

Je vous propose d'envoyer vos DataTables de votre DataSet à une procédure stockée en utilisant un paramètre Table Valued. Vous pouvez ensuite exécuter une instruction d'insertion pour remplir la database avec vos loggings de jeu de données.

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