как избежать тупиковой ситуации - PullRequest
1 голос
/ 19 мая 2010

Я пытаюсь написать программу наподобие компилятора.В этом случае я должен смоделировать эти коды SQLPL (этот может быть только для примера).Например, в командной строке я хочу сделать это:

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

очень просто.Я пытаюсь использовать этот код:

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 + "\".");
}

Я нахожу его форму здесь , но, как будто вы читаете этот код, есть проблема!DEADLOCK Состояние проблемы!Это мой второй раз, когда я задаю свой вопрос, каждый раз, когда мои знания растут, но я не могу понять, как наконец-то решить свою проблему !!!

Поэтому я любезно целую вашу руку, пожалуйста, помогите мне,этот процесс мне не понятен.Кто-нибудь может дать мне код, который решит мою проблему?Я уже смотрю на все коды, а также пытаюсь использовать ProcessRunner, который в моем последнем посте кто-то мне предлагал, но я тоже не могу его использовать, я получаю сообщение об ошибке.

Надеюсь сначалаНапример, вы узнаете, что я хочу, и решите вторую проблему кода ...
Я использую C # для реализации, также моя БД - Oracle
Я не хочу закрывать sqlplus каждый разподключение, потому что для входа в систему требуется время.

1 Ответ

0 голосов
/ 19 мая 2010

Вы подход не работает для этого примера, по моему мнению. Вы написали:

Введите имя пользователя: (здесь мы должны ввести имя пользователя) xxxx
Введите пароль: (тоже самое) ггггг

Похоже, что символ новой строки не задействован. Поскольку вы подключаетесь к StandardOutput , который является буферизованным , он будет очищен только при появлении символа новой строки или при непосредственном вызове flush () . Вероятно, это не так (должно быть в sqlplus ).

Так что, пока вы не можете изменить sqlplus и вставить туда флеш или символ новой строки, синхронное чтение вам вообще не поможет. Попробуйте общаться асинхронно, например:

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

Но это гораздо более сложный подход ...

...