【问题标题】:how retrieve the completely result from shell in Asynchronism process?如何在异步过程中从 shell 中检索完整的结果?
【发布时间】:2010-05-20 04:15:52
【问题描述】:

参考这些帖子:here1here2 最后我通过构建一个异步解决方案解决了我的问题,而且效果很好!!!但是我遇到了一个问题,现在我的代码是这样的:

class MyProcessStarter
    {
        private Process process;
        private StreamWriter myStreamWriter;
        private static StringBuilder shellOutput = null;
        public String GetShellOutput { get { return shellOutput.ToString(); }}

        public MyProcessStarter(){
            shellOutput = new StringBuilder("");
            process = new Process();            
            process.StartInfo.FileName = "sqlplus";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.OutputDataReceived += new DataReceivedEventHandler(ShellOutputHandler);

            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardOutput = true;
            //process.StartInfo.RedirectStandardError = true;
            process.Start();
            myStreamWriter = process.StandardInput;
            process.BeginOutputReadLine();
        }

        private static void ShellOutputHandler(object sendingProcess,DataReceivedEventArgs outLine)
        {
            if (!String.IsNullOrEmpty(outLine.Data))
                shellOutput.Append(Environment.NewLine + outLine.Data);
        }

        public void closeConnection()
        {
            myStreamWriter.Close();
            process.WaitForExit();
            process.Close(); 
        }

        public void RunCommand(string arguments)
        {
            myStreamWriter.WriteLine(arguments);
            myStreamWriter.Flush();
            process.WaitForExit(100);
            Console.WriteLine(shellOutput);
            Console.WriteLine("============="+Environment.NewLine);
            process.WaitForExit(2000);
            Console.WriteLine(shellOutput);            
        }
    } 

我的输入是这样的:

 myProcesStarter.RunCommand("myusername/mypassword");
 Console.writeline(myProcesStarter.GetShellOutput);

但是看看我的输出:

SQL*Plus: Release 11.1.0.6.0 - Production on Thu May 20 11:57:38 2010
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
=============


SQL*Plus: Release 11.1.0.6.0 - Production on Thu May 20 11:57:38 2010
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Enter user-name: 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

当你看到运行函数的输出在不同的时间是不一样的!所以现在你能帮我一个忙并帮助我,我如何等到其他所有输出完成意味着我可以如何自定义我的流程等到输出完成??因为我想写一个sqlcompiler所以我需要shell的确切输出。

请尽快帮助我。thanxxxxxxxxxxxx :X

【问题讨论】:

    标签: c# plsql io asynchronous


    【解决方案1】:

    您应该在 SQL*Plus 上使用-S 参数。根据帮助,这个参数

    设置静音模式,抑制 显示 SQL*Plus 横幅, 提示和回显命令。

    理想情况下,这将使输出保持一致。

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2015-11-06
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2019-10-11
      • 2012-02-26
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多