看了一下記錄,第一次看Oracle的教程是16年6月10號,一年零一個多月了,才累計了30天的學習。。。ide
通過幾天的折騰,終於能在C#裏像調用SQL Server同樣自如地調用Oracle的存儲過程和語句了,雖然有些曲折,但好歹能實現函數
1、C#調用Oracle學習
要引用Oracle.ManagedDataAccess.dll,一個就夠了,鏈接串以下,要注意是【providerName="Oracle.ManagedDataAccess.Client"】,網上有時說是【providerName="Oracle.ManagedDataAccess"】,折騰了半天測試
<add name="XX" providerName="Oracle.ManagedDataAccess.Client" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.XX)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User ID=XX;Password=XX;" />
2、DataReaderspa
原先代碼裏處理SQL Server都有一整套的DataReader處理方法,也提供了Oracle的,把SqlXXX的全改成OracleXXX的就能夠了code
3、直接執行Oracle語句orm
和SQL相似,但要注意"SELECT * FROM XX"的Oracle語句裏末尾不能帶分號。blog
封裝好的ExecuteNoQuery、ExecuteScalar、ExecuteReader 用法都徹底同樣教程
4、參數化調用存儲過程字符串
若是須要存儲過程輸出,則要在參數類裏定義一個可取出的遊標
sCUR = new OracleParameter("@sCUR", OracleDbType.RefCursor, ParameterDirection.Output);
Oracle存儲過程不支持直接輸出SELECT * XX 這樣的結果集了,只能用遊標OPEN CURSOR FOR SELECT * FROM XX,這是特別煩的一點
5、調用函數
基本相似,函數倒能夠直接返回內容,通常也都是字符串
6、直接用語句(字符串)調用存儲過程
這個稍微折騰了一下,想要像SQL那樣直接"EXEC XXX('xx')"這麼爽是不行的,本來都快放棄了,但最終想到一個變通的方法
一、定義一箇中轉存儲過程,用於接收字符串語句,第一個參數用於內部一些區分(這裏暫沒用到),第二個參數是要執行的字符串,第三個參數是要帶出數據的遊標
CREATE OR REPLACE PROCEDURE upCurrentQuery ( sAction VARCHAR2, sSQLText VARCHAR2, sCUR OUT SYS_REFCURSOR ) AS sSQL CLOB; BEGIN EXECUTE IMMEDIATE sSQLText USING sCUR; END upCurrentQuery;
二、因爲存儲過程調用要有BEGIN END,乾脆封裝在參數類裏,免得每次都要傳
UpCurrentQueryParam param = new UpCurrentQueryParam { sAction = { Value = model.sAction }, sSQLText = { Value = string.Format(@" BEGIN {0} END;", model.sSQLText) } };
三、調用存儲過程時不要加EXEC或CALL,直接寫存儲過程名,要注意最後要帶上:XX的遊標(與存儲過程裏的名字要一致),這樣經過中轉存儲過程的USING XX就能夠帶出結果集了
UpCurrentQueryModel ucqModel = new UpCurrentQueryModel { sAction = "", sSQLText = @"XXX('XX', '', :sCUR);" };
7、Linq
以前有一篇隨筆研究過了,必定表、字段定義注意下便可,Linq查詢自己不用動
8、分頁
暫時沒去研究了,既然存儲過程能調用,應該也是傳些參數進行分頁便可。但剛上手時也會有坑就是了
Oracle的研究暫告一段落吧,恰好滿30天,下一階段打算引進一個新的UI到項目(測試)中進行練習