SqlBulkCopy有时无法正常工作,并且在重建表的索引期间没有返回错误

时间:2019-05-10 08:24:08

标签: indexing sqlbulkcopy rebuild

SqlBulkCopy.WriteToServer(DataTable)在我的表的索引重建过程中有时无法正常工作

可以使用以下方式轻松模拟:

  1. 创建一个包含10列,一个聚集索引(主键)和2个非聚集索引的表
  2. 使用500,000个伪数据填充表
  3. 创建一个程序以将100条记录插入表中(将其循环运行50次)
  4. 在运行程序时,继续执行重建索引命令,直到程序停止:

    ALTER INDEX [IX_11] ON [dbo]。TableA1重建有(SORT_IN_TEMPDB = OFF,ONLINE = ON)
    ALTER INDEX [IX_12] ON [dbo]。TableA1重建为(SORT_IN_TEMPDB = OFF,ONLINE = ON)

  5. 您有时会看到没有错误(SQLBulkCopy返回的复制行数为50000),但是数据库中只有49000

代码:

    SqlConnection conn = new SqlConnection(strConnection);
    conn.Open();
    using (SqlTransaction transaction = conn.BeginTransaction())
    {
        try
        {
            using (SqlBulkCopy bulkCopyItem = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction))
            {
                try
                {
                    bulkCopyItem.BulkCopyTimeout = 300;
                    foreach (DataColumn col in DataTableABC.Columns)
                    {
                        bulkCopyItem.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                    }
                    bulkCopyItem.BatchSize = 100;
                    bulkCopyItem.DestinationTableName = "dbo.TableA1";
                    bulkCopyItem.WriteToServer(DataTableABC); // prove await also can cause problem



                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    _logger.Error("Message=" + ex.Message + " ;" + TaskNo);
                    transaction.Rollback();
                }
            }
        }
        catch (Exception ex)
        {
            _logger.Error("Message=" + ex.Message + " ;" + TaskNo);
        }
    }
    conn.Close();

注意:

  1. 它经常因“模式更改异常...”而失败。可以,如果返回错误,我们可以重试。问题是SQLBulkCopy不返回任何错误,并且数据未插入数据库
  2. 使用SqlBulkCopyOptions.UseInternalTransaction可以正常工作
  3. 如果BatchSize <> 0,则工作正常(只要批大小小于实际行数,就可以正常工作)

由于我想使用现有事务并进行批处理(每次100个,并且BatchSize = 100),所以找不到更好的方法来解决此问题。仅在索引重建作业开始时发生

关于如何避免此问题的任何想法?谢谢

0 个答案:

没有答案