现在的位置: 首页 > 综合 > 正文

关于存储过程不直接返回结果集的问题

2012年10月04日 ⁄ 综合 ⁄ 共 1150字 ⁄ 字号 评论关闭

假设现在有一个这样的存储过程:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FindTheStudents]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[FindTheStudents]
GO


/* 查询指定序号和入学时间的学生的存储过程 */
create procedure FindTheStudents
(
  
@IDList varchar(1000),
  
@BeginTime varchar(20),
  
@EndTime varchar(20)
)
as
begin
  
declare @s varchar(4000)
  
set @s='select id as "序号", name as "名字", tel as "电话" from student where classid in ('+@IDList+') and logtime between "'+@beginTime+'" and "'+@endTime+'"'
  
exec(@s)
end
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

现在在DAL层的DataSet的Adapter中要添加一个query来执行该存储过程,并返回相应的结果集。按照以往的经验,如果在存储过程中只是简单的执行

select id, name, tel from student where classid in (1,2,3and logtime between '2005-1-1' and '2006-1-1' 

这样一条语句,那么在生成这个存储过程的query的过程中,肯定会生成一个相应的结果集表

但是如果使用上面存储过程的方式,也就是先构造一个查询语句@s,然后在调用exec(@s),那么vs2005并不会自动构造一个结果集的表。
对于这样的情况,用户有两种选择:一个是自己手动的来编辑这个表;一个就是让这个表保持为空;
对于第一种情况:
要手动编辑这个表,当然就要能够事先预知这个表的结构,以后使用该查询的时候,返回的结果集的表头的名字就是按照这里定义的来显示;
对于第二种情况:
如果让这个表为空的化,以后使用该表的时候,表的内容会根据存储过程返回值的内容自动填充,如果把这个结果集和某个gridview关联的化,也可以正常显示表中的所有内容;但是用这种方式也有他的缺点,就是无法在编译的时候知道该表的行的类型;

抱歉!评论已关闭.