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;