前用企业库读SQL Server返回数据集没任何问题,可以返回1个也可以返回多个,读Oracle的时候返回一个数据集的时候也没问题,可是最近在用Oracle返回多个数据集的时候却出了问题,几经辗转,终于找到了解决方案,记下来!一定要记下来!千万不可忘记!!!!!!!
以下代码在vss2005+oracle10g下测试通过。要使用企业库,肯定先引用喽:
cs文件添加三个引用:
Code
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.ObjectBuilder;
1)返回一个结果集的方法:
Oracle存储过程:
PL/SQL
create or replace procedure P_Sel_TopCount(in_top in number,
out_count out number,
cur_out out sys_refcursor) is
--查询指定记录条数的数据,并返回总共记录数
begin
SELECT COUNT(*) into out_count FROM userinfo;
open cur_out for
SELECT * FROM userinfo where id < in_top;
end P_Sel_TopCount;
注意:过程中的游标cur_out,传说是企业库在调用Oracle的时候返回一个结果集的时候就认识这一个名字cur_out,如果改成别的就不行了(我试过,改成别的名后确实出错,企业库就不认识了),具体为什么,我也不知道了。
c#的调用:
//创建数据库对象
Database db = DatabaseFactory.CreateDatabase("Oracle");
//构造cmd
DbCommand dbcmd = db.GetStoredProcCommand("P_Sel_TopCount");
//添加参数,并且不用设置过程中的游标参数,企业库会去自动找那个名为”cur_out“的游标,并且只认识那一个名为”cur_out“的游标参数
db.AddInParameter(dbcmd, "in_top", DbType.Int32, 10); //输入参数
db.AddOutParameter(dbcmd, "out_count", DbType.Int32, 4); //输出参数
//获取数据,这里在ds中只有一个DataTable
DataSet ds=db.ExecuteDataSet(dbcmd);
this.dataGridView1.DataSource = ds.Tables[0];
以上是返回一个数据集的,下面再看看如何返回多个数据集,这里只给出返回2个数据集的代码,当然也可以添加多个。
(2)返回多个结果集的方法:
Oracle存储过程:
create or replace procedure P_Sel_TopCount2(in_top in number,
out_count out number,
cur_out_1 out sys_refcursor,
cur_out_2 out sys_refcursor) is
--查询指定记录条数的数据,并返回总共记录数,返回多个数据集
begin
SELECT COUNT(*) into out_count FROM userinfo;
open cur_out_1 for
SELECT * FROM userinfo where id < in_top;
open cur_out_2 for
SELECT * FROM userinfo where id < 5;
end P_Sel_TopCount2;
c#调用:
//构造数据库
Database db = DatabaseFactory.CreateDatabase("Oracle");
//构造cmd
DbCommand dbcmd = db.GetStoredProcCommand("P_Sel_TopCount2");
//添加参数
db.AddInParameter(dbcmd, "in_top", DbType.Int32, 10);
db.AddOutParameter(dbcmd, "out_count", DbType.Int32, 4);
//注意:这里是关键,必须明确添加两个Oracle的游标参数,并且指明为OutPut,然后加进cmd命令对象里
OracleParameter oraPara1 = new OracleParameter("cur_out_1", OracleType.Cursor);
OracleParameter oraPara2 = new OracleParameter("cur_out_2", OracleType.Cursor);
//指明为输出参数
oraPara1.Direction = ParameterDirection.Output;
oraPara2.Direction = ParameterDirection.Output;
//添加参数到cmd
dbcmd.Parameters.Add(oraPara1);
dbcmd.Parameters.Add(oraPara2);
//获取数据,这时候在ds中就有两个DataTable了。
DataSet ds=db.ExecuteDataSet(dbcmd);
this.dataGridView1.DataSource = ds.Tables[1];
总结:如果要返回多个结果皆,必须添加OracleParameter类型的参数。
分享到:
相关推荐
sqlserver 快速查询存储过程或者视图中是否用到某个表或者字段。
MVC-JSP+Servlet+JavaBean 网上商城三十多张表 有前台后台 还可以在站内开店 用户也有自己的管理后台 中山中南T17班学完JSP强力打造 班长黄瑞煜领导的团队开发 ...用了不少存储过程,毕竟那时候还没有学SSH 好喜欢T17班
可以根据表明查询包含该表的视图和存储过程,刚入项目的萌新可以用用,了解了解结构,或者一个表增加字段,调整字段,可以检查表所在的视图和存储过程,保证修改不留遗漏
oracle存储过程,批量创建表和数据,表的个数支持参数传入
这个非常经典的oracle数据库的操作,查询和视图,PLSQL介绍,存储过程和触发器的详细PPT讲解,希望对大家有所帮助,挺经典的。
默认情况存储过程会返回每条语句执行后的影响行数,如果不需要这些信息的话,可以使用SET NOCOUNT ON来终止这种返回行为,这样可以避免客户端和服务器之间多次进行信息传递的过程。 减少可选参数:频繁使用可...
PLSQL中存储过程及游标的基本使用 Oracle中恢复某张表丢失数据的方法 -- 把SELECT出来的结果导到一个文本文件中 -- 查询新建用户 -- 查询那些用户,操纵了那些表造成了锁机 --看锁阻塞的方法 --ORACLE获得系统信息
这个是学校课程设计周使用的表格,表格是一个系统的关键,所以这张表,整整修改了两个星期才完成。主要是在触发器这个过程,因为触发器就像一把刀,使用的好很好用,使用不好,它很容易让系统崩溃。
本文实例讲述了sql server实现在多个数据库间快速查询某个表信息的方法。分享给大家供大家参考,具体如下: 最近出来实习,所在公司的服务器有十几个数据库,为了方便根据某个数据表的 表名 快速找到对应的数据库,又...
实验4 使用SQL语句创建并管理数据库、数据表
如果不带查询条件存储过程是: 代码如下: CREATE PROCEDURE [dbo].[UserName] @pageIndex int, @pageSize int AS declare @min int; declare @max int; set @min=@pageSize*(@pageIndex-1)+1; set @max=@pageSize*@...
通过视图的设计和定义,掌握建立视图的基本方法,包括通过单张表建立视图和通过多张表建立视图,通过在定义的视图上进行查询,删除,更新,插入操作,理解视图的概念,掌握简单的视图查询方法。 3. 实验预备知识 在...
(2) 在BookShopDao中添加一个purchase购书方法,其操作流程是获取书的单价->买书(更新库存)->更新账户余额,在BookShopDaoImp中实现该方法,并使用基于XML和Annotation的声明式事务管理来确保该购书过程能正常执行...
然而存储过程中的写法用的就是游标的形式。 【简介】 游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标充当指针的作用。 尽管游标能遍历结果中的所有行,但他一次只指向一行。 ...
我们在日常操作中,免不了对数据库的某张表,一次性的要插入多条记录,但是首先想到的就是复制,粘帖N多重复的INSERT INTO 语句,万一某一个少了一个分号,或多个逗号之类的,产生错误,要找起来可就费尽了,既浪费...
用存储过程通过两张字典表批量创建表(先删除后创建),内含,存储过程代码和两张表的结构和信息
这是使用Microsoft Sql Server数据库实现的车辆运费管理...创建了计算总价、根据磅单号计算差异之和的函数,创建了根据驾驶员查询的存储过程,创建了两个联合查询的视图,创建了三张表的索引,创建了更新操作的触发器。
本文给大家分享一段sql语句实现SqlServer快速检索某个字段在哪些存储过程中,代码非常简单,需要的朋友参考下
支持调用存储过程并根据查询结果动态映射。支持自动化的事务处理,可自动回滚。支持一对多的映射关系,即一个实体类可以映射到多张表。支持自动填充/补全数据实体类中的数据。支持DataSet、DataTable、DataRow多种...
1、查看某个数据库,直接执行存储过程sp_spaceused即可 exec sp_spaceused; 2、查看某个表,在存储过程后面加上表名即可 EXEC sp_spaceused 'T_XXXXX'; 3、查看该数据库中的所有表,可以写一个存储过程,然后...