J'ai un ensemble de données dans ADO.NET contenant plusieurs enregistrements du côté de l'utilisateur. J'ai besoin d'insérer toutes ces lignes dans la requête unique dans la base de données, afin d'éviter plusieurs requêtesComment puis-je utiliser une requête unique pour insérer plusieurs enregistrements de Dataset dans SQL Server 2005?
Répondre
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();
}
}
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
Belle expansion sur ma réponse + 1 – kevchadders
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.
- 1. Insérer plusieurs enregistrements dans une requête
- 2. SQL Server 2005: Insérer plusieurs lignes avec une seule requête
- 3. Comment insérer l'heure dans SQl Server 2005?
- 4. Comment insérer plusieurs enregistrements de Vb.net à la table SQL Server 2005?
- 5. Comment définir une clé unique dans SQL Server 2005?
- 6. MS SQL Server, insérer plusieurs
- 7. Comment créer une contrainte composite unique dans SQL Server 2005
- 8. Comment insérer unique ID composite pour Table hiérarchique (SQL Server)
- 9. Requête SQL Server 2005
- 10. trigger dans sql server 2005
- 11. comment obtenir des enregistrements NULL également dans Sql Server 2005
- 12. Requête SQL SQL Server 2005
- 13. Comment exporter des enregistrements par lots dans sql server 2005?
- 14. Verrouillage de plusieurs enregistrements SQL Server
- 15. SQL Server 2005 Comment créer une contrainte unique?
- 16. Comment utiliser split dans SQL Server 2005?
- 17. Comment insérer un tableau de valeurs dans SQL Server 2005?
- 18. Requête hiérarchique dans SQL Server 2005
- 19. Sql Server 2005: les enregistrements aléatoires
- 20. itérative par enregistrements SQL Server 2005 pour formater la sortie
- 21. Sql Server 2005 requête novice
- 22. Comment identifier un identificateur unique vide dans SQL Server 2005?
- 23. Sql Server 2005 - Insérer un déclencheur de mise à jour - Mettre à jour, insérer la ligne
- 24. SQL Server 2005 émet requête
- 25. SQL Server: comment utiliser Cursor pour supprimer des enregistrements
- 26. Impact de changement d'une clé unique dans SQL Server 2005
- 27. symfony insérer plusieurs enregistrements
- 28. Exécution d'une procédure stockée pour insérer des enregistrements dans une table - SQL Server 2000
- 29. sql - insérer dans plusieurs tables dans une requête
- 30. Comment utiliser une requête de sélection conditionnelle? dans SQL Server
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. –
@Winston - Merci pour le lien utile – kevchadders