【问题标题】:Insert a lot of data from an Array into a database [duplicate]将数组中的大量数据插入数据库[重复]
【发布时间】:2020-12-30 19:48:14
【问题描述】:

我想在数据库中创建 900.000 个新行,并且在这些行中的每一行中,数组中的条目都应写入列 Products

下面提到的我的解决方案有效,但需要一个多小时。怎样才能更快地做到这一点?

我非常缓慢的解决方案:

for (int i = 1; i <= 900000; i++) 
{
    string SQL_command = "INSERT INTO Database(Produkte) VALUES(" + ProductArray[i] + ")";

    SqlConnection con = new SqlConnection(connString);
    con.Open();

    SqlCommand cmd = new SqlCommand(SQL_command , con);
    cmd.ExecuteNonQuery();              

    con.Close();
}

我使用 SQL Server 和 C#

【问题讨论】:

  • stackoverflow.com/questions/5595353/… ...它谈到了存储过程,但你也可以使用CommandType.Text
  • 除了TVPs,另一种方法是SqlBulkCopy。如果您必须进行单例插入,请使用参数化语句并在单个事务中批量处理。
  • SQL Injection alert - 你应该将你的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 您可以使用循环在INSERT x VALUES (@p0), (@p1), ... (@p999) 中构建一个带有一千个参数占位符的 sql 字符串,并在命令中放入一千个参数,然后运行一个循环,将一千个参数值设置为time 和 call 执行 900 次而不是 900000 次。一旦你完成了代码,看看一次做 5000、10000 是否有帮助。我不确定我是否会选择 Dan 的“一次完成所有 900000”,但他是一个非常聪明的人,所以它可以很好地工作!跨度>

标签: c# sql sql-server


【解决方案1】:

不要在每次调用时打开和关闭连接,而是打开连接一次,然后运行所有 INSERT 语句,然后关闭连接:

using (SqlConnection con = new SqlConnection(connString))
{
    con.Open();
    for (i = 1; i <= 900000; i++) {
        string SQL_command = "INSERT INTO Database(Produkte) VALUES(" + ProductArray[i] + ")";
        using (SqlCommand cmd = new SqlCommand(SQL_command , con))
        {
            cmd.ExecuteNonQuery();
        }
    }
}

【讨论】:

  • 但是使用连接池,连接不会被关闭(尽管它会被重置)。也许有一点好处,但这里的痛苦是一次插入 1 行。
猜你喜欢
  • 2016-12-11
  • 2015-11-27
  • 1970-01-01
  • 2011-09-21
  • 2011-03-09
  • 2012-10-06
  • 2021-03-31
  • 2017-07-03
  • 2016-03-17
相关资源
最近更新 更多