我有一个调用bat文件的C#应用程序:
new string[] { branchName + ".Order", "Order.bak", "Order"}
var arguments = String.Format("\"{0}\"\"{1}\"\"{2}\"\"{3}\"", stringse[0], stringse[1], stringse[2], sqlPath + "\\");
var psi = new System.Diagnostics.ProcessStartInfo(filename)
{
RedirectStandardOutput = true,
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
UseShellExecute = false,
Arguments = arguments
};
Process createDBs = Process.Start(psi);
System.IO.StreamReader myOutput = createDBs.StandardOutput;
while (!createDBs.HasExited)
{
string output = myOutput.ReadToEnd();
LogStep(output);
}
bat文件如下所示:
@echo off
REM ************************************************
REM * RestoreDB script for use by Development Team *
REM ************************************************
@echo %1 %2 %3 %4
@echo Restore of database started...
SQLCMD -S (local) -d Master -i RestoreDB.sql -v varDatabaseName=%1 varDatabaseBackupFileName= %2 varLogicalName= %3 varSQLDataFolder= %4
@echo Restore of database finished...
pause
Sql脚本看起来像这样接收这些参数:
SET @DatabaseName = N' $(varDatabaseName)'
SET @DatabaseBackupFileName = N' $(varDatabaseBackupFileName)'
SET @LogicalName = N' $(varLogicalName)'
SET @SQLDataFolder = N' $(varSQLDataFolder)'
(由于安全原因,无法粘贴完整代码)
现在我的问题是我不认为我正确地将变量从bat传递到sql脚本。
当用C#调用bat文件时,它回显了值
当直接从命令提示符调用sql时它正常工作,所以我知道我的sql脚本正在工作:
SQLCMD -S (local) -d Master -i RestoreDB.sql -v varDatabaseName="Piet.Order.Test" varDatabaseBackupFileName="Order.bak" varLogicalName="Order" varSQLDataFolder="C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\"
我没有收到任何错误回到我的C#应用程序,因此在运行我的应用程序时它只是运行并使用参数调用bat,从bat到sql的调用似乎出错。这是一个格式问题我的参数。我试过单引号'%1'并尝试了双重引号"%1",似乎没有任何工作。任何人都可以发光。任何方式也许我可以如何检索调用sql时发生的错误
答案 0 :(得分:0)
您需要在参数之间添加空格
var arguments = String.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"",
stringse[0], stringse[1], stringse[2], sqlPath + "\\");
在这些场景中(调试参数)对于启动命令处理器并在执行程序后保持控制台窗口打开非常有用
var arguments = String.Format("/K {4} \"{0}\" \"{1}\" \"{2}\" \"{3}\"",
stringse[0], stringse[1], stringse[2], sqlPath + "\\", filename);
并在ProcessStartInfo中调用命令处理器
var psi = new System.Diagnostics.ProcessStartInfo("cmd.exe")