Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当所有查询都成功执行时才对数据库进行更改_C#_Sql Server - Fatal编程技术网

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

C# 仅当所有查询都成功执行时才对数据库进行更改,c#,sql-server,C#,Sql Server,有时我不得不删除不同表上的两条记录。我如何执行查询,如果其中一个失败,另一个将不会执行,反之亦然。换句话说,只有当两个查询都成功时,数据库才会更新,否则不做任何更改。这样,如果我有任何错误,我知道没有任何改变。我正在C#中执行此查询,如下所示: 那太好了。我的sDelete字符串是动态生成的,我唯一缺少的就是按正确的顺序放置语句。我认为我必须先从依赖表或具有约束的表中删除记录,然后再从另一个表中删除记录。如何查看哪个表依赖于另一个表将帮助我构建此查询。我可以对所有字符串进行排序,首先放置包含无约

有时我不得不删除不同表上的两条记录。我如何执行查询,如果其中一个失败,另一个将不会执行,反之亦然。换句话说,只有当两个查询都成功时,数据库才会更新,否则不做任何更改。这样,如果我有任何错误,我知道没有任何改变。我正在C#中执行此查询,如下所示:


那太好了。我的sDelete字符串是动态生成的,我唯一缺少的就是按正确的顺序放置语句。我认为我必须先从依赖表或具有约束的表中删除记录,然后再从另一个表中删除记录。如何查看哪个表依赖于另一个表将帮助我构建此查询。我可以对所有字符串进行排序,首先放置包含无约束表的字符串,然后放置其他字符串。如何找出哪个表依赖于另一个表才能使这一点变得更好?

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

您需要使用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();
       }

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

在SQLCommand事务上尝试此操作


您知道事务处理的版本吗?是2008年还是以前的版本支持这个功能?事务在DB数据维护中是一件大事,所以我希望您可以在任何提供ADO.NET的框架中访问它们。当然,.NETFramework 2.0及更高版本(即VS2005)将提供事务支持。我的意思是SQL Server的版本,事务是基于该框架还是基于数据库?SQL Server 2000和更高版本肯定会为您提供事务性支持。我也很确定它可以追溯到更远的地方;正如我所说,ACID事务是RDBMSE的基石。
    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();
       }