Oracle學習 第30天 C#調用存儲過程和語句

看了一下記錄,第一次看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到項目(測試)中進行練習

相關文章
相關標籤/搜索