0

我目前正在构建一个应用程序,该应用程序需要将用户提供的 CSV 文件作为数据导入数据库的功能。CSV 中的每个“单元格”都将存储在自己的行中。

最初我使用参数化查询来逐一插入每一行,但操作的速度(在一个示例文件中插入了 520,000 次!)意味着我不得不重新考虑这一点。我现在将 CSV 文件解析为 anIEnumerable<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 秒的插入时间,但是我意识到基本替换'with''是不安全的。

显然,插入单行最安全的方法是使用参数化查询,但是有没有办法让这样的事情与这样的批量插入一起工作?

如果可能的话,我还需要它是非数据库特定的——我已经考虑过SqlBulkCopy,但应用程序需要支持多个数据库引擎。

4

1 回答 1

0

我建议您在插入大量值时使用 sqlBulkCopy,这对我来说非常有用

将您的项目放入数据表中,然后让 SqlBulkCopy 完成剩下的工作。

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

于 2013-11-15T11:23:51.740 回答