.net – 使用1个OracleCommand填充多个DataTable
发布时间:2021-01-24 16:46:34 所属栏目:站长百科 来源:网络整理
导读:我在SOF上发现了一些关于如何针对Oracle运行多个查询的问题/答案(BEGIN END块,匿名存储过程).我想做的几乎相同,但我希望这些查询能够“一次性”填充多个DataTable: 所以不是我们平常的:每个DataTable一个查询就像 (这是’伪代码’,不是一个有效的例子!) O
我在SOF上发现了一些关于如何针对Oracle运行多个查询的问题/答案(BEGIN END块,匿名存储过程).我想做的几乎相同,但我希望这些查询能够“一次性”填充多个DataTable: 所以不是我们平常的:每个DataTable一个查询就像 Odp.Fill(SomeQuery,SomeDataTable,SomeParameters); 我想做点什么 Odp.Fill( new Query(SomeQuery,SomeParameters),new Query(SomeQuery2,SomeDataTable2,...) 解决方法这只是您可以在一个查询中获取多个表的众多方法之一.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",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; } } } 希望这可以帮助 哈维萨瑟 (编辑:东营站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |