用.NET呼叫oracle的儲存過程返回記錄集 (轉)

worldblog發表於2007-08-17
用.NET呼叫oracle的儲存過程返回記錄集 (轉)[@more@]

文章出處:偉網動力()
有何見解,可以來此論壇 
轉貼請標明出處,謝謝。
最近做一個專案,為了提高性,客戶要求所有資料庫操作都要放在過程。象一般的操作,返回一個值的,都比較容易實現。而要想返回記錄集就比較麻煩,我在網上搜了一下,這方面的文章並不多。在此總結一下,供大家參考。
有關如何訪問資料庫,在此就不介紹了。相關的資料也很多,有興趣的朋友可以看下文。
使用.NET訪問Oracle資料庫的方法

oracle的儲存過程返回記錄集,關鍵之處是要用遊標。
關於資料庫的遊標(cursor)大家肯定都接觸不少,我們可以透過OPEN,FETCH,CLOSE操作控制遊標進行各種方便的操作,這方面的例子我就不在重複了。我們現在要介紹的是遊標變數(cursor variable)。類似遊標,遊標變數也是指向一個查詢結果集的當前行。不同的是,遊標變數能為任何型別相似(type-compatible)的查詢開啟,而並不是繫結到某一個特定的查詢。透過遊標變數,你可以在資料庫的資料提取中獲得更多的方便。

首先是建立表。

CREATE TABLE LIHUAN.BILL_POINTS
(
  POINTS_ID  NUMBER(10,0) NOT NULL,
  CUSTOMER_ID  NUMBER(10,0) NOT NULL,
  BILL_POINT_NO  NUMBER(2,0) DEFAULT 1 NOT NULL,
  CONSTRAINT PK_BILL_POINTS PRIMARY KEY (POINTS_ID)
)
/

其次,建PACKAGE
CREATE OR REPLACE PACKAGE LIHUAN.YY_PKG_BILL_POINT_NO/*取得的所有計費電序號*/
IS
TYPE T_CURSOR IS REF CURSOR;

  PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
  Re_CURSOR OUT T_CURSOR);
END;
/

再次,建PACKAGE BODY
CREATE OR REPLACE PACKAGE BODY LIHUAN.YY_PKG_BILL_POINT_NO/*取得使用者的所有計費電序號*/
IS

 PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
  Re_CURSOR OUT T_CURSOR)
  IS
  V_CURSOR T_CURSOR;
  BEGIN
  OPEN V_CURSOR FOR
  Bill_Point_No from BILL_POINTS where CUSTOMER_ID =P_CUSTOMER_ID;
  Re_CURSOR := V_CURSOR;
  END;
END;
/

最後,在.NET中。
public DataSet Bill_Point_No(string CUSTOMER_ID)//ok
 {
 DataSet dataset = new DataSet();
 Hashtable HT=new Hashtable();
 HT.Add("P_CUSTOMER_ID",CUSTOMER_ID);
 if(RunProcedure("Re_CURSOR",OracleType.Cursor,ref dataset,HT,bmsOracleUser+".YY_PKG_BILL_POINT_NO.BILL_POINT_NO",bmsOracleConnectionString))
 {
 ;
 }
 else
 {
 dataset=null;
 }
 return dataset;
 }

public bool RunProcedure(string ReturnParameter,OracleType ParamType,ref DataSet Dataset,Hashtable HT ,string ProcedureName,string OracleConnection)
 { 
 System.Data.OracleClient.OracleConnection dnnection = new System.Data.OracleClient.OracleConnection(OracleConnection);
 System.Data.OracleClient.OracleCommand dacommand = new System.Data.OracleClient.OracleCommand(ProcedureName,dsconnection);
 dsconnection.Open(); 
 dacommand.CommandType=CommandType.StoredProcedure;
 IDictionaryEnumerator Enumerator;
 Enumerator = HT.GetEnumerator();
  Value=null;
 OracleParameter OracleParam;
 OracleParam = dacommand.Parameters.Add(new OracleParameter(ReturnParameter,ParamType));
 OracleParam.Direction = ParameterDirection.Output;
 while(Enumerator.MoveNext())
 {
 Value = Enumerator.Value;
 OracleParam=dacommand.Parameters.Add(new OracleParameter(Enumerator.Key.ToString(), Value));
 }
 OracleDataAdapter ODAdapter=new OracleDataAdapter(dacommand);
   try
 {
 ODAdapter.Fill(Dataset);
 return true;
 }
 catch(System.Exception e)
 {
 e.ToString();
 return false;
 }
 finally
 { 
 HT.Clear();
 dacommand.Parameters.Clear();
 dsconnection.Close();
 }
 }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963030/,如需轉載,請註明出處,否則將追究法律責任。

相關文章