2013-11-15 118 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