从bat文件到sql脚本的参数不起作用

时间:2014-05-23 06:08:34

标签: c# sql command-line

我有一个调用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时发生的错误

1 个答案:

答案 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")