2012-05-03 31 views
14

Tôi cần có khả năng xuất bản một dự án SSDT theo chương trình. Tôi đang xem xét việc sử dụng Microsoft.Build để làm như vậy nhưng không thể tìm thấy bất kỳ tài liệu nào. Nó có vẻ khá đơn giản để tạo .dacpac, nhưng làm thế nào tôi có thể xuất bản tới một cơ sở dữ liệu hiện có hoặc ít nhất là vào một tệp .sql. Ý tưởng là để có nó làm những gì nó làm khi tôi nhấp chuột phải vào dự án và chọn xuất bản. Nó nên so sánh với một cơ sở dữ liệu được chọn và tạo ra một kịch bản nâng cấp.Sử dụng Microsoft.Build.Evaluation để xuất bản dự án cơ sở dữ liệu (.sqlproj)

Đây là những gì tôi có cho đến nay để tạo ra các .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()); 

    } 
} 

Về cơ bản tôi đang cố gắng để làm những gì MSBuild Example này chương trình nhưng trong mã.

Xin lỗi vì đây là tất cả những gì tôi có. Các doecumentation trên các lớp Xây dựng là rất nghèo. Bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn.

Trả lời

3

Chúng tôi cần một cách nói cho msbuild biết cách thức và nơi xuất bản. Mở dự án của bạn trong Visual Studio và bắt đầu Publish nó. Nhập tất cả thông tin cần thiết trong hộp thoại, bao gồm thông tin kết nối DB của bạn và bất kỳ giá trị biến SQLCMD tùy chỉnh nào. Save Profile As... vào một tệp, ví dụ: Northwind.publish.xml. (. Bạn có thể sau đó Cancel) Bây giờ chúng ta có thể sử dụng và hồ sơ dự án để xây dựng và công bố:

// 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}); 

này có thể mất một thời gian và có thể xuất hiện để gặp khó khăn. Kiên nhẫn. :)

+1

Tôi cần tham chiếu cả cụm từ 'Microsoft.Build' và' Microsoft.Build.Framework' để mã này hoạt động. – Sam

+0

Hãy chắc chắn kiểm tra giá trị trả về của 'Build' để xem nó có thành công hay không. – Sam

+0

Để theo dõi các sự kiện xây dựng, sử dụng 'ConfigurableForwardingLogger' và đặt' BuildEventRedirector' thành một 'IEventRedirector' tùy chỉnh. Bạn có thể kiểm tra lỗi bằng cách kiểm tra nếu 'buildEvent' là' BuildErrorEventArgs'. – Sam

1

Bạn nên sử dụng SqlPackage.exe để xuất bản dacpac của mình.

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

Ngoài ra thay vì đi qua quá nhiều thông số bạn có thể lưu các thiết lập của bạn vào DAC Xuất bản hồ sơ (điều này có thể được thực hiện từ visual studio)

+1

'should' ... nên là' can' :) – ppumkin

19

tôi phải làm một cái gì đó tương tự như này vì VSDBCMD mà chúng tôi sử dụng trước đây không triển khai cho SQL Server 2012 và chúng tôi cần hỗ trợ nó. Những gì tôi tìm thấy là hội đồng Microsoft.SqlServer.Dac có vẻ như là một phần của các công cụ dữ liệu SQL Server (http://msdn.microsoft.com/en-us/data/tools.aspx)

Khi bạn chạy nó trên máy khách, bạn sẽ cần phiên bản đầy đủ của khung công tác .NET 4 và các loại SQL CLR và gói SQL T-SQL ScriptDOM tìm thấy ở đây: http://www.microsoft.com/en-us/download/details.aspx?id=29065

Mã dưới đây là từ một mockup tôi đã thực hiện để thử nghiệm các phương pháp triển khai mới và triển khai một file .dacpac cho

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); 
      } 
     } 
    } 

Điều này có vẻ để làm việc trên tất cả các phiên bản của SQL Server từ năm 2005 trở lên. Có một tập hợp các đối tượng tương tự có sẵn trong Microsoft.SqlServer.Management.Dac, tuy nhiên tôi tin rằng đây là phiên bản trước của DACFx và không có trong phiên bản mới nhất. Vì vậy, hãy sử dụng phiên bản mới nhất nếu bạn có thể.

+1

Rực rỡ, sử dụng các hội đồng DACPAC cho phép tôi kiểm soát hoàn toàn việc triển khai. Cũng hữu ích cho các bài kiểm tra tích hợp! – Raffaeu

+0

Cuối cùng, một câu trả lời hợp lý! Cảm ơn - Chỉ muốn thêm rằng bạn cần sao chép/tham chiếu đến 'sqlserver.dac.dll' từ' Microsoft Visual Studio?. 0 \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ DAC \ 120' - Hoạt động thực sự tốt, chính xác những gì tôi cần, đơn giản và nhanh chóng. Điều này nên được chấp nhận! – ppumkin

+0

Bất kỳ trải nghiệm nào với việc đặt cờ "upgradeExisting" thành false? Tôi nhận được một ngoại lệ nói với tôi "Không thể triển khai cơ sở dữ liệu hiện có khi nâng cấp đã bị vô hiệu hóa". Nhưng tôi muốn DacServices để loại bỏ cơ sở dữ liệu đầu tiên. Nó không hoạt động, ngay cả khi tôi thêm các tùy chọn với CreateNewDatabase = true – Peter

1

Tôi muốn xây dựng và xuất bản cơ sở dữ liệu dựa trên tệp sqlproj và ghi nhật ký thông tin hữu ích vào bảng điều khiển. Đây là những gì tôi đã đến:

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; } 
} 

Đây là dành cho .NET 4 trở lên. Hãy chắc chắn và bao gồm các tham chiếu lắp ráp cho Microsoft.BuildMicrosoft.Build.Framework.

Các vấn đề liên quan