SQlPackage For DacPac Deploy using .net C# System.Diagnostics.process

SQlPackage For DacPac Deploy using .net C# System.Diagnostics.process

我正在尝试使用 System.Diagnostics.process

从 windowsfroms 项目调用 SQlPackage

下面是我使用 dacpac 路径和连接字符串作为参数调用 Sqlpacakage 的代码片段

    ProcessStartInfo procStartInfo = new ProcessStartInfo();
    procStartInfo.FileName = @"C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\Extensions\Microsoft\SQLDB\DAC0\sqlpackage.exe";
    procStartInfo.Arguments = @"/Action:Publish /SourceFile:""C:\Myfiles\Samples\TestDatabse\Snapshots\TestDatabse_20191201_12 - 59 - 10.dacpac"" /TargetConnectionString:""Data Source = Server; Integrated Security = False; Initial Catalog = AdventureWorksDW2014; User ID = User; Password = Password; "" /p:DropObjectsNotInSource=False /p:BlockOnPossibleDataLoss=True /dsp:""C:\sqlOutput\Deploy.sql""";;
    procStartInfo.RedirectStandardOutput = true;
    procStartInfo.UseShellExecute = false;
    procStartInfo.CreateNoWindow = true;

    using (Process process = new Process())
    {
        process.StartInfo = procStartInfo;
        process.Start();

        process.WaitForExit();

        StreamReader reader = process.StandardOutput;
        string output = reader.ReadToEnd();
      }

当我执行代码片段时,进程不会等到数据库部署。如果我读取输出,我会得到输出的第一行,例如 Publishing to database 'AdventureWorksDW2014' on server ''。在此之后进程将退出,并且数据库不会更新到给定的 dACPAC。

有什么建议的方法可以让我等到给定 DACPAC 的部署完成并在服务器中发布 DACPAC。

从外观上看,exe 无法处理 install/publish。我可能是错的,但如果有任何错误,也可以通过重定向错误输出来输出错误。一旦出现错误,您应该可以从那里进行故障排除。

    procStartInfo.RedirectStandardOutput = true;
    procStartInfo.UseShellExecute = false;
    procStartInfo.CreateNoWindow = true;
    procStartInfo.RedirectStandardError = true; // <--- Add this line

    using (Process process = new Process())
    {
        process.StartInfo = procStartInfo;
        process.Start();
        process.WaitForExit();


        // ---> I would add this here...
        var result = process.StandardOutput.ReadToEnd();
        string err = process.StandardError.ReadToEnd(); // <-- Capture errors

        if (!string.IsNullOrEmpty(err))
        {
           Console.WriteLine(err); // <---- Print any errors for troubleshooting
        }
        Console.WriteLine(result);
        // ----------------        
      }