2011-05-12 30 views
3

有时我必须删除不同表上的两条记录。我怎样才能以某种方式执行查询,如果一个失败,另一个不会执行,反之亦然。换句话说,只有当两个查询都成功时数据库才会更新,否则不会做任何更改。这样,如果我得到任何错误,我知道什么都没有改变。我在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字符串动态生成,唯一缺少的东西是将语句按正确的顺序排列。我发现我必须首先删除依赖表或表中的记录,然后再从另一个表中删除约束条件。我怎么能看到哪个表依赖于其他表将帮助我构建这个查询。我可以做一些事情,比如排序所有的字符串,然后放置那些没有约束的表格,然后放置其他的。我怎样才能找出哪个表取决于其他表使其更好?

回答

3

您想要使用Transaction将两个更新集中在一起,并让它们都成功或者都不发生。该链接包含一个可以执行两次插入的示例,但是您可以轻松地将其适用于两次删除。

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(); 
     } 
4

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

+0

你知道交易所用的版本是什么吗?它只是2008年还是以前的版本支持这个? – 2011-05-12 19:22:11

+0

事务在数据库数据维护方面有点儿大问题,所以我希望你能在任何给你ADO.NET的框架中访问它们。当然.NET Framework 2.0和(VS2005)都会有事务支持。 – KeithS 2011-05-12 19:42:02

+0

我的意思是SQL Server的版本,是基于框架的事务还是基于数据库? (数据库是否支持它)。 – 2011-05-12 19:46:06

相关问题