以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [讨论]关于存储过程执行不能返回结果的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=29416)

--  作者:fox0001
--  发布时间: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编辑过]

--  作者:狐狸爸爸
--  发布时间:2013/3/6 15:29:00
--  
ExecuteReader 确实只会返回第一个结果的。
--  作者:fox0001
--  发布时间:2013/3/7 8:17:00
--  
以下是引用狐狸爸爸在2013-3-6 15:29:00的发言:
ExecuteReader 确实只会返回第一个结果的。

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


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


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


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


--  作者:fox0001
--  发布时间:2013/3/7 8:49:00
--  
以下是引用muhua在2013-3-7 8:36:00的发言:

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

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