private void AddSqlCmdVariables(ScriptExecutionArgs args, string targetDatabaseName) { args.Variables.Add("DatabaseName", targetDatabaseName); foreach (var variable in DeployOptions.SqlCommandVariableValues) { args.Variables.Add(variable.Key, variable.Value); } }
private void RunDeploymentScriptFromReferences(FileInfo dacpacPackage, string targetDatabaseName, bool isPreDeploy) { using var model = new TSqlModel(dacpacPackage.FullName, DacSchemaModelStorageType.Memory); var references = model.GetReferencedDacPackages(); if (!references.Any()) { return; } var builder = new SqlConnectionStringBuilder(ConnectionStringBuilder.ConnectionString); if (!isPreDeploy) { // Only set initial catalog for post-deployment script since database might not exist yet for pre-deployment builder.InitialCatalog = targetDatabaseName; } var executionEngineConditions = new ExecutionEngineConditions { IsSqlCmd = true }; using var engine = new ExecutionEngine(); using var connection = new SqlConnection(builder.ConnectionString); connection.Open(); foreach (var reference in references) { if (!File.Exists(reference)) { // TODO Format output to allow warning to show up in Error List _console.WriteLine($"warning: Unable to find referenced .dacpac at '{reference}'"); continue; } using var referencedPackage = DacPackage.Load(reference); var script = isPreDeploy ? referencedPackage.GetPreDeploymentScript() : referencedPackage.GetPostDeploymentScript(); if (string.IsNullOrEmpty(script)) { continue; } string scriptPrefix = isPreDeploy ? "pre" : "post"; _console.WriteLine($"Running {scriptPrefix}-deployment script for referenced package '{referencedPackage.Name}' version '{referencedPackage.Version}'"); _currentSource = $"{referencedPackage.Name}/{scriptPrefix}deploy.sql"; var scriptExecutionArgs = new ScriptExecutionArgs(script, connection, 0, executionEngineConditions, this); AddSqlCmdVariables(scriptExecutionArgs, targetDatabaseName); engine.BatchParserExecutionError += (sender, args) => _console.WriteLine(args.Format(_currentSource)); engine.ScriptExecutionFinished += (sender, args) => _console.WriteLine($"Executed {scriptPrefix}-deployment script for referenced package " + $"'{referencedPackage.Name}' version '{referencedPackage.Version}' with result: {args.ExecutionResult}"); engine.ExecuteScript(scriptExecutionArgs); } }
/// <summary> /// Execut the script /// </summary> /// <param name="exec">Execution Engine</param> /// <param name="connection">SQL connection</param> /// <param name="script">script text</param> /// <param name="conditions">Execution condition</param> /// <param name="batchHandler">Batch event handler</param> /// <param name="timeout">time out value</param> static void ExecuteScript(ExecutionEngine exec, SqlConnection connection, string script, ExecutionEngineConditions conditions, IBatchEventsHandler batchHandler, int timeout) { Validate.IsNotNull(nameof(exec), exec); Validate.IsNotNull(nameof(connection), connection); Validate.IsNotNullOrEmptyString(nameof(script), script); Validate.IsNotNull(nameof(conditions), conditions); Console.WriteLine("------------------------ Executing Script ----------------------"); //exec.BeginScriptExecution(script, connection, timeout, conditions, batchConsumer); ScriptExecutionArgs args = new ScriptExecutionArgs(script, connection, timeout, conditions, batchHandler); //exec.ExecuteScript(args); _executionThread = new Thread(new ParameterizedThreadStart(exec.ExecuteScript)); _executionThread.Start(args); }