使用 Microsoft.Build.Evaluation 发布数据库项目 (.sqlproj)

本文关键字:项目 sqlproj 数据库 Microsoft Build Evaluation 使用 | 更新日期: 2023-09-27 18:33:01

我需要能够以编程方式发布 SSDT 项目。我正在考虑使用 Microsoft.Build 来做到这一点,但找不到任何文档。创建 .dacpac 似乎很简单,但是我将如何发布到现有数据库或至少发布到.sql文件。这个想法是让它在我右键单击项目并选择发布时执行它所做的事情。它应与选定的数据库进行比较并生成升级脚本。

这是我到目前为止创建.dacpac的内容:

partial class DBDeploy
{
  Project project;

  internal void publishChanges()
  {
     Console.WriteLine("Building project " + ProjectPath);
     Stopwatch sw = new Stopwatch();
     sw.Start();
     project = ProjectCollection.GlobalProjectCollection.LoadProject(ProjectPath);
     project.Build();
     //at this point the .dacpac is built and put in the debug folder for the project
     sw.Stop();
     Console.WriteLine("Project build Complete.  Total time: {0}", sw.Elapsed.ToString());
  }
}

本质上,我正在尝试执行此MSBuild示例显示的内容,但是在代码中。

对不起,这就是我所拥有的一切。构建类的文档非常差。任何帮助将不胜感激。

谢谢。

使用 Microsoft.Build.Evaluation 发布数据库项目 (.sqlproj)

我不得不做类似的事情,因为我们以前使用的VSDBCMD没有部署到SQL Server 2012,我们需要支持它。我发现的是Microsoft.SqlServer.Dac程序集,它似乎是SQL Server数据工具的一部分(http://msdn.microsoft.com/en-us/data/tools.aspx)。

当您在客户端计算机上运行它时,您将需要完整版本的 .NET 4 框架以及 SQL CLR 类型和 SQL T-SQL ScriptDOM 包,可在此处找到:http://www.microsoft.com/en-us/download/details.aspx?id=29065

下面的代码来自我为测试新的部署方法并部署给定的 .dacpac 文件而制作的模型

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SqlServer.Dac;
    using System.IO;
    namespace ConsoleApplication3
    {
        class Program
        {
            private static TextWriter output = new StreamWriter("output.txt", false);
            static void Main(string[] args)
            {
                Console.Write("Connection String:");
                //Class responsible for the deployment. (Connection string supplied by console input for now)
                DacServices dbServices = new DacServices(Console.ReadLine());
                //Wire up events for Deploy messages and for task progress (For less verbose output, don't subscribe to Message Event (handy for debugging perhaps?)
                dbServices.Message += new EventHandler<DacMessageEventArgs>(dbServices_Message);
                dbServices.ProgressChanged += new EventHandler<DacProgressEventArgs>(dbServices_ProgressChanged);

                //This Snapshot should be created by our build process using MSDeploy
                Console.WriteLine("Snapshot Path:");
                DacPackage dbPackage = DacPackage.Load(Console.ReadLine());


                DacDeployOptions dbDeployOptions = new DacDeployOptions();
                //Cut out a lot of options here for configuring deployment, but are all part of DacDeployOptions
                dbDeployOptions.SqlCommandVariableValues.Add("debug", "false");

                dbServices.Deploy(dbPackage, "trunk", true, dbDeployOptions);
                output.Close();
            }
            static void dbServices_Message(object sender, DacMessageEventArgs e)
            {
                output.WriteLine("DAC Message: {0}", e.Message);
            }
            static void dbServices_ProgressChanged(object sender, DacProgressEventArgs e)
            {
                output.WriteLine(e.Status + ": " + e.Message);
            }
        }
    }

这似乎适用于2005及以后的所有SQL Server版本。Microsoft.SqlServer.Management.Dac 中也有一组类似的对象,但我相信这是在以前版本的 DACFx 中,不包含在最新版本中。因此,如果可以,请使用最新版本。

我们需要

一种方法来告诉msbuild如何以及在何处发布。在Visual Studio中打开你的项目并开始Publish它。在对话框中输入所有需要的信息,包括数据库连接信息和任何自定义 SQLCMD 变量值。 Save Profile As...到文件,例如 Northwind.publish.xml。(然后你可以Cancel。现在我们可以使用它和项目文件来构建和发布:

// Create a logger.
FileLogger logger = new FileLogger();
logger.Parameters = @"logfile=Northwind.msbuild.log";
// Set up properties.
var projects = ProjectCollection.GlobalProjectCollection;
projects.SetGlobalProperty("Configuration", "Debug");
projects.SetGlobalProperty("SqlPublishProfilePath", @"Northwind.publish.xml");
// Load and build project.
var dbProject = ProjectCollection.GlobalProjectCollection.LoadProject(@"Northwind.sqlproj");
dbProject.Build(new[]{"Build", "Publish"}, new[]{logger});

这可能需要一段时间,并且可能会卡住。要有耐心。:)

你应该使用 SqlPackage.exe 来发布你的 dacpac。

SqlPackage.exe 
  /Action:Publish 
  /SourceFile:C:/file.dacpac 
  /TargetConnectionString:[Connection string]

此外,无需传递太多参数,您可以将设置保存到DAC发布配置文件中(这可以从Visual Studio完成)

我想

基于 sqlproj 文件构建和发布一个数据库,并将有用的信息记录到控制台。这是我得出的结论:

using Microsoft.Build.Framework;
using Microsoft.Build.Execution;
public void UpdateSchema() {
    var props = new Dictionary<string, string> {
        { "UpdateDatabase", "True" },
        { "PublishScriptFileName", "schema-update.sql" },
        { "SqlPublishProfilePath", "path/to/publish.xml") }
    };
    var projPath = "path/to/database.sqlproj";
    var result = BuildManager.DefaultBuildManager.Build(
        new BuildParameters { Loggers = new[] { new ConsoleLogger() } },
        new BuildRequestData(new ProjectInstance(projPath, props, null), new[] { "Publish" }));
    if (result.OverallResult == BuildResultCode.Success) {
        Console.WriteLine("Schema update succeeded!");
    }
    else {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Schema update failed!");
        Console.ResetColor();
    }
}
private class ConsoleLogger : ILogger
{
    public void Initialize(IEventSource eventSource) {
        eventSource.ErrorRaised += (sender, e) => {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(e.Message);
            Console.ResetColor();
        };
        eventSource.MessageRaised += (sender, e) => {
            if (e.Importance != MessageImportance.Low)
                Console.WriteLine(e.Message);
        };
    }
    public void Shutdown() { }
    public LoggerVerbosity Verbosity { get; set; }
    public string Parameters { get; set; }
}

这适用于 .NET 4 及更高版本。请确保并包含对 Microsoft.BuildMicrosoft.Build.Framework 的程序集引用。