我有两个表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中的数据无法回滚。请帮助。 感谢
答案 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();
。