Лучший способ вставить несколько строк в базу данных SQL Server 2008 из приложения .NET 4.0 - PullRequest
1 голос
/ 13 января 2012

У меня есть сценарий, в котором я получаю обратно список элементов, и мне нужно вставить каждый элемент в базу данных, с одним элементом> отображением одной строки.

Сначала я думал об использовании хранимой процедурывставит один элемент и зацикливает список, вызывая хранимую процедуру для каждого элемента.Но мне интересно, есть ли более элегантные / оптимальные методы.Особенно используя SQL Server 2008 / .NET 4.0.

Entity Framework также может войти в игру.

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Существует несколько способов выполнения массовой вставки.

  1. Используйте SqlDataAdapter, установите для него команду InsertCommand и вызовите .Update, например, с помощью DataTable ( MSDN ).Это позволяет группировать вставки в выбранные вами размеры партии.
  2. Использовать класс SqlBulkCopy (при этом возможна лучшая производительность).
  3. Создать цепочку, которая принимает значение TABLEпараметр - затем передать таблицу данных для этого sproc для вставки за один раз ( MSDN )

Ранее я писал в блоге о производительности варианта 1 против варианта 2 здесь .

2 голосов
/ 13 января 2012

SQLBulkCopy - это быстро и легко, вы можете настроить размер пакета и отобразить все ваши столбцы

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

0 голосов
/ 26 августа 2013

В Entity Framework вы можете сделать:

yourContext.Configuration.AutoDetectChangesEnabled = false;
yourContext.Configuration.ValidateOnSaveEnabled = false;

Do SaveChanges() в упаковках по 100 вкладышей ... попробуйте с 1000 и посмотрите изменения.

Поскольку во всех этих вставках контекст одинаков, вы можете перестраивать свой объект контекста каждые 1000 вставок.

 var yourContext = new YourContext();

Выполнение этого улучшения в моем процессе импорта данных заняло от 7 минут до 6 секунд.

Фактические числа ... не может быть 100 или 1000 в вашем случае ... попробуйте и настройте его.

...