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