2010-05-17 99 views
3

嗨根据我的最后一个问题here我尝试编写一个sql编辑器或类似的东西,这样我尝试从C#连接到CMD并执行我的命令。 现在我的问题是我连接到SQLPLUS后,我不能得到SQLPLUS命令,我审查的其他资源不满足我。请问我连接到sqlplus后如何实现我的进程来运行我的sql命令?现在我用这个代码:使用C#执行多个命令行使用相同的进程

//Create process 
System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); 

//strCommand is path and file name of command to run 
pProcess.StartInfo.FileName = strCommand; 

//strCommandParameters are parameters to pass to program 
pProcess.StartInfo.Arguments = strCommandParameters; 

pProcess.StartInfo.UseShellExecute = false; 

//Set output of program to be written to process output stream 
pProcess.StartInfo.RedirectStandardOutput = true; 

//Optional 
pProcess.StartInfo.WorkingDirectory = strWorkingDirectory; 

//Start the process 
pProcess.Start(); 

//Get program output 
string strOutput = pProcess.StandardOutput.ReadToEnd(); 

//Wait for process to finish 
pProcess.WaitForExit(); 

我定制了它。我单独初始化,我创建的进程对象有一次我仍然有问题,跑我使用这些代码对第二个呼叫第二个命令:

pProcess.StartInfo.FileName = strCommand; 

//strCommandParameters are parameters to pass to program 
pProcess.StartInfo.Arguments = strCommandParameters; 
//Start the process 
pProcess.Start(); 

//Get program output 
string strOutput = pProcess.StandardOutput.ReadToEnd(); 

//Wait for process to finish 
pProcess.WaitForExit(); 

在此先感谢

+4

FWIW,这些评论只是噪音... – 2010-05-17 18:07:34

+0

你的意思是你想开始一次的过程,但发送多个命令吗?如果是这样,为什么不发送多个命令从头开始整个过程​​从头开始每次(双关语不打算,但无论如何有趣) – 2010-05-17 19:17:44

+0

正好... 我只是运行一次sqlplus 后,我给用户/通行证,如果它登录发送Sql.PL命令。 我马有点困惑:( actully每次我尝试连接数据库并运行我的命令需要时间...但我没有任何想法,也许其他软件使用像这样?哈?任何想法? – Amir 2010-05-18 19:37:36

回答

6

你的问题有点令人困惑,但我认为我看到你的问题。首先,你应该看看这篇博文,看看common issues with System.Diagnostics.Process。你的代码碰巧违反了那里没有列出的代码。 Process对象本身的重用。

您需要重构像代码:

class MyProcessStarter 
    { 
     private ProcessStartInfo _startInfo = new ProcessStartInfo(); 
     public MyProcessStarter(string exe, string workingDir) 
     { 
      _startInfo.WorkingDirectory = workingDir; 
      _startInfo.FileName = exe; 
      _startInfo.UseShellExecute = false; 
      _startInfo.RedirectStandardOutput = true; 
     } 

     public string Run(string arguments) 
     { 
      _startInfo.Arguments = arguments; 
      Process p = Process.Start(_startInfo); 
      p.Start(); 
      string strOutput = p.StandardOutput.ReadToEnd(); 
      p.WaitForExit(); 
      return strOutput; 
     } 
    } 

我写了一个更完整,更准确地执行所谓的ProcessRunner。下面演示它用于执行相同的操作:

using CSharpTest.Net.Processes; 
partial class Program 
{ 
    static int Main(string[] args) 
    { 

     ProcessRunner run = new ProcessRunner("svn.exe"); 
     run.OutputReceived += new ProcessOutputEventHandler(run_OutputReceived); 
     return run.Run("update", "C:\\MyProject"); 
    } 

    static void run_OutputReceived(object sender, ProcessOutputEventArgs args) 
    { 
     Console.WriteLine("{0}: {1}", args.Error ? "Error" : "Output", args.Data); 
    } 
} 
+0

谢谢老兄,第一个代码很有用,但我仍然有错误!!! 您知道吗,我的进程是这样​​运行的: 我将它翻译成exec命令: sqlplus user/pass @ db sqlplus prompt“amir”; <== this我只是sqlplus运行一次,之后我只是发送参数并执行它... 和第二个实用程序我得到错误!我收到空异常指针,我也尝试使用它自己的testRunFile,但在那一个也是一样的。我无法找到“断言”类的任何地方??:(( 帮我plzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzz。 – Amir 2010-05-18 19:43:00

1

在发送另一个命令之前,您需要从输入中读取所有数据!

如果没有数据可用,你不能要求阅读...一点点吸不是可行的吗?

我的解决方案......当问到读......请阅读大缓冲......像1个MEGA ...

而且你会需要等待一分钟100毫秒......示例代码。 ..

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim oProcess As New Process() 
     Dim oStartInfo As New ProcessStartInfo("cmd.exe", "") 
     oStartInfo.UseShellExecute = False 
     oStartInfo.RedirectStandardOutput = True 
     oStartInfo.RedirectStandardInput = True 
     oStartInfo.CreateNoWindow = True 
     oProcess.StartInfo = oStartInfo 
     oProcess.Start() 

     oProcess.StandardInput.WriteLine("dir") 


     Threading.Thread.Sleep(100) 

     Dim Response As String = String.Empty 

     Dim BuffSize As Integer = 1024 * 1024 
     Dim bytesRead As Integer = 0 

     Do 

      Dim x As Char() = New Char(BuffSize - 1) {} 
      bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize) 

      Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))    

     Loop While oProcess.StandardOutput.Peek >= 0 



     MsgBox(Response) 
     Response = String.Empty 



     oProcess.StandardInput.WriteLine("dir c:\") 




     Threading.Thread.Sleep(100) 


     bytesRead = 0 

     Do 

      Dim x As Char() = New Char(BuffSize - 1) {} 
      bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize) 

      Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead)) 
      'Response = String.Concat(Response, String.Join("", x)) 

     Loop While oProcess.StandardOutput.Peek >= 0 

     MsgBox(Response) 


    End Sub 
End Class