14

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 クラスのドキュメントは非常に貧弱です。どんな助けでも大歓迎です。

ありがとう。

4

4 に答える 4

20

以前使用していた VSDBCMD は SQL Server 2012 に展開されず、それをサポートする必要があったため、これと同様のことを行う必要がありました。私が見つけたのは、SQL Server データ ツール ( http://msdn.microsoft.com/en-us/data/tools.aspx )の一部として提供されていると思われる Microsoft.SqlServer.Dac アセンブリでした。

これをクライアント マシンで実行する場合は、フル バージョンの .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 にあり、最新バージョンには含まれていないと思います。そのため、可能であれば最新バージョンを使用してください。

于 2012-08-13T12:03:53.827 に答える
3

msbuild にパブリッシュの方法と場所を伝える方法が必要です。プロジェクトを Visual Studio で開き、開始しPublishます。DB 接続情報やカスタム 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});

これにはしばらく時間がかかり、スタックしているように見える場合があります。我慢して。:)

于 2012-06-07T14:04:33.253 に答える
1

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.BuildおよびMicrosoft.Build.Frameworkへのアセンブリ参照を必ず含めてください。

于 2016-07-08T18:24:00.273 に答える
1

dacpacを公開するには、SqlPackage.exe を使用する必要があります。

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

また、あまりにも多くのパラメーターを渡す代わりに、設定を DAC Publish Profile に保存できます (これは Visual Studio から実行できます)。

于 2012-06-11T18:48:45.730 に答える