我目前正在構建一個應用程序,它需要一項功能將用戶提供的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