2014-03-03 26 views
2

deploying a supplied package to a database如何在調用DacService.Deploy後取消並回滾升級包?

DacServices service = new DacServices(connectionString); 
DacPackage dacpac = DacPackage.Load(dacpacPath); 
DacDeployOptions ddo = new DacDeployOptions(); 
ddo.BlockOnPossibleDataLoss = false; 
service.Deploy(dacpac, dbName, true, ddo); 

你怎麼可以取消它通過取消標記,並將此回滾整個部署行動?

所以,我可以創建一個取消令牌並將其傳遞給Deploy方法,但是,之後我該如何取消它?但是,它是否會回滾整個操作?

CancellationToken token = new CancellationToken(); 
service.Deploy(dacpac, dbName, true, ddo, token); 

回答

2

DacDeployOptions.IncludeTransactionalScripts標誌設置爲「true」會將模型部署步驟包裝在事務中。如果部署失敗或取消,引擎將嘗試回滾這些步驟。請注意,事前/事後部署腳本步驟不會放置在事務中,因此如果您使用這些步驟,則需要自己使事務處理成爲事務性事務。這是因爲:a)引擎不解析它們或試圖理解它們的內容; b)它們可能包含與事務不兼容的代碼,所以引擎不會嘗試強制執行事務。

要實際呼叫取消,您可以使用CancellationTokenSource。我認爲代碼看起來像這樣:

DacServices service = new DacServices(connectionString); 
DacPackage dacpac = DacPackage.Load(dacpacPath); 
DacDeployOptions ddo = new DacDeployOptions(); 
ddo.BlockOnPossibleDataLoss = false; 
ddo.IncludeTransactionalScripts = true; 
CancellationTokenSource tokenSource = new CancellationTokenSource(); 
service.Deploy(dacpac, dbName, true, ddo, tokenSource.Token); 
tokenSource.Cancel();