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);
// ----------------
}
我正在尝试使用 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);
// ----------------
}