2011-05-27 33 views
4

我在SOF上發現了一些關於如何針對Oracle運行多個查詢(BEGIN END塊,匿名存儲過程)的問題/答案。我想要做的是幾乎相同的,但我想這些查詢,以填補多個數據表中的「一氣呵成」:用1 OracleCommand填充多個數據表

所以不是我們平常:每個數據表一個查詢像 (這是「僞碼」,而不是一個工作例子!)

Odp.Fill(SomeQuery, SomeDataTable, SomeParameters); 

我想一起做的

Odp.Fill(
    new Query(SomeQuery, SomeDataTable, SomeParameters), 
    new Query(SomeQuery2, SomeDataTable2, SomeParameters), 
    ...) 
+0

爲什麼要使用一個單一的呼叫,而不是幾個那些?是因爲易用性,對性能增益的顯着期望,原子執行,事務處理,錯誤處理等? – Codo 2011-05-27 11:06:58

+0

>「期望(顯着的)性能增益」 這個新的「BulkFill」方法的實現也將是一個很好的添加點(自定義?即新查詢(sql,dt,customErrMsg))錯誤處理,減少數量的DAL代碼,提高填充方法的「可讀性」,... – Laoujin 2011-05-27 11:37:32

回答

7

行這只是許多方面,你可以得到在一個查詢多個表一個東西。

PL/SQL

CREATE OR REPLACE PACKAGE getBldgRoom AS 

/****************************************************************************** 

    NAME:  getBldgRoom 
    PURPOSE: 

    REVISIONS: 
    Ver  Date  Author   Description 
    --------- ---------- --------------- ------------------------------------ 
    1.0  2011-5-27 has986  1. Created this package. 

******************************************************************************/ 

PROCEDURE getBldgRoom(rcBuildingData OUT SYS_REFCURSOR, rcRoomData OUT SYS_REFCURSOR); 


END getBldgRoom; 

/

CREATE OR REPLACE PACKAGE BODY GETBLDGROOM AS 
PROCEDURE getBldgRoom(rcBuildingData OUT SYS_REFCURSOR, rcRoomData OUT SYS_REFCURSOR) IS 
    BEGIN 
     OPEN rcBuildingData FOR 
       select bldg_code, bldg_desc from IH_CSI_OWNER.BUILDING; 

     OPEN rcRoomData FOR 
       select bldg_code, room_code, room_desc from IH_CSI_OWNER.ROOM; 
    END getBldgRoom; 

END GETBLDGROOM; 

/

C#代碼

using System; 
using System.Data; 
using Oracle.DataAccess.Client; //Needs Oracle Data Access Client (ODAC) 

namespace ClassLibrary 
{ 
    public class TwoTableDataSet 
    { 
     public DataSet getTwoTables() 
     { 
      OracleConnection conn = new OracleConnection(); 

      //Normally we get the connection string from the web.config file or the app.config file 
      conn.ConnectionString = "Persist Security Info=False;User Id=*USER_NAME*;Password=*USER_PASSWORD*;Data Source=*DataBaseName*"; 
      DataSet ds = new DataSet(); 

      try 
      { 
       conn.Open(); 

       //------------------------------------------------------------------------------------------------------ 
       //Set up the select command 
       OracleCommand cmd = new OracleCommand(); 
       cmd.BindByName = true; //If you do not bind by name, you must add parameters in the same order as they are listed in the procedure signature. 
       cmd.Connection = conn; 
       cmd.CommandType = CommandType.StoredProcedure; //A procedure in an oracle package 
       cmd.CommandText = "GETBLDGROOM.GetBldgRoom"; //The name of the procedure 

       cmd.Parameters.Add("rcBuildingData", OracleDbType.RefCursor, ParameterDirection.Output); 
       cmd.Parameters.Add("rcRoomData", OracleDbType.RefCursor, ParameterDirection.Output); 

       OracleDataAdapter da = new OracleDataAdapter(); 
       da.SelectCommand = cmd; 

       //------------------------------------------------------------------------------------------------------ 

       //get the data from the two tables in the procedure 
       da.Fill(ds); 
       //ds now contains ds.Tables[0] and ds.Tables[1] 

       //Let's give them names 
       ds.Tables[0].TableName = "BUILDINGS"; 
       ds.Tables[1].TableName = "ROOMS"; 

       //Let's add a relationship between the two tables 
       DataColumn parentColumn = ds.Tables["BUILDINGS"].Columns["BLDG_CODE"]; 
       DataColumn childColumn = ds.Tables["ROOMS"].Columns["BLDG_CODE"]; 
       DataRelation dr = new System.Data.DataRelation("BuildingsRooms", parentColumn, childColumn); 
       ds.Relations.Add(dr); 
      } 
      catch (Exception ex) 
      { 
       //Add a breakpoint here to view the exception 
       //Normally the exception would be written to a log file or EventLog in the case of a Web app 
       //Alternatively, it could be sent to a WebService which logs errors and then it could work for both Web or Windows apps 
       Exception lex = ex; 
      } 
      finally 
      { 
       if (conn.State == ConnectionState.Open) 
       { 
        conn.Close(); 
       } 
      } 

      return ds; 
     } 
    } 
} 

希望這有助於

哈維Sather

+0

完美。這正是我需要解決我的問題。 – Holt 2015-11-05 18:07:31

+0

真的很感謝先生!你的建議幫了我很多! – 2016-03-21 06:01:47