首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使安全成为数据的大容量插入

使安全成为数据的大容量插入
EN

Stack Overflow用户
提问于 2013-11-15 18:50:36
回答 1查看 73关注 0票数 0

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

最初,我使用参数化查询逐行插入每一行,但操作的速度很慢(一个示例文件中有520,000个插入!)意味着我不得不重新考虑这一点。我现在正在将CSV文件解析为IEnumerable<Answer>,并将其移交给以下代码,以便批量插入到数据库中:

代码语言:javascript
运行
复制
    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,但应用程序需要支持多个数据库引擎。

EN

回答 1

Stack Overflow用户

发布于 2013-11-15 19:23:52

我建议你使用sqlBulkCopy,当插入很多值的时候,这对我来说非常有用

把你的项目放到一个数据表中,让SqlBulkCopy来做剩下的事情。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19999318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档