【问题标题】:What is the best way to Insert a dynamic number of rows into SQL Server in C#在 C# 中将动态行数插入 SQL Server 的最佳方法是什么
【发布时间】:2020-01-31 21:51:06
【问题描述】:

我正在使用 C# 和 ADO.NET 将动态行数插入到 SQL Server 表中, 但我不确定这是最好的方法还是最有效的方法。

在阅读了不同的意见后,我使用了这种方式,但想确认这是否是一个好主意。

如果你说更好,使用的工具可以改变

SqlConnection sc = DBManager.CreateConnection();
sc.Open();

foreach (string item in listSurfaceTypes)
{
    SqlCommand insert = new SqlCommand("INSERT INTO dbo.surface_type_inspection " +
                "(InspectionID, SurfaceType) VALUES (@InspecId, @SurfaceType)", sc);
    insert.Parameters.AddWithValue("@InspecId", id);
    insert.Parameters.AddWithValue("@SurfaceType", item);

    insert.ExecuteNonQuery();
}

sc.Close();

哦,顺便说一句,有多个表,所以我必须多次迭代,我应该为每个表打开和关闭连接还是为所有表使用相同的连接?

【问题讨论】:

    标签: c# .net sql-server ado.net


    【解决方案1】:

    至少批量插入 SqlTransaction,并将 SqlConnection 放入 using 块中。该事务确保所有行都插入或不插入,并通过消除每行之后的提交和日志刷新来提高性能。

    using (var sc = DBManager.CreateConnection())
    {
        sc.Open();
        var tran = sc.BeginTransaction();
        foreach (string item in listSurfaceTypes)
        {
            SqlCommand insert = new SqlCommand("INSERT INTO dbo.surface_type_inspection (InspectionID,SurfaceType) values(@InspecId,@SurfaceType)", sc);
            insert.Parameters.AddWithValue("@InspecId", id);
            insert.Parameters.AddWithValue("@SurfaceType", item);
    
            insert.Transaction = tran;
            insert.ExecuteNonQuery();
        }
        tran.Commit();
        sc.Close();
    }
    

    如果要插入数千行,SqlBulkCopy 会明显更快。

    【讨论】:

    【解决方案2】:

    使用 SqlBulkCopy 类,这样你就不会逐行插入,这会慢得多。 https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlbulkcopy

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2022-12-07
      • 1970-01-01
      相关资源
      最近更新 更多