我有一个 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
}
我通过按一个按钮一次执行所有这些脚本,所以据我所知,我将其作为单个事务执行。我想要做的是,如果这些脚本中的任何一个在两者之间失败,我应该能够完全回滚而不做任何更改。
为了给你一个更好的画面,如果脚本3的执行由于某种原因失败,它应该自动回滚数据库中的脚本1和脚本2。
我们应该怎么做?我用谷歌搜索了一下,发现了一些与此无关的帖子。
任何帮助或想法将不胜感激..