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

我需要能够以编程方式发布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示例显示但在代码中。

对不起,这就是我的全部。 Build类的doecumentation很差。 任何帮助,将不胜感激。

谢谢。

我不得不做类似的事情,因为我们以前使用的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(dbServices_Message); dbServices.ProgressChanged += new EventHandler(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...文件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 { { "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的程序集引用。