在没有DataAdapters的情况下在ADO.NET中进行批处理

时间:2008-12-31 09:56:13

标签: ado.net batching

是否可以在ADO.NET中实现多个存储过程调用(执行更新/删除)的批处理而无需使用DataAdapter?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用System.Data.SqlClient.SqlCommandSet。它实际上是内部的,但是Ayende made a wrapper to make it public

代码目前托管在sourceforge

答案 1 :(得分:1)

您的SQL文本可以包含多个命令。如果返回多个结果集,则可以使用DataReader并使用NextResult函数。我经常做的是将SQL存储为嵌入式资源,然后加载该文本。如果它包含参数,那么就像平常一样设置参数。

例如,我有一个文件:

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

我这样执行:

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();
}

请注意,MvcApplication.GetResource不是内置函数 - 它是你必须写的...这是我的:

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;
}