C#呼叫Oracle儲存過程

qingyun1029發表於2011-08-12

Oracle分頁儲存過程如下:

--注意,在Oracle,儲存過程需要放在包下面
create or replace package PKG_split_Page is
TYPE p_cur1 IS REF CURSOR;
PROCEDURE proc_split_page
(
  rowcountPerPage NUMBER,  --每頁面記錄條數
  indexNowPage NUMBER,       --當前頁碼
  tabName VARCHAR2,             --分頁表名
  totalRows OUT NUMBER,        --總記錄數
  totalPages OUT NUMBER,        --總頁數
  p_cursor OUT PKG_split_Page.p_cur1     --遊標,用於返回結果集

);
end PKG_split_Page;

C#呼叫儲存過程程式碼如下:

#region 分頁程式碼(返回資料表、總條數、總頁數等)
/// <summary>
/// 執行分頁 
/// </summary>
/// <param name="tableName">需分頁表名(select查詢語句)</param>
/// <param name="paeSize">每頁記錄數</param>
/// <param name="indexNowPage">當前頁碼</param>
/// <param name="totalRows">引用引數,總記錄數</param>
/// <param name="totalPages">引用引數,總頁數</param>
/// <returns>分頁結果集</returns>
public DataTable Paging(string tableName, int paeSize, int indexNowPage, ref int totalRows, ref int totalPages)
{
    try
    {
        //開啟連線
        OpenOracleConnection();
        //定義OracleCommand物件,設定命令型別為儲存過程
        OracleCommand pOracleCMD = new OracleCommand("pkg_split_page.proc_split_page", conn);//Oracle裡面的(包.儲存過程)
        pOracleCMD.CommandType = CommandType.StoredProcedure;//設定執行型別為儲存過程
        
        //根據儲存過程的引數個數及型別生成引數物件
        OracleParameter p1 = new OracleParameter("rowCountPerPage", OracleType.Number);//rowcountPerPage——每頁顯示的條數
        OracleParameter p2 = new OracleParameter("indexNowPage", OracleType.Number);//indexNowPage——當前頁碼
        OracleParameter p3 = new OracleParameter("tabName", OracleType.VarChar);//tabName——表名
        OracleParameter p4 = new OracleParameter("totalRows", OracleType.Number);//totalRows——總記錄數(output)
        OracleParameter p5 = new OracleParameter("totalPages", OracleType.Int16);//totalPages——總頁數(output)
        OracleParameter p6 = new OracleParameter("p_cursor", OracleType.Cursor);

        //設定引數的輸入輸出型別,預設為輸入
        p1.Direction = ParameterDirection.Input;
        p2.Direction = ParameterDirection.Input;
        p3.Direction = ParameterDirection.Input;
        p4.Direction = ParameterDirection.Output;
        p5.Direction = ParameterDirection.Output;
        p6.Direction = ParameterDirection.Output;

        //對輸入引數定義初值,輸出引數不必賦值.
        p1.Value = paeSize;
        p2.Value = indexNowPage;
        p3.Value = tableName;

        //按照儲存過程引數順序把引數依次加入到OracleCommand物件引數集合中
        pOracleCMD.Parameters.Add(p1);
        pOracleCMD.Parameters.Add(p2);
        pOracleCMD.Parameters.Add(p3);
        pOracleCMD.Parameters.Add(p4);
        pOracleCMD.Parameters.Add(p5);
        pOracleCMD.Parameters.Add(p6);

        //執行,把分頁結果集填入datatable中
        OracleDataAdapter pOracleDataAdapter = new OracleDataAdapter(pOracleCMD);
        DataTable datatable = new DataTable();
        pOracleDataAdapter.Fill(datatable);

        //在執行結束後,從儲存過程輸出引數中取得相應的值放入引用引數中以供程式呼叫
        totalRows = int.Parse(p4.Value.ToString());
        totalPages = int.Parse(p5.Value.ToString());

        //關閉連線
        CloseOracleConnection();

        return datatable;
    }
    catch (Exception ex)
    {
        string error = ex.ToString();
        return null;
    }

}
#endregion    

#region 開啟連線
/// <summary>
/// 關閉連線
/// </summary>
private void CloseOracleConnection()
{
    if (conn.State == ConnectionState.Open)
    {
        conn.Close();
    }
}
#endregion

#region 關閉連線
/// <summary>
/// 開啟連線
/// </summary>
private void OpenOracleConnection()
{
    if (conn.State == ConnectionState.Closed)
    {
        conn.Open();
    }
}
#endregion 


相關文章