简体   繁体   English

C# 使用foreach循环批量复制数据到SQL服务器

[英]C# Using foreach loop to bulkcopy data to SQL Server

I have a C# console app which reads million source data from a CSV file and inserts them into SQL Server in batches.我有一个 C# 控制台应用程序,它从 CSV 文件中读取百万源数据并将它们批量插入到 SQL 服务器中。

I group the data by 1000 count and use foreach to loop the groups.我按 1000 计数对数据进行分组,并使用 foreach 循环分组。 Each loop creates a new SqlConnection and a new SqlBulkCopy objects and disposes them at the end of the loop.每个循环都会创建一个新的SqlConnection和一个新的SqlBulkCopy对象,并在循环结束时处理它们。

for (int index = 0; index < dts.Count; index++)
{
    DataTable _dt = dts[index];
    try
    {
        using (SqlConnection connection = new SqlConnection(conn))
        {
            await connection.OpenAsync();
            //using (SqlTransaction trans = connection.BeginTransaction())
            using (CancellationTokenSource cts = new CancellationTokenSource())
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName = "[dbo].[XXXX]";
                bulkCopy.BatchSize = 1000;
                bulkCopy.WriteToServer(_dt);
            }
        }
    }
}                

The first 10 groups work fast in 1.x seconds, but after that it takes 4x secs to 60secs every group.前 10 组在 1.x 秒内快速工作,但之后每组需要 4x 秒到 60 秒。

If you use other cores of the processor, you will use a little more speed.如果你使用处理器的其他核心,你会使用更多的速度。 splitting data by number of cores using threads saves time.使用线程按核心数拆分数据可以节省时间。

 Thread t1 = new Thread(new ThreadStart(Thread1));
  
 Thread t2 = new Thread(new ThreadStart(Thread2));

    t1.Start();
    t2.Start();
              
   int piece = dts.Count / 2;

   public static void Thread1()
    {
        for (int index = 0; index < piece; index++)
        {
            DataTable _dt = dts[index];
            try
            {
                using (SqlConnection connection = new SqlConnection(conn))
                {
                    await connection.OpenAsync();
                    //using (SqlTransaction trans = connection.BeginTransaction())
                    using (CancellationTokenSource cts = new CancellationTokenSource())
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
                    {
                        bulkCopy.DestinationTableName = "[dbo].[XXXX]";
                        bulkCopy.BatchSize = 1000;
                        bulkCopy.WriteToServer(_dt);
                    }
                }
            }
            }
    }
    public static void Thread2()
    {
        for (int index = piece; index < dts.Count; index++)
        {
            DataTable _dt = dts[index];
            try
            {
                using (SqlConnection connection = new SqlConnection(conn))
                {
                    await connection.OpenAsync();
                    //using (SqlTransaction trans = connection.BeginTransaction())
                    using (CancellationTokenSource cts = new CancellationTokenSource())
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
                    {
                        bulkCopy.DestinationTableName = "[dbo].[XXXX]";
                        bulkCopy.BatchSize = 1000;
                        bulkCopy.WriteToServer(_dt);
                    }
                }
            }
            }
    }

if you just want foreach如果你只想 foreach

 foreach(DataTable _dt in dts){
         try
                {
                    using (SqlConnection connection = new SqlConnection(conn))
                    {
                        await connection.OpenAsync();
                        //using (SqlTransaction trans = connection.BeginTransaction())
                        using (CancellationTokenSource cts = new CancellationTokenSource())
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
                        {
                            bulkCopy.DestinationTableName = "[dbo].[XXXX]";
                            bulkCopy.BatchSize = 1000;
                            bulkCopy.WriteToServer(_dt);
                      }
                  }
             }            
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM