Traitement par lots dans ADO.NET sans DataAdapters
Question
Est-il possible d'implémenter le traitement par lots de plusieurs appels de procédures stockées (mises à jour / suppressions) dans ADO.NET sans recourir à DataAdapters?
La solution
Vous pouvez essayer d’utiliser System.Data.SqlClient.SqlCommandSet. C'est en fait interne, mais Ayende a créé un wrapper pour le rendre public .
Le code est actuellement hébergé dans sourceforge .
Autres conseils
Votre texte SQL peut contenir plusieurs commandes. Si vous renvoyez plusieurs jeux de résultats, vous pouvez utiliser un DataReader et la fonction NextResult. Ce que je fais souvent est de stocker le code SQL à exécuter en tant que ressource incorporée, puis de charger ce texte. S'il contient des paramètres, définissez-les comme vous le feriez normalement.
Par exemple, j'ai un fichier:
UPDATE dbo.QuotePricedLineItem
SET fkQuoteVendorLineSet = NULL
FROM dbo.QuotePricedLineItem qpli
INNER JOIN dbo.QuoteLineItem qli ON qpli.Id = qli.Id
WHERE qli.fkQuote = @quoteId AND qpli.fkQuoteVendorLineSet = @ciscoConfigId
DELETE CiscoQuoteLineItem
FROM CiscoQuoteLineItem cqli
INNER JOIN QuoteLineItem qli ON cqli.Id = qli.Id
WHERE qli.fkQuote = @quoteId AND cqli.fkCiscoQuoteVendorLineSet = @ciscoConfigId
que j'exécute en tant que tel:
using (SqlConnection conn = DbUtils.CreateConnection() as SqlConnection)
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = MvcApplication.GetResource("SQL.DemoteCiscoQuoteLineItems.sql");
cmd.Parameters.AddWithValue("@quoteId", q.Id);
cmd.Parameters.AddWithValue("@ciscoConfigId", configSetId);
cmd.ExecuteNonQuery();
}
Notez que MvcApplication.GetResource n’est pas une fonction intégrée - c’est une fonction que vous devez écrire ... voici la mienne:
public static string GetResource(string p)
{
Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("CortexQuoting.Res." + p);
if (s == null) return null;
StreamReader sw = new StreamReader(s);
string ss = sw.ReadToEnd();
sw.Close();
return ss;
}