Read Data from Process Output from SQLPlus in C# / Exits afterwards

Viewed 24

I just asked for the Input and now I have to ask for the Output. This already worked, but apparently I changed something important.

I want to read the Output of an SqlPlus Process. The reading itself works, but then it exits further Execution. I am using DI, but it doesn´t work within a single class either.

Program.cs:

builder.Services.AddScoped<IExecuter,ShellExecuter>();

ShellExecuter.cs:

 private List<string> _commands = new List<string>();
   private Process _process;
    private ProcessStartInfo _startInfo;
   


public ShellExecuter(){
           _startInfo = new ProcessStartInfo();
            _startInfo.WorkingDirectory = Path.GetTempPath();
            _startInfo.FileName = "sqlplus.exe";
            _startInfo.UseShellExecute = false;
            _startInfo.RedirectStandardOutput = true;
            _startInfo.RedirectStandardError = true;
            _startInfo.RedirectStandardInput = true;
            _startInfo.CreateNoWindow = true;
            _process = new Process();
        }


 public void Start()
                {
                    _startInfo.Arguments = $"-s user/pass@db";
                    _process.StartInfo = _startInfo;    
                   // _process.EnableRaisingEvents = true;
                    _process.Start();
         _process.ErrorDataReceived += (sender, args) =>
        {
            System.Diagnostics.Debug.WriteLine("Error:  " + args.Data);
        };           
        process.Exited += new System.EventHandler(Exited);

            }

 ...Methods to add to _commands and Write them.

 public string Output()
        {         
            string line = "";
            while (!_process.StandardOutput.EndOfStream)
            {
                line += _process.StandardOutput.ReadLine();
                System.Diagnostics.Debug.WriteLine("Output: " + line);
            }
      }

HomeController.cs:

 public IActionResult Index(IExecuter exec)
        {
            exec.Start();    
            exec.AddCommand(" create or replace view testview(ID) as select ID from 
     MyUSER;");   
            exec.Execute();  
            var output = exec.Output();

            return Content(output);
        }

So, when I run this it properly creates the View and goes into the Output loop. However, after I get the "Output: View created.", it will take ~1s and then I will get the message "The Thread xxxxx has exited with Code 0" I am not sure if this exit is about the Process or the ShellExecuter, but I don´t get out of the While Loop anymore and the Debugger does not show the Buttons to jump to the next Line anymore. Nor does the Website update.

What do I overlook here? It already worked...

1 Answers

In order to read the output you need to attach to the event like this

_process.OutputDataReceived += new DataReceivedEventHandler(DataReceived);

with a method like this

public StringBuilder Output = new StringBuilder();
void DataReceived(object sender, DataReceivedEventArgs e)
{
    Output.AppendLine(e.Data);
}

then also add this

_process.Start();
_process.WaitForExit(); //very important!

then you can call

var output = exec.Output.ToString();
Related