Пакетная обработка в ADO.NET без адаптеров данных

StackOverflow https://stackoverflow.com/questions/402630

  •  03-07-2019
  •  | 
  •  

Вопрос

Можно ли реализовать пакетную обработку нескольких вызовов хранимых процедур (выполнение обновлений/удалений) в ADO.NET, не прибегая к DataAdapters?

Это было полезно?

Решение

Вы можете попробовать использовать System.Data.SqlClient.SqlCommandSet.На самом деле это внутреннее, но Айенде сделала обертку, чтобы сделать ее публичной.

Код в настоящее время размещен в исходная кузня.

Другие советы

Ваш текст 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top