前一陣子做一個項目,就是把以前SqlServer的數據庫移植到Oracle中,要求是在原有代碼的基礎上修改,使應用程序可以同時運行在兩種不同的數據庫上。這是我第一次接觸用C#操作Oracle。走了不少彎路,現在把它記下來,也希望可以別人少走一些彎路。
1. Oracle中表名,字段名,存儲過程名,變量名不能超過30個字符串長度。
2. Oracle中不支持Top 語法。使用where rownum < n 代替。但需要注意如果在Top前有排序的操作,則需要先排序在利用rownum取得。
3. Oracle中光標的使用與SqlServer中有挺大差別,主要是在循環控制方面不一致。
4. 在Oracle中如果某列是Date類型,那麼它默認的格式是yyyy-MM-dd,如果使用
where colDate = ‘2005-06-08 17:14:57’就會出錯,‘2005-06-08’可以。如果此時需要精確比較時間(小時,分,秒),可以採用下列方法:TO_DATE('2005-6-8 17:14:57','yyyy-mm-dd hh24:mi:ss')。由於Oracle和SQLServer在DateTime上對SQL標準的拓展實現方式不同,因此不能用同一個
SQL實現。
5. Oracle中的TimeStamp(時間戳)與SqlServer中的差別很大。SqlServer中的TimeStamp是二進制格式存儲在數據庫中,可以將DataSet中的這個字段類型設定為base64Binary類型。Oracle中的TimeStamp是時間格式存儲的。因此,無法用同一個DataSet既裝載SqlServer的TimeStamp,有裝載Oracle的TimeStamp.由於在應用程序中很少用到這個值,因此可以不檢索這個字段。
6. Oracle中的TimeStamp不能像SqlServer在傳入數據的時候自動填充,可以設定默認值systimestamp來實現類似功能。
7. Oracle中沒有Boolean的字段類型,可以用intger或者char代替SqlServer中的bit類型。
8. Oracle中會將””空字符串當多NULL處理,也就是説,當應用程序往數據庫中插入一個空字符串時,實際數據庫會嘗試插入一個NULL。如果這個字段是NOTNULL類型,那麼就會出錯,這種情況下可以用別的默認值代替空字符串。當從SqlServer導入數據到Oracle的時候,在NOTNULL列上的空字符串會導致導出操作失敗。此時可以在導出嚮導中手工修改SQL腳本,將空字符串設定成一個特殊值。
9. 在利用OLEDBCommand調用Oracle存儲過程的時候應注意,應用程序傳入參數與存儲過程中的參數是按照順序匹配而不是名稱,這一點是和SqlServer有着本質的不同。在調試的時候如果遇到E_Fail等錯誤,可以參考下列順序檢查程序。
(1)檢查應用程序傳入參數個數與存儲過程的參數個數是否一致。
(2) 檢查應用程序傳入參數的順序是否與存儲過程參數的順序一致,這一點很重要,如果不匹配很容易導致各種看似奇怪的問題。建議對相對簡單的存儲過程(單表的增刪改)寫一個自動生成工具來完成此操作。
(3) 檢查存儲過程是否正確。
10. 使用OleDbDataReader對象需要特別注意。在SqlServer中我們可以在存儲過程中利用一句Select語句返回一個DataReader,但是在Oracle中不能這樣做,必須用Oracle REF CURSOR 返回查詢結果。但此時需要使用OracleCommand.ExecuteReader() 方法,而不能使用OLEDBCommand對象。因此,如果想在Oracle中使用DataReader,必須使用微軟提供的For Oracle Data Provide類包。這個Framework1.0中默認不存在,需要下載,在Framework11.1中默認存在。具體方法參考: