Est-il possible d'implémenter la mise en lot de plusieurs appels de procédures stockées (effectuer des mises à jour/suppressions) dans ADO.NET sans recourir à des DataAdapters?Traitement par lots dans ADO.NET sans DataAdapters
2
A
Répondre
2
Vous pouvez essayer d'utiliser System.Data.SqlClient.SqlCommandSet. C'est en fait interne, mais Ayende made a wrapper to make it public. Le code est actuellement hébergé en sourceforge.
1
Votre texte SQL peut contenir plusieurs commandes. Si vous renvoyez plusieurs ensembles de résultats, vous pouvez utiliser un DataReader et utiliser la fonction NextResult. Ce que je fais souvent est de stocker le SQL à exécuter en tant que ressource incorporée, puis charger ce texte. S'il contient des paramètres, définissez les paramètres 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 - il est celui que vous devez écrire ... voici le mien:
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;
}