Импортируйте несколько строк во временную таблицу за один проход через SqlDataRecord.C#

Место общения программистов C#
Ответить
Anonymous
 Импортируйте несколько строк во временную таблицу за один проход через SqlDataRecord.

Сообщение Anonymous »

Эта проблема только начинает проявляться в профилировщике. У нас есть что-то похожее на это:

Код: Выделить всё

using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "INSERT INTO #Ids VALUES (@0);";
cmd.Parameters.Add(cmd.CreateParameter() { ParameterName = "@0", DbType = DbType.Integer });

cmd.Prepare();

foreach (var value in values)
{
((IDbDataParameter)cmd.Parameters[0]).Value = value;
cmd.ExecuteNonQuery();
}
}
Мы рассматриваем возможность ускорить этот процесс за счет уменьшения количества поездок туда и обратно. Использовать здесь DataTable было бы чудовищно, но есть тип SqlDataRecord, который кажется подходящим, поэтому мы сможем сделать что-то вроде этого:

Код: Выделить всё

using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "INSERT INTO #Ids SELECT * FROM @0;";

var param  = cmd.CreateParameter();
param.ParameterName = "@0";
// FIXME more properties
cmd.Parameters.Add(param);
param.Value = values.Cast().Select((x) => {
// FIXME Create new SqlDataRecord
}.ToList();

cmd.ExecuteNonQuery();
}
Я не могу найти примеров API и понятия не имею, как его использовать. Из-за бессмысленности типов в SqlClient обычный Visual Studio intellisense бесполезен.
Как мне заполнить комментарии FIXME выше?
Связанный вопрос, нет хороших ответов: как мне создать временную таблицу в SQL Server, если у меня есть большой список идентификаторов
В комментариях есть запрос на более широкую картину. На самом деле не существует хорошего способа получить больше информации, уменьшив масштаб. Существует ровно одна копия процедуры, которая устанавливает аргументы для всех вызовов SQL (читай: хранимых процедур) в базе кода, и это все.
Коэффициент масштабирования для количества строк имеет толстый хвост. ; среднее количество строк меньше 10, но максимальный размер очень велик, и вызовы с числом более тысячи происходят регулярно. Таким образом мы загружаем временную таблицу; и при преобразовании, чтобы сделать что-то кроме цикла foreach, мы все равно загружаем временную таблицу.
Завтра мне нужно проверить, как передать параметры значения таблицы в хранимую процедуру из . net code является эффективной целью для обмана или нет.

Подробнее здесь: https://stackoverflow.com/questions/786 ... datarecord
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»