[英]Execution flow of SQL Script in c#
如果c#中有任何失敗,這不是回滾sql事務的重復問題。 但是這個問題是基於上一個問題的內容。 感謝所有對我的最后一個問題發表意見的人。我嘗試了所有這些解決方案,最終發現在多語句事務中不允許在我的應用程序(DDL)中使用腳本。
我的整個代碼是這樣的:
script1 = "CREATE USER " + username + " FROM LOGIN " + username;
script2 = "CREATE ROLE " + rolename;
script3 = @"CREATE ROLE [db_execute] AUTHORIZATION [dbo]
GRANT EXECUTE TO [db_execute]";
script4 = @"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";
script_result = string.Format(script4, rolename);
script6 = "EXEC sp_addrolemember '{0}', '{1}'";
outp = string.Format(script6, rolename, username);
script7 = @"select m.name as Member, r.name as Role
from sys.database_role_members
inner join sys.database_principals m on sys.database_role_members.member_principal_id = m.principal_id
inner join sys.database_principals r on sys.database_role_members.role_principal_id = r.principal_id";
並以如下所示的相同方式執行所有這些操作:
SqlCommand SqlCmd = new SqlCommand();
//Create User Script Execution
SqlCmd.CommandText = script1;
SqlCmd.Connection = oConnection;
lvinfo.Items.Add("Executing Create User script in " + dbname + " database");
var answer = SqlCmd.ExecuteNonQuery();
//Checking whether execution completed successfully
if (!answer.Equals(0))
{
lvinfo.Items.Add("Create User script executed successfully in " + dbname + " database");
}
else
{
lvinfo.Items.Add("Create User script execution failed in " + db_select.SelectedItem.ToString() + " database");
}
即使我只寫了這段代碼,現在我對這些腳本的執行還是有些懷疑。 單擊按鈕,一次即可執行上面顯示的所有腳本。 我想知道的是,這些腳本會一次全部執行嗎?意味着,一次執行這些腳本時是否有執行失敗的可能?數據庫斷開或其他任何錯誤的機會。
讓我向您展示一個我要問的示例:如果以某種方式執行了前三個腳本,而所有其他腳本都失敗了,那么是否有自動回滾的機會?
還是我的代碼在執行整個代碼之前檢查是否有任何錯誤或失敗的機會,這樣就不需要回滾了?
任何人都可以通過他們的寶貴建議和想法來支持我。
任何幫助將非常感激..
我已經給出了大概的樣子的骨架。 您可以告訴我您想在什么情況下回滾什么,而不是什么情況。
var scriptToExecute = new Dictionary<int, string>();
var scriptToRollback = new Dictionary<int, string>();
try
{
using (SqlCommand SqlCmd = new SqlCommand())
{
//Create User Script Execution
SqlCmd.CommandText = script1;
SqlCmd.Connection = oConnection;
lvinfo.Items.Add("Executing Create User script in " + dbname + " database");
var answer = SqlCmd.ExecuteNonQuery();
//Checking whether execution completed successfully
if (!answer.Equals(0))
{
lvinfo.Items.Add("Create User script executed successfully in " + dbname + " database");
}
else
{
lvinfo.Items.Add("Create User script execution failed in " + db_select.SelectedItem.ToString() + " database");
}
}
}
catch (SqlException)
{
string rollbackScript = string.Empty;
for (int i = scriptExecuting; i > 0; i--)
{
scriptToRollback.TryGetValue(i, rollbackScript);
if (!string.IsEmpty(rollbackScript))
{
//Execute the scripts here.
}
}
}
finally
{
//If connection is open then close the active connection
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.