Как получить ошибку от "SQLCMD" через c #? - PullRequest
0 голосов
/ 02 ноября 2018

Запуск SqlCmd утилита, использующая C # таким образом:

// Calls the sqlcmd                
ProcessStartInfo info = new ProcessStartInfo(
  "sqlcmd", 
 @" -S VDSS218 -i D:\Ravi\Blank_Database_Creation_script.sql");

info.UseShellExecute = false;
info.CreateNoWindow = true;
info.WindowStyle = ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;

Process proc = new Process();

proc.StartInfo = info;
proc.Start();

Теперь, если в скрипте произошла какая-либо ошибка при запуске из C #, как можно получить это исключение SQL в C #.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Сначала давайте объявим класс для результата выполнения :

  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
0 голосов
/ 02 ноября 2018

Слушайте событие: ErrorDataReceived

proc.ErrorDataReceived += new DataReceivedEventHandler(method);

См. Полный пример на MSDN:

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.errordatareceived?view=netframework-4.7.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...