В настоящее время я создаю приложение, которое нуждается в функции для импорта предоставленного пользователем CSV-файла в качестве данных в базу данных. Каждая «ячейка» в CSV будет храниться в отдельной строке.Создание надежной массовой вставки данных
Первоначально я использовал параметризованные запросы для вставки каждой строки один за другим, но скорость операции (520 000 вставок в одном примере файла!) Означала, что мне нужно пересмотреть это. Я теперь разбор файла CSV в IEnumerable<Answer>
и передать ее на следующий код для вставки в базу данных в пакетах:
public void AddAnswers(IEnumerable<Answer> answers)
{
const int batchSize = 1000;
var values = new StringBuilder();
var i = 0;
foreach (var answer in answers)
{
if (i++ > 0)
{
values.Append(",");
}
values.AppendFormat("({0},{1},'{2}')", answer.AnswerSetId, answer.QuestionId, answer.Value.Replace("'", "''"));
if (i == batchSize)
{
// We've reached the batch size limit - send what we have so far
SendAnswerBatch(values.ToString());
values.Clear();
i = 0;
}
}
if (i > 0)
{
// Ensure any leftovers that didn't reach the maximum batch size are sent over
SendAnswerBatch(values.ToString());
}
}
private void SendAnswerBatch(string values)
{
var query = String.Format("INSERT INTO Answers (AnswerSetId,QuestionId,Value) VALUES {0}", values);
Context.Database.ExecuteSqlCommand(query);
}
Это изменило большой набор данных принимать более 5 минут меньше, чем 5 секунд для вставки, однако я понимаю, что базовая замена '
на ''
небезопасна.
Очевидно, что самым надежным способом вставить одну строку будет использование параметризованного запроса, но есть ли способ заставить такую вещь работать с вставкой пакета, как это?
Если это вообще возможно, мне также нужно, чтобы это была не-база данных - я уже рассмотрел SqlBulkCopy
, но приложение должно поддерживать несколько баз данных.
я неправильно в моем мышлении, что 'SqlBulkCopy' поддерживает только SQL Server? –
@GrahamWager Да, SQLBulkCopy специфичен для SQLServer. Есть OracleBulkCopy, если это вообще помогает, не уверены в других RDBMS ': http://docs.oracle.com/html/E10927_01/OracleBulkCopyClass.htm – Bridge