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