У меня много устаревших кодов доступа к данным, в основном SqlCommand с вызовами хранимых процедур, которые мы использовали для выполнения большого количества вставки статистики в базу данных.
Пока сервер SQL находился на том же компьютере, что и приложение, производительность была приемлемой, но сейчас мы пытаемся переместить некоторые данные в SQL Azure.
Проблема в том, что наш код вызывает SP для каждой записи для вставки, что приводит к довольно большим числам поездок в базу данных, и, если они не расположены на одном сервере, это занимает некоторое время.
var conn = new SqlConnection("connString")
var cmd = new SqlCommand(conn, "spMyStoreProc");
cmd.Params.Add("@a", SqlDbType.VarChar, 10);
cmd.Params.Add("@b", SqlDbType.Int);
using(conn)
{
conn.Open();
foreach(var rec in recordsToInsert)
{
cmd.Parameters["@a"].Value = rec.A;
cmd.Parameters["@b"].Value = rec.B;
cmd.ExecuteNonQuery();
}
conn.Close();
}
Я пробовал приведенный выше код с транзакциями и без них.
Я также пытался использовать «пакетный» оператор SQL для выполнения нескольких SP в каждой поездке на сервер.
Как это:
var cmd = new SqlCommand(conn);
cmd.CommandText = "EXEC spMyStoreProc @a='a' @b=2; EXEC spMyStoreProc @a='b' @b=4;"
Это значительно повышает производительность операции, но, поскольку у меня довольно много SP, где каждый SP имеет около 20-50 параметров, довольно утомительно писать этот код для всех команд вставки в этом компоненте доступа к данным.
Это лучший способ добиться этого, или я могу как-то сказать ADO.NET, что я хочу выполнять свои вызовы в пакетном режиме (не ищите ничего, что подсказывает, что это возможно, но я чувствую, что по крайней мере должен спросить), чтобы избежать задержки в сети и т. Д. каждый вызов SP?
Если нет, то кто-нибудь знает какой-либо хороший способ добиться этого без необходимости писать его «от руки», и, поскольку это унаследованное приложение, я не могу полностью изменить уровень данных.
Существуют ли приложения, которые могут принимать SqlCommands с параметрами и генерировать TQL, который они будут выполнять?
Заранее спасибо