我需要能够以编程方式发布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 Example所显示的内容,但是在代码中。
很抱歉这就是我的全部。 Build类的doecumentation很差。任何帮助将不胜感激。
感谢。
答案 0 :(得分:20)
我必须做类似的事情,因为我们之前使用的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中,并不包含在最新版本中。如果可以,请使用最新版本。
答案 1 :(得分:3)
我们需要一种方法告诉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});
这可能需要一段时间,可能会卡住。耐心点。 :)
答案 2 :(得分:1)
您应该使用SqlPackage.exe发布您的dacpac。
SqlPackage.exe
/Action:Publish
/SourceFile:C:/file.dacpac
/TargetConnectionString:[Connection string]
此外,您可以将设置保存到DAC发布配置文件(这可以通过visual studio完成),而不是传递太多参数。
答案 3 :(得分:1)
我想基于sqlproj文件构建和发布数据库,并将有用的信息记录到控制台。这是我到达的地方:
node->key
这适用于.NET 4及更高版本。请确保并包含 Microsoft.Build 和 Microsoft.Build.Framework 的程序集引用。