从C#中的SQLPlus的进程输出读取数据/之后退出



我刚要求输入,现在我必须要求输出。这已经奏效了,但显然我改变了一些重要的事情。

我想阅读SqlPlus进程的输出。阅读本身是有效的,但随后它退出了进一步的执行。我正在使用DI,但它也不能在一个类中工作。

程序.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);
}

因此,当我运行这个程序时,它会正确地创建View并进入Output循环。然而,在我得到";输出:已创建视图&";,它将花费~1s,然后我将得到消息";线程xxxxx已退出,代码为"0";我不确定这个退出是关于进程还是ShellExecute,但我不再退出While循环,调试器也不再显示跳到下一行的按钮。网站也没有更新。

我在这里忽略了什么?它已经起作用了。。。

为了读取输出,您需要附加到像这样的事件

_process.OutputDataReceived += new DataReceivedEventHandler(DataReceived);

使用类似的方法

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

然后也添加这个

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

然后你可以打电话给

var output = exec.Output.ToString();

最新更新