Есть ли лучший способ вставить значения из массивов в SQL Server 2008? - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь сохранить строки в таблице SQL Server 2008 для свалки о документации на всех транспортных средствах; Я буду запускать эту программу раз в месяц, чтобы получить список с информацией для всех транспортных средств. Я знаю, что могу написать текстовый файл и выполнить «массовую вставку» из файла.

Однако мне просто интересно, есть ли способ вставить информацию, хранящуюся в строковых массивах, прямо в SQL Server.

Сейчас я делаю цикл for и запускаю 500 команд запросов для их вставки, а для 500 записей весь процесс занимает всего около 4 секунд.

Хотелось бы узнать , есть ли лучший способ вставлять информацию из массивов напрямую, без использования цикла for 500 раз?

Приведенный ниже код прекрасно работает для меня, однако я не хотел бы использовать такой вид спагетти-кода, если есть лучший способ сделать это. Заранее спасибо!

for (int i = 0; i < 500; i++)
{
    con.Open();
    SqlCommand myCommand = new SqlCommand("INSERT INTO [TESTCATALOG].[dbo].[TITLES] VALUES ('" + TitleNum[i] + "','" + VIN[i] + "','" + DateIssued[i] + "')", con);
    myCommand.ExecuteReader();
    con.Close();
}

Ответы [ 5 ]

4 голосов
/ 09 февраля 2012

Вы можете использовать табличные параметры (TVP) для вставки списков непосредственно через хранимую процедуру.

Табличные параметры - это новый тип параметров в SQL Server 2008.Табличные параметры объявляются с использованием пользовательских типов таблиц.Вы можете использовать табличные параметры для отправки нескольких строк данных в инструкцию Transact-SQL или подпрограмму, такую ​​как хранимая процедура или функция, без создания временной таблицы или множества параметров.

Этотакже позволит избежать уязвимости SQL Injection, присутствующей в вашем коде.

См. Табличные параметры в SQL Server 2008 (ADO.NET) на MSDN, чтобы узнать, как вызвать хранимую процедуру с помощьюTVP с C #:

SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
                                                           "@tvpNewCategories", 
                                                           addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";
1 голос
/ 09 февраля 2012

Вы можете использовать класс SqlBulkCopy . Класс SqlBulkCopy требует, чтобы ваши данные были доступны как DataRow[], DataTable или `IDataReader.

1 голос
/ 09 февраля 2012

Да, вы можете использовать linq для sql или linq для сущностей, чтобы достичь этого за одну транзакцию.

0 голосов
/ 09 февраля 2012

вы можете использовать dataadapter для вставки или обновления.сначала добавьте строки в datatable в yor for loop, затем вызовите dataadapter.update с datatable

0 голосов
/ 09 февраля 2012

Начиная с SQL Server 2008, вы можете использовать табличную переменную.

См. «Передача табличного параметра в параметризованный оператор SQL» в MSDN.

...