Insertion en bloc dans plusieurs tables relationnelles à l'aide de l'identité de portée utilisant Dapper .Net

c#-4.0 dapper sql sql-server

Question

J'ai besoin d'importer des millions d'enregistrements dans plusieurs tables relationnelles SQL Server.

TableA(Aid(pk),Name,Color)----return id using scope identity 
TableB(Bid,Aid(fk),Name)---Here we need to insert Aid(pk) which we got using scocpe Identity

Comment puis-je effectuer l'insertion en bloc d'une collection de millions d'enregistrements à l'aide de dapper en une seule déclaration d'insertion

Réponse acceptée

Dapper ne fait qu'embarquer ADO.NET brut; L'ADO.NET brut n'offre pas cette possibilité, par conséquent, dapper ne le fait pas. Ce que vous voulez, c'est SqlBulkCopy . Vous pouvez également utiliser un paramètre de valeur table, mais cela ressemble vraiment à un travail SqlBulkCopy .

Dans un pincement, vous pouvez utiliser dapper ici - Execute déroulera un IEnumerable<T> en une série de commandes sur T - mais ce sera beaucoup de commandes; et à moins que vous n'activez explicitement le pipeline asynchrone, il souffrira d'une latence par commande (le mode pipelined évite cela, mais il s'agira toujours de n commandes). Mais SqlBulkCopy sera beaucoup plus efficace.

Si les données d'entrée sont un IEnumerable<T> , vous pouvez utiliser ObjectReader de FastMember. par exemple:

IEnumerable<SomeType> data = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
    bcp.DestinationTableName = "SomeTable";
    bcp.WriteToServer(reader);
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi