В прошлом я работал со множеством массовых загрузок данных. Существует два основных способа избежать отдельных вставок в SQL Server: список значений, вставляемых за один раз или использование массовой вставки.
первый вариант использования списка значений выглядит следующим образом:
INSERT INTO Foo (Bar,Baz)
VALUES ('bar','baz'),
('anotherbar','anotherbaz')
В c # вы бы перебирали свой список и создавали содержимое значений, однако сделать это без уязвимости SQL-инъекций сложно.
Второй вариант - использовать массовую вставку с массовым копированием SQL и datatable
. Прежде чем перейти к приведенному ниже коду, вы должны создать DataTable
, который содержит все ваши данные, а затем использовать SqlBulkCopy
для вставки строк с использованием функциональности Sql, оптимизированной для вставки больших объемов данных.
using (var bulk = new SqlBulkCopy(con)
{
//bulk mapping is a SqlBulkCopyColumnMapping[] and is not necessaraly needed if the DataTable matches your destination table exactly
foreach (var i in bulkMapping)
{
bulk.ColumnMappings.Add(i);
}
bulk.DestinationTableName = "MyTable";
bulk.BulkCopyTimeout = 600;
bulk.BatchSize = 5000;
bulk.WriteToServer(someDataTable);
}
Это два метода, включенных в структуру. Есть и другие библиотеки, которые могут помочь. Dapper один, но я не уверен, как он обрабатывает вставки на задней части. Entity Framework - это еще одна структура, но она выполняет одиночные вставки, поэтому она просто перемещает проблему из вашего кода в чужой код.