我正在尝试通过visual studio运行SQLpackage.exe提示,以帮助实现自动化过程。我在命令提示符下测试了字符串,它运行正常。当我通过VS17运行它时,我得到一个打开/关闭的提示,没有任何反应。我能做些什么才能做到这一点?
为了澄清,我希望在命令行中使用的字符串应如下所示:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath"
我的字符串输出到控制台:
Console.WriteLine(@"""C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage"" /a:PUBLISH /sf:""C:\targetdacpac.dacpac"" /tsn:""(local)\SQL2016"" /tdn:""DBtargpath""");
返回:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath"
我的代码附在下面。我不太熟悉通过VS运行命令行参数,但我做了足够的研究,知道我的案例是相当独特的,因为它包含了很多字符串文字。
System.Diagnostics.Process process = new System.Diagnostics.Process();
try {
ProcessStartInfo startInfo = new ProcessStartInfo("CMD.EXE");
startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.Arguments = @"""C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage"" /a:PUBLISH /sf:""C:\targetdacpac.dacpac"" /tsn:""(local)\SQL2016"" /tdn:""DBtargpath""";
Process.Start(startInfo);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
编辑:由于文件路径中的间距,看起来我收到错误。发送多个字符串文字时,它无法正常工作。我会继续挖掘。
答案 0 :(得分:0)
只需在作为字符串一部分的引号前加一个反斜杠,就可以了。
startInfo.Arguments = "This \" is ok";
最后
这"没关系
将是参数
答案 1 :(得分:0)
我在多天的测试中最终解决了自己的问题。我仍然没有直接解决我原来的问题,但只是编译.bat中的命令是一个有效的解决方案。
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath"
PAUSE
暂停使终端保持打开状态,如果您不需要,请将其删除。我用它来测试,所以我可以看到输出,并确保我的命令正常工作。
try
{
ProcessStartInfo processStart = new ProcessStartInfo("Cmd.exe")
{
UseShellExecute = false,
RedirectStandardInput = true, //shows output in VS
Arguments = @"/k C:\DacPacs\runcmd.bat"
};
Process process = new Process() { StartInfo = processStart };
process.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
答案 2 :(得分:0)
而不是指定ProcessStartInfo(“cmd.exe”),而不是ProcessStartInfo(@“C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ DAC \ 140 \ SqlPackage .EXE“)?
或者,或者,您可以直接使用Microsoft.SqlServer.Dac API。 NuGet包在这里:https://www.nuget.org/packages/Microsoft.SqlServer.DacFx.x64