开发者

how avoids deadlock condition

开发者 https://www.devze.com 2022-12-31 08:14 出处:网络
I try to write a program like a compiler. In this case I must simulate these codes of SQLPL (this one can be just for example). For example in command prompt I want to do these:

I try to write a program like a compiler. In this case I must simulate these codes of SQLPL (this one can be just for example). For example in command prompt I want to do these:

c:\> sqlplus
 ....
Enter User-Name:(here we must enter username) xxxx
Enter password:(same up)yyyyy
...
sql>(now I want to send my sql command to shell)prompt "rima";
"rima"  [<-output]
sql> prompt "xxxx"
sql> exit

very simple. I try to use this code:

ProcessStartInfo psi = new ProcessStartInfo(
@"sqlplus");
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
//psi.RedirectStandardError = true;
Process process = new Process();
process.StartInfo = psi;
bool started = process.Start();
if (started)
{
process.StandardInput.WriteLine("user/password");
process.StandardInput.Flush();
string ret = process.StandardOutput.ReadLine(); // <-- stalls here
System.Console.WriteLine("sqlplus says :" + ret + "\".");
}

I find out it form here but as if you read this code has problem! DEADLOCK Condi开发者_StackOverflow中文版tion problem! This is my second time I ask my question, every time my knowledge growing, but I can't get how I can solve my problem at last!!!

So I kindly kiss your hand, please help me, this process is not clear for me. Any one can give me a code that handle my problem? Already I look at all codes, also I try to use ProcessRunner that in my last post some one offer me, but I can't use it also, I receive an error.

I hope by first example you find out what I want, and solve the second code problem...

I use C# for implementation, also my DB is Oracle

I don't want close sqlplus for each time connecting because it take time to log in again.


You approach is not working for this example in my opinion. You wrote:

Enter User-Name:(here we must enter username) xxxx
Enter password:(same up)yyyyy

So it looks as if there is no newline involved. Since you are connecting to StandardOutput, which is buffered it will get only flushed when a newline character appears or a flush() is called directly. This is probably not the case (should be happen in sqlplus).

So as long as you can not change sqlplus and insert a flush or newline there, a synchronous read will not help you at all. Try to communicate asynchronous, like:

process.OutputDataReceived += OnOutputDataReceived;
process.Start();
process.BeginOutputReadLine();
// ... more missing code here ...

But this is a far more complex approach ...

0

精彩评论

暂无评论...
验证码 换一张
取 消