仅当所有查询都成功执行时才对数据库进行更改

时间:2011-05-12 18:59:53

标签: c# sql-server

有时我必须删除不同表上的两条记录。我怎么能以一种方式执行查询,如果一个失败,另一个将不执行,反之亦然。换句话说,只有当两个查询都成功时才会更新数据库,否则不会进行任何更改。这样,如果我收到任何错误,我知道没有任何改变。我在C#中执行此查询:

//qDelete is a string containing the query
// connection - SqlConnection 

SqlCommand cmd = new SqlCommand(qDelete, connection);
try
{
    var t = cmd.ExecuteNonQuery();
    MessageBox.Show("Query succesfully executed \n \n" + "\n\n" + t + " records successfully deleted");
}
catch
{
    //do something here to avoid having any changes to the database          
}

那很棒。我的sDelete字符串动态构建,我唯一缺少的是按正确的顺序放置语句。我想我必须首先从依赖表或表中删除那些具有约束的记录然后从另一个表中删除。我怎么能看到哪个表依赖于另一个表将帮助我构建这个查询。我可以做一些事情,比如对所有字符串进行排序,然后放置包含没有约束的表的字符串然后放置其他字符串。我怎样才能找出哪个表依赖于另一个表来使其更好?

4 个答案:

答案 0 :(得分:4)

答案是使用交易。使用SqlConnection,使用BeginTransaction()方法开始Transaction;它将返回一个SqlTransaction。然后,SqlCommand构造函数会重载,它将接受事务以及连接。运行命令,并在try块的末尾,调用事务上的Commit()方法。如果发现错误,请在事务上调用Rollback()。

答案 1 :(得分:3)

您希望使用Transaction将两个更新收集在一起,让它们既成功又不成功。该链接包含一个执行两次插入的示例,但您可以轻松地将其调整为两次删除。

答案 2 :(得分:2)

您需要使用ADO.Net的事务支持。尝试

    private static void DemoFunc() 
       {
          SqlConnection conn = new SqlConnection("");//conection string here
          SqlTransaction transaction;
          SqlCommand cmd;

          conn.Open();
          transaction = conn.BeginTransaction();
          try 
          {
             cmd = new SqlCommand("Your Query1", conn, transaction);//Your query in place of Your Query1 
             cmd.ExecuteNonQuery();

             cmd = new SqlCommand("Your Query2", conn, transaction);//Your query in place of Your Query2         
 cmd.ExecuteNonQuery();
             transaction.Commit();
          } 
          catch (SqlException sqlError) 
          {
             transaction.Rollback();
          }
          conn.Close();
       }

答案 3 :(得分:1)