void ITransaction.CommitTransaction(string connectionString, SqlConnection connection) { if (!_list.Any()) { return; } if (_disableAllIndexes && (_disableIndexList != null && _disableIndexList.Any())) { throw new InvalidOperationException("Invalid setup. If \'TmpDisableAllNonClusteredIndexes\' is invoked, you can not use the \'AddTmpDisableNonClusteredIndex\' method."); } DataTable dt = _helper.ToDataTable(_list, _columns, _customColumnMappings); // Must be after ToDataTable is called. _helper.DoColumnMappings(_customColumnMappings, _columns, _updateOnList); using (SqlConnection conn = _helper.GetSqlConnection(connectionString, connection)) { conn.Open(); using (SqlTransaction transaction = conn.BeginTransaction()) { //Bulk insert into temp table using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn, _sqlBulkCopyOptions, transaction)) { try { bulkcopy.DestinationTableName = _helper.GetFullQualifyingTableName(conn.Database, _schema, _tableName); _helper.MapColumns(bulkcopy, _columns, _customColumnMappings); _helper.SetSqlBulkCopySettings(bulkcopy, _bulkCopyEnableStreaming, _bulkCopyBatchSize, _bulkCopyNotifyAfter, _bulkCopyTimeout); SqlCommand command = conn.CreateCommand(); command.Connection = conn; command.Transaction = transaction; if (_disableAllIndexes || (_disableIndexList != null && _disableIndexList.Any())) { command.CommandText = _helper.GetIndexManagementCmd(IndexOperation.Disable, _tableName, _disableIndexList, _disableAllIndexes); command.ExecuteNonQuery(); } bulkcopy.WriteToServer(dt); if (_disableAllIndexes || (_disableIndexList != null && _disableIndexList.Any())) { command.CommandText = _helper.GetIndexManagementCmd(IndexOperation.Rebuild, _tableName, _disableIndexList, _disableAllIndexes); command.ExecuteNonQuery(); } transaction.Commit(); bulkcopy.Close(); } catch (Exception) { transaction.Rollback(); throw; } finally { conn.Close(); } } } } }