2010-05-19 89 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#的實施,也是我的DB是Oracle
我不想關閉每次連接sqlplus都需要一段時間才能重新登錄。

回答

0

你的方法在我看來並不適用於這個例子。您寫道:

輸入用戶名(在這裏我們必須輸入用戶名)XXXX
輸入密碼:(同達)YYYYY

所以看起來好像沒有換行符參與。由於您連接到StandardOutput,即緩衝它將只在刷新行符號時纔會刷新,或者直接調用flush()。這可能不是這種情況(應該發生在sqlplus)。

所以只要你不能更改sqlplus並在那裏插入一個刷新或換行符,同步讀取根本不會幫你。試圖交流異步,如:

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

但是,這是一個更爲複雜的方法...

+0

此外,我們可以獲取用戶,並通過像XXXX/YYYYY到sqlplus中。 在這種情況下,你的想法是什麼? – Amir 2010-05-19 09:38:38

+0

發送不是問題,您將在用戶名/密碼後發送換行符。但接受是你的問題。恕我直言,你必須用異步解決方案去找出問題的輸入以及你得到的答案 – tanascius 2010-05-19 10:01:40