2015年9月19日 星期六

C#筆記:連結Oracle Stored Procedure


最近需要連結Oracle的Stored Procedure,遇到了一點問題。
在此記錄~

1. ORA-06550 Stored Procedure Error

它跟我說這個Stored Procedure Name不是個Procedure 或沒有定義。

但去翻資料庫明明就有,莫非是當時鬼門未關?

嚐試了各種換變數皆宣告無效,百思不得其解。

遂參拜Google大神得籤詩一支:籤詩於此

我所連結呼叫的其實不是Stored Procedure,而是一個Function。

雖然Funtion可以用Stored Procedure的方式來呼叫,但是它有一個返回值,而這個返回值需要用一個參數來承接。

詳細程式在文末。


2.ORA-01403 No Data Found Error

在資料庫查有資料,但是程式卻偏偏跑不出來,莫非是當時鬼門未關?

老天保佑,當時我靈光一閃,模糊意識到這個錯誤之前遇過。

仔細對照之後發現,該呼叫的Function一共三個參數,後面兩個參數有預設值可不傳。

為求方便,我便沒傳參數進去,誰料Oracle對參數設定異常嚴格。

若沒有設定cmd.BindByName,就死死的照順序給參數。

參數不對,結果當然出不來,設定之後解決。

P.S 型態錯誤也會造成這個錯誤:參考連結


3.ORA-06502: PL/SQL: Numeric or Value Error: Character String Buffer Too Small

單看字面意思是參數容量太小,不過我也懷疑是型態錯誤,但也有可能是當時鬼門未關?

懶得一一嚐試,於是再度參拜Google大神,再得籤詩一隻:籤詩於此

設定返回值size之後,成功解決。

順道記錄一下,返回值是一個DataTable的話,在C#要怎麼接?
var myReader = ((OracleRefCursor)myOracleCmd.Parameters["o_result_cur"].Value).GetDataReader();
dtCompany.Load(myReader);


4. ORA-00911: Invalid Character
執行的時候報了一個錯誤,但是該SQL拿到SQL Developer裡又可以跑。

單看字面訊息,可能的錯誤多到枚不勝數。

這不用說一定是當時鬼門未關的關係!

參拜之後發現原來是「;」的問題。奇也怪哉,C#的SQL語句竟然不能加分號。

刪掉分號之後順利解決,可喜可賀。

----------------------------------------------

今日Google大神又再度拯救了世界,阿彌陀佛~

0 comments:

張貼留言