首页 新闻 会员 周边 捐助

C# 取oracle返回的多个结果集的问题

0
悬赏园豆:40 [已解决问题] 解决于 2014-12-28 12:56

小弟刚学oracle,碰到个难题,希望大家不吝指教。
环境是win8.1 64位,vs2010开发,plsql developer10.
具体问题是:
有6个select语句,返回6个datatable,在c#里用dataset接收。
我使用了包,然后用6个游标返回了6个结果(等于返回了一个dataset),然后成功了。
但问题是,这样取数据过程极为缓慢,我在页面上操作了一下,起码得5秒钟才会反应。不知各位大虾有没有好的办法?
代码贴上:

 1 --包定义
 2 create or replace package pack_siit is
 3  type t_cur_1 is ref cursor;--定义游标变量
 4  type t_cur_2 is ref cursor;
 5  type t_cur_3 is ref cursor;
 6  type t_cur_4 is ref cursor;
 7  type t_cur_5 is ref cursor;
 8  type t_cur_6 is ref cursor;
 9  procedure GZPC_GZSOFT_GETCODEDATASET
10            (
11           cur_1 out t_cur_1,
12           cur_2 out t_cur_2,
13           cur_3 out t_cur_3,
14           cur_4 out t_cur_4,
15           cur_5 out t_cur_5,
16           cur_6 out t_cur_6
17           );
18    end pack_siit;
19  
20  
21 --包主体
22 create or replace package body pack_siit is
23   procedure  GZPC_GZSOFT_GETCODEDATASET
24     (  cur_1 out t_cur_1,
25           cur_2 out t_cur_2,
26           cur_3 out t_cur_3,
27           cur_4 out t_cur_4,
28           cur_5 out t_cur_5,
29           cur_6 out t_cur_6)
30     as
31      begin
32  OPEN cur_1 FOR
33   select * from Basic_Code where substr(CodeId,4,2)='00' and substr(CodeId,2,4)!='0000' and CodeId!='000000';
34    OPEN cur_2 FOR
35    select * from Basic_Code where substr(CodeId,4,2)!='00'; 
36     OPEN cur_3 FOR
37   select * from Basic_Code where substr(CodeId,2,4)='0000';
38    OPEN cur_4 FOR
39   select * from basic_town;
40      OPEN cur_5 FOR
41   select * from basic_village;
42    OPEN cur_6 FOR
43   select codeid,(codeid||TownId) as townid,TownName from Basic_Town;
44  
45     end GZPC_GZSOFT_GETCODEDATASET;
46    end pack_siit;

后台是这样写的:

 1 DataSet tempds = null;                            
 2  OracleParameter[] parameters = {
 3                     new OracleParameter("cur_1",OracleType.Cursor),
 4                     new OracleParameter("cur_2",OracleType.Cursor),
 5                     new OracleParameter("cur_3",OracleType.Cursor),
 6                     new OracleParameter("cur_4",OracleType.Cursor),
 7                     new OracleParameter("cur_5",OracleType.Cursor),
 8                     new OracleParameter("cur_6",OracleType.Cursor)};
 9                 parameters[0].Direction = ParameterDirection.Output;
10                 parameters[1].Direction = ParameterDirection.Output;
11                 parameters[2].Direction = ParameterDirection.Output;
12                 parameters[3].Direction = ParameterDirection.Output;
13                 parameters[4].Direction = ParameterDirection.Output;
14                 parameters[5].Direction = ParameterDirection.Output;
15 --这是公司里的方法,其实就是写入存储过程名就好了。我用了包,所以是用包名.存储过程名。                              
16 tempds = GZSoft.DBUtility.DbHelper.ExecuteDataSetByProc("pack_siit.GZPC_GZSOFT_GETCODEDATASET", parameters);
张孤山的主页 张孤山 | 初学一级 | 园豆:14
提问于:2014-12-26 12:35
< >
分享
最佳答案
0

我有一个想法,为什么要用游标,你把查询用的Sql语句,组成一条语句,然后 执行,用DataSet接收不行了?这样的话DataSet

会自动 将结果集分为多个结果 返回

收获园豆:40
需要格局 | 老鸟四级 |园豆:2145 | 2014-12-26 14:06

我在sql server里正是这样做的。但oracle不支持这样,所以试了很多办法,才用了游标。

张孤山 | 园豆:14 (初学一级) | 2014-12-27 08:50
其他回答(2)
0

超过5小时才有反应,我也完全不奇怪,你又没有说明什么环境、多少数据。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-26 12:41

。。兄台 你难道一点没看帖子吗。。

环境:

环境是win8.1 64位,vs2010开发,plsql developer10.

数据:

有6个select语句,返回6个datatable,在c#里用dataset接收。
我使用了包,然后用6个游标返回了6个结果(等于返回了一个dataset),然后成功了。

然后不是五小时,是五秒。

兄台你让我灰常震惊啊。。。

支持(0) 反对(0) 张孤山 | 园豆:14 (初学一级) | 2014-12-26 13:31

@张孤山: 超过5小时才有反应,我也完全不奇怪,。。。。。。你又没有说明什么环境、多少数据

我只是路过, 打酱油。 

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2014-12-26 14:00

@张孤山: 

超过5小时才有反应,我也完全不奇怪,。。。。。。你又没有说明什么环境、多少数据

我只是路过, 打酱油。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-12-26 14:12

@张孤山: 原来是初学者,没有注意到。

你不懂得我问的环境和数据也是正常的。所以你可能也不知道为什么有两个呆鸟跟着起哄。

那就是说你说的5秒钟也不一定是对的,不知道你怎么判断出来5秒钟的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-26 14:21

@爱编程的大叔: 博客园也有水军了吗?好悲哀。

支持(0) 反对(0) 张孤山 | 园豆:14 (初学一级) | 2014-12-27 08:52
0

退而求其次,用多次访问数据库解决了这个问题。多谢田麦成童鞋参与讨论解决。 

张孤山 | 园豆:14 (初学一级) | 2014-12-28 12:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册