如何回滚提交到数据库的数据

时间:2017-01-20 10:13:21

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

我有两个表Table1,Table2。最初我需要在table1中插入一行并获取插入行的Id,在table2中使用此Id。但是如果在table2中插入数据时出现任何错误,那么table1也需要进行回滚支持。我正在使用语句编写,但仍然没有发生这种情况。这就是我试过的

    using(cn = new SqlConnection(connectionString))
        {
         cn.open()
          using (var cm = cn.CreateCommand())
                {
                    cm.CommandType = CommandType.StoredProcedure;
                    cm.CommandText = Constants.InsertNewJob;  // inserts a job in table1
                    try
                    {
                        var jobId = Convert.ToInt32(cm.ExecuteScalar());

                        DataTable dt = QueueData.ToDataTable(); // queuedata contains large data which is converted to datatable
                        dt.Columns.Add("JobId", typeof(int), jobId.ToString()); // adding the retrieved jobId to datatable

                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(cn))
                            {
                                bulkCopy.DestinationTableName = Constants.DestinationTableName; //Table 2 which uses job id which is retrieved from Table 1
                                bulkCopy.ColumnMappings.Add("JobId", "JobId");
                                bulkCopy.ColumnMappings.Add("DateTime", "DateTime");
                                bulkCopy.WriteToServer(dt);
                            }
                        }
                        catch(Exception ex)
                        {
                            Logger.Error(ex.Message, "Error while inserting data");
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex.Message, "Error while inserting new job into transaction table");
                    }
                }
                cn.close()
        }

如果表中有任何错误,批量插入仍然会导致添加到table1中的数据无法回滚。请帮助。 感谢

2 个答案:

答案 0 :(得分:2)

您需要将transaction传递给SqlBulkCopy构造函数。

using (SqlTransaction transaction = myConnection.BeginTransaction())
{
    using (var bulkCopy = new SqlBulkCopy(myConnection, SqlBulkCopyOptions.Default, transaction))
    {
       try
       {
            bulkCopy.DestinationTableName = Constants.DestinationTableName;
            bulkCopy.ColumnMappings.Add("JobId", "JobId");
            bulkCopy.ColumnMappings.Add("DateTime", "DateTime");
            bulkCopy.WriteToServer(dataSource);
            transaction.Commit();
       }
       catch (Exception ex)
       {
           Logger.Error(ex.Message, "Error while inserting data");
           transaction.Rollback();
       }
    }
}

请参阅this article

答案 1 :(得分:0)

您必须创建交易。 请查看MSDN website

简要示例:

    // Start a local transaction.
    transaction = cn.BeginTransaction("SampleTransaction");

    // Must assign both transaction object and connection
    // to Command object for a pending local transaction
    command.Connection = cn;
    command.Transaction = transaction;

    // TRY to query the database
    // transaction.Commit();

然后在 catch块中使用transaction.Rollback();