C#執行oracle返回游標類型的存儲過程


C#執行oracle存儲過程,存儲過程代碼為:

create or replace procedure proc_test(pCursor  OUT pak_pub.ut_cursor) AS  
begin  
open pCursor for select * from scott.emp;  
end proc_tes;  

其中pak_pub.ut_cursor的定義為:

create or replace package pak_pub  
as   
type ut_cursor is ref cursor;   
end;  

 兩種方式:1、用微軟自帶的ORACLE數據訪問接口(using System.Data.OracleClient)

                        注意.NET 4.0里已經沒有了System.Data.OracleClient

                  2、使用ODP.NET(引用oracle客戶端里的Oracle.DataAccess.dll)

//存儲過程參數設置  
OracleParameter[] sqlParme = new OracleParameter[1];            
//參數1  
sqlParme[0] = new OracleParameter("pCursor", OracleType.Cursor);  
sqlParme[0].Direction = ParameterDirection.Output;  
  
DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);  

 DBAccess.DBExecStoredProcedure函數實現 

public static DataTable DBExecStoredProcedure(string spName, OracleParameter[] sqlParme)  
       {  
           try  
           {  
               //使用微軟的ORACLE訪問接口  
               OraCmd.CommandText = spName;  
             OraCmd.CommandType = CommandType.StoredProcedure;  
  
               OraCmd.Parameters.Clear();//先清空  
               foreach (OracleParameter parme in sqlParme)  
               {  
                   OraCmd.Parameters.Add(parme);  
               }  
               DataSet ds1;  
               DateTime EndTime;  
               TimeSpan sp;  
               ds1 = new DataSet();  
               DateTime BegTime = System.DateTime.Now;  
               OracleDataAdapter da1 = new OracleDataAdapter(OraCmd);//取出數據  
                 da1.Fill(ds1);  
               EndTime = System.DateTime.Now;  
               string str = "spare time:" + (EndTime - BegTime).ToString();  
               DataTable dt = ds1.Tables[0];  
               //調試  
                 if (dt != null && dt.Rows.Count != 0)  
                   MessageBox.Show("返回記錄數" + dt.Rows.Count.ToString() + "\n" + str);  
               TraceLog.Trace("執行時間", "返回記錄數" + dt.Rows.Count.ToString() + "\n" + str);  
               return dt;  
           }  
           catch (InvalidCastException e)  
           {  
               TraceLog.Trace("錯誤", e.Message + " IOException source:"+e.Source);  
               return null;  
           }  
       }  

第二種方式:

//使用ORACLE客戶端訪問接口  
  OracleParameter[] sqlParme = new OracleParameter[1];            
  //參數1  
  sqlParme[0] = new OracleParameter("pCursor", OracleDbType.RefCursor);  
  sqlParme[0].Direction = ParameterDirection.Output;  
  DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);  

DBAccess.DBExecStoredProcedure函數實現同第一種方式的.

 

數據庫連接(ODP.NET方式)

//DB連接   
 public static bool DBConnect(string puser,string pwd,string ds){  
            try  
            {  
                if (OraConn!= null)//如果連接沒關閉,先關閉  
                    OraConn.Close();  
                    string ConString = "Data Source=" + ds + ";User Id=" + puser + ";Password=" + pwd;  
                    OraConn = new OracleConnection(ConString);  
  
                    OraCmd = new OracleCommand("", OraConn);  
                    OraConn.Open();  
                    return true;  
  
            }  
            catch{  
                return false;  
            }  
}  

是用.net自帶的訪問接口連接方法稍有不同:

(連接字串應該這樣寫)

string ConString = "Data Source=TEST;user=TEST001;password=123456";

 

感覺上其實區別不大,只是如果要用到PL/SQL的數組變量的時候,第二種方式的特點就突顯出來了,(而且微軟已經聲明.NET 4.0后不在包含oracle的訪問接口,所以很多開發者都開始轉向使用oracle公司提供的訪問接口)

oracle客戶端的數據訪問接口支持Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray,數組變量,而且支持長度限制,由於我演示的沒有傳入參數,這里就簡單說一下,有傳入參數的時候,這樣

sqlParme[0] = new OracleParameter("param1", OracleDbType.Varchar2,1000);//可限制傳入參數長度  
sqlParme[0].Direction = ParameterDirection.Input;  
string s = "傳入參數";  
sqlParme[0].Value = s;  

如果傳入參數是PL/SQL的數組類型那就這樣傳

sqlParme[0] = new OracleParameter("pDimensionFields", OracleDbType.Varchar2,1000);  
sqlParme[0].Direction = ParameterDirection.Input;  
sqlParme[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray  
string[] s =new string[]{ "1","2","3"};  
sqlParme[0].Value = s;  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM