예제 #1
0
 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);
     }
 }
예제 #2
0
        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);
            }
        }
예제 #3
0
        /// <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);
        }