2013-11-15 4 views
0

В настоящее время я создаю приложение, которое нуждается в функции для импорта предоставленного пользователем 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, но приложение должно поддерживать несколько баз данных.

ответ

0

я хотел бы предложить вам использовать SqlBulkCopy, при вставке много значений, это при условии, чтобы быть действительно полезным для меня

места ваших вопросов в DataTable и пусть SqlBulkCopy сделает все остальное.

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

+0

я неправильно в моем мышлении, что 'SqlBulkCopy' поддерживает только SQL Server? –

+0

@GrahamWager Да, SQLBulkCopy специфичен для SQLServer. Есть OracleBulkCopy, если это вообще помогает, не уверены в других RDBMS ': http://docs.oracle.com/html/E10927_01/OracleBulkCopyClass.htm – Bridge

Смежные вопросы