3

DataAdapter に頼らずに、ADO.NET で複数のストアド プロシージャ コール (更新/削除を行う) のバッチ処理を実装することは可能ですか?

4

2 に答える 2

2

System.Data.SqlClient.SqlCommandSet を使用してみてください。これは実際には内部ですが、Ayende はそれを公開するためのラッパーを作成しました

コードは現在sourceforgeでホストされています。

于 2008-12-31T11:18:12.550 に答える
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;
}
于 2008-12-31T09:59:45.377 に答える