我目前正在构建一个需要一项功能的应用程序,将用户提供的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 :(得分:0)
我建议你使用sqlBulkCopy,当插入很多值时,这对我来说真的很有用
将您的项目放入数据表中,让SqlBulkCopy完成剩下的工作。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx