gpt4 book ai didi

c# - 如果在 c# 中有任何失败,则回滚 sql 事务

转载 作者:行者123 更新时间:2023-11-30 20:54:39 24 4
gpt4 key购买 nike

我有一个 Windows 窗体应用程序,单击按钮即可在数据库中执行一些 sql 脚本。这些 sql 脚本执行用户创建,并授予一些权限,如数据执行、数据读/写等。这是我执行此操作的示例 C# 代码:

script1 = "CREATE USER " + username + " FROM LOGIN " + username;
script2 = @"CREATE ROLE [db_execute] AUTHORIZATION [dbo]
GRANT EXECUTE TO [db_execute]";

script3 = @"DECLARE @rolename varchar(max)
SET @rolename ='{0}'
EXEC sp_addrolemember N'db_execute',@rolename
EXEC sp_addrolemember N'db_datareader', @rolename
EXEC sp_addrolemember N'db_datawriter', @rolename";

然后像这样在数据库中执行:

SqlCmd.CommandText = script1;
SqlCmd.Connection = oConnection;
var ans = SqlCmd.ExecuteNonQuery();

if (!ans.Equals(0))
{
//some task
} else
{
//messagebox
}

SqlCmd.CommandText = script2;
SqlCmd.Connection = oConnection;
var answer = SqlCmd.ExecuteNonQuery();

if (!answer.Equals(0))
{
//some task
} else
{
//messagebox
}

SqlCmd.CommandText = script3;
SqlCmd.Connection = oConnection;
var answ = SqlCmd.ExecuteNonQuery();

if (!answ.Equals(0))
{
//some task
} else
{
//messagebox
}

我通过按一个按钮一次执行所有这些脚本,所以据我所知,我将其作为单个事务执行。我想做的是,如果万一这些脚本中的任何一个在中间失败,我应该能够在不做任何更改的情况下完全回滚。

为了给你一个更好的画面,如果 script3 的执行由于某种原因失败,它应该自动回滚 script1 和 script2 在数据库中所做的一切。

我们如何做到这一点?我用谷歌搜索了一下,发现了一些与此无关的帖子。

任何帮助或想法将不胜感激..

最佳答案

使用 SqlConnection 和 SqlTransaction 对象。尝试这个;

   {       
// declarations

try
{
// open connection
trans = conn.BeginTransaction();
cmd.Transaction = trans; // Includes this cmd as part of the trans

SqlCmd.CommandText = script1;
SqlCmd.Connection = oConnection;
var ans = SqlCmd.ExecuteNonQuery();


if (!answ.Equals(0))
{
//some task
} else
{
//messagebox
}

// Your other queries

trans.Commit(); // commit transaction

}
catch (Exception e){
trans.Rollback();
throw e;
}
finally{
conn.Close();
}

关于c# - 如果在 c# 中有任何失败,则回滚 sql 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com