2010-05-19 3 views
1

Я пытаюсь написать программу как компилятор. В этом случае я должен имитировать эти коды 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 + "\"."); 
} 

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

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

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

ответ

0

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

Введите User-Name: (здесь мы должны ввести имя пользователя) хххх
Введите пароль (тот же вверх) ыыыыы

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

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

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

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

+0

Также мы можем заставить пользователя и передать как хххх/YYYYY к SQLPLUS. В этом случае, что такое идея ура? – Amir

+0

Отправка не является проблемой, вы отправите новую строку после имени пользователя/пароля. Но получение - это ваша проблема. imho вы должны пойти с асинхронным решением, чтобы узнать, какой запрос был задан, и какие ответы вы получили – tanascius

Смежные вопросы