Сначала давайте объявим класс для результата выполнения :
public sealed class ExecutionSqlCmdResult {
public ExecutionSqlCmdResult(string stdOut, string stdErr, int exitCode)
: base() {
Out = string.IsNullOrWhiteSpace(stdOut) ? "" : stdOut;
Error = string.IsNullOrWhiteSpace(stdErr) ? "" : stdErr;
ExitCode = exitCode;
}
public string Out {
get;
}
public string Error {
get;
}
public int ExitCode {
get;
}
}
Тогда мы можем поставить
public static ExecutionSqlCmdResult ExecuteSqlCmd(string command) {
ProcessStartInfo sqlCmdInfo = new ProcessStartInfo() {
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
RedirectStandardError = true,
RedirectStandardOutput = true,
Arguments = command,
FileName = "sqlcmd",
StandardErrorEncoding = Encoding.UTF8,
StandardOutputEncoding = Encoding.UTF8,
};
using (Process sqlCmdProcess = new Process()) {
sqlCmdProcess.StartInfo = sqlCmdInfo;
sqlCmdProcess.Start();
StringBuilder sbOut = new StringBuilder();
StringBuilder sbErr = new StringBuilder();
sqlCmdProcess.OutputDataReceived += (sender, e) => {
if (e.Data != null)
sbOut.Append(e.Data);
};
sqlCmdProcess.ErrorDataReceived += (sender, e) => {
if (e.Data != null)
sbErr.Append(e.Data);
};
sqlCmdProcess.BeginErrorReadLine();
sqlCmdProcess.BeginOutputReadLine();
sqlCmdProcess.WaitForExit();
return new ExecutionSqlCmdResult(sbOut.ToString(), sbErr.ToString(), sqlCmdProcess.ExitCode);
}
}
Использование
var result = ExecuteSqlCmd(@" -S VDSS218 -i D:\Ravi\Blank_Database_Creation_script.sql");
//TODO: inspect result.Out, result.Error and result.ExitCode