2009-08-20 26 views
2

我是一位c#SQL Server開發人員Oracle新手入門編程。下面的代碼用於將cmdText設置爲:「select * from myTable」。我想現在把它放在一個存儲過程中,我需要關於如何編寫這個Oracle存儲過程的幫助,並在我的c#代碼中得到結果到一個DataTable中。謝謝。代碼:c#從Oracle商店程序返回結果集並填充一個DataTable

private DbProviderFactory DbFactory 
    { 
     get 
     { 
      dbProviderFactory = dbProviderFactory ?? DbProviderFactories.GetFactory(providerInvariantName); 
      return dbProviderFactory; 
     } 
    } 

public DataTable ExecDataTable(string cmdText, params IDataParameter[] cmdParams) 
    { 
     DataTable resultDT = new DataTable(); 

     using (DbConnection dbConn = DbFactory.CreateConnection()) 
     { 
      dbConn.ConnectionString = connectionString; 
      using (DbCommand dbCmd = DbFactory.CreateCommand()) 
      { 
       dbCmd.CommandText = cmdText; 
       dbCmd.Connection = dbConn; 

       try 
       { 
        dbConn.Open(); 

        if (cmdParams != null) 
        { 
         dbCmd.Parameters.AddRange(cmdParams); 
        } 

        using (DbDataAdapter dbDA = DbFactory.CreateDataAdapter()) 
        { 
         dbDA.SelectCommand = dbCmd; 
         dbDA.Fill(resultDT); 
        } 
       } 
       finally 
       { 
        dbConn.Close(); 
       } 
      } 
     } 
     return resultDT; 
    } 

注意:connectionString,providerInvariantName先前在代碼中設置。

另外重構我的代碼的任何意見表示讚賞這是我採取的方法來支持ODP.net和ODBC連接到現場需要的Oracle。

更新

我能得到這個工作使用:

new Oracle.DataAccess.Client.OracleParameter("result", Oracle.DataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output); 

不過,我似乎無法得到一個通用的解決方案使用的DbParameter或的IDataParameter上班我怎麼做到支持ODBC和ODP.net

回答

1

您是否真的需要支持ODBC。否則只使用ODP.Net,它已經優化了對Oracle的訪問。從Oracle獲取數據的最有效方式是使用引用遊標,您應該學會使用它。

create or replace 
PROCEDURE SP_GET_TBL (o_rc OUT sys_refcursor) AS 
    open o_rc for 
     select Col1, Col2, Col3 from Tbl;  
END SP_GET_TBL; 
+0

謝謝,我如何在C#中使用它?並填寫DataTable? – m3ntat 2009-08-20 12:32:16

1

設置CommandType屬性,

dbCmd.CommandType=StoredProcedure; 

Fill方法打開和關閉數據庫連接隱含所以無需打開&關閉數據庫連接。

使用cmd.Parameter.AddWithValue()方法來推送參數和值。

+0

右鍵以及如何糾正Oracle存儲過程以返回結果集。 – m3ntat 2009-08-20 10:32:32