Foxtable(狐表)用户栏目专家坐堂 → [讨论]关于存储过程执行不能返回结果的问题


  共有7383人关注过本帖树形打印复制链接

主题:[讨论]关于存储过程执行不能返回结果的问题

帅哥哟,离线,有人找我吗?
fox0001
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:85 积分:625 威望:0 精华:0 注册:2012/11/27 11:00:00
[讨论]关于存储过程执行不能返回结果的问题  发帖心情 Post By:2013/3/6 14:01:00 [只看该作者]

有以下两个存储过程 fox_test_01、fox_test_02 和 fox_test_03 :
------------------------------------------------
create proc fox_test_01
as
begin
    select '1' 编号, 'apple' 名称
    union all
    select '2' 编号, 'banana' 名称
    union all
    select '3' 编号, 'cherry' 名称
end 
------------------------------------------------
create proc fox_test_02
as
begin
    select '1' 编号, 'apple' 名称
    into #tmp
    union all
    select '2' 编号, 'banana' 名称
    union all
    select '3' 编号, 'cherry' 名称

   select * from #tmp
end
------------------------------------------------
create proc fox_test_03
as
begin
    create table #tmp(编号 varchar(20), 名称 varchar(50))

    insert into #tmp(编号, 名称)
    select '1' 编号, 'apple' 名称
    union all
    select '2' 编号, 'banana' 名称
    union all
    select '3' 编号, 'cherry' 名称

    select * from #tmp
end 
------------------------------------------------
利用 SQLCommand 的 ExecuteReader 方法分别执行以下SQL:
exec fox_test_01
exec fox_test_02
exec fox_test_03

结果只有fox_test_01返回结果,fox_test_02却返回空,fox_test_03提示SQL语法错误而不能执行。
貌似 ExecuteReader 方法只能获取第一个语句的结果,而导致上面的结果。这个是不是Bug?

因为很多复杂的报表,都用存储过程来执行查询并返回结果,希望能够解决这个问题。
[此贴子已经被作者于2013-3-6 14:06:54编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
muhua
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:等待验证 帖子:3855 积分:20692 威望:0 精华:5 注册:2012/6/21 14:03:00
  发帖心情 Post By:2013/3/6 15:13:00 [只看该作者]

用户已被锁定

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/3/6 15:29:00 [只看该作者]

ExecuteReader 确实只会返回第一个结果的。

 回到顶部
帅哥哟,离线,有人找我吗?
fox0001
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:85 积分:625 威望:0 精华:0 注册:2012/11/27 11:00:00
  发帖心情 Post By:2013/3/7 8:17:00 [只看该作者]

以下是引用狐狸爸爸在2013-3-6 15:29:00的发言:
ExecuteReader 确实只会返回第一个结果的。

这个能不能处理一下?或者有什么好的解决办法?


1)目前的解决办法是把存储过程的查询结果都保存到一个表A里,再用ExecuteReader查询表A,最后删除表A。这样很麻烦,而且狐表还没有事务,有时会出错而导致表A没有被删除,数据库会留下很多垃圾表。


2)想过用视图解决,还没试过。


3)由于狐表还不支持事务,如果做事务处理的话,可能不能返回最后事务处理的结果。


 回到顶部
帅哥哟,离线,有人找我吗?
muhua
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:等待验证 帖子:3855 积分:20692 威望:0 精华:5 注册:2012/6/21 14:03:00
  发帖心情 Post By:2013/3/7 8:36:00 [只看该作者]

用户已被锁定

 回到顶部
帅哥哟,离线,有人找我吗?
fox0001
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:85 积分:625 威望:0 精华:0 注册:2012/11/27 11:00:00
  发帖心情 Post By:2013/3/7 8:49:00 [只看该作者]

以下是引用muhua在2013-3-7 8:36:00的发言:

事务处理应该是用存储过程来完成,而不是应该用狐表来完成,既然您会写存储过程,为什么不在存储过程中所使用事务处理呢??

事务处理是可以用存储过程处理,但是储存过程执行完毕后,怎么能获取到处理结果?问题还是,狐表只能获取并返回存储过程中第一个语句的结果。


 回到顶部