sp_cursoropen返回空结果集导致获取不到sp_cursorfetch数据集解决办法

  今天修改一个asp程序,使用了存储过程,存储过程中使用sp_cursoropen/sp_cursorfetch来获取构造的sql语句获取分页数据,发现总记录数能获取到,但是就是无法获取到返回的记录集合。在SQL Server Management Studio执行存储过程,sql为asp输出的sql语句,发现尽然出现了2个结果集,一个是一条记录也没有的,另外一个是有结果的,如下图所示

sp_cursoropen返回空结果集导致获取不到sp_cursorfetch数据集解决办法

  结果asp的adodb.recordset获取的数据集合是第一个的空结果集合,而不是有数据的结果集合。第一个空结果集合是sp_cursoropen产生的,翻墙谷歌了下没有相关资料说如何去掉这个空结果集合(可能英语烂输入的英文不对,O(∩_∩)O哈哈~),第二才是sp_cursorfetch获取到的分页数据。

  但是奇特的是,相同的asp程序和存储过程,在window2003+MSSQLServer2000的服务器跑(存储过程在查询管理器里面执行也是存在2个结果集合),asp的adodb.recordset获取到的是第二个有数据的,但是在win7+MSSQLServer2008上跑获取到的是第一个空结果结合的,我日。。

 

  解决办法就是判断下获取的结果集合是否为空的,空的话调用adodb.recordset NextRecordset方法获取第二个结果集合。

 

  最后贴下执行sql语句获取分页数据的存储过程和asp执行存储过程获取数据的asp代码

/****** Object:  Stored Procedure dbo.p_splitpage     ******/
CREATE procedure p_splitpage   
@sql nvarchar(4000),--要执行的sql语句
@currentpage int=2, --要显示的页码
@pagesize int=10,--每页的大小
@recordcount int=0 output,--记录数
@pagecount int=0 output--总页数
as
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordcount=@pagecount
set @pagecount=ceiling(1.0*@pagecount/@pagesize)   
set @currentpage=(@currentpage-1)*@pagesize+1  
--select @recordcount recordcount ,@pagecount  pagecount,@currentpage  currentpage
exec sp_cursorfetch @p1,16,@currentpage,@pagesize 
exec sp_cursorclose @p1
set nocount off
GO

  asp代码

'高效通用的翻页函数,函数返回一个记录集对像
Function GetData(Sql,Conn,Cur_page,P_size,R_Count,P_Count)
	dim rs,Cmd
	Set Cmd = Server.CreateObject("ADODB.Command")
	Cmd.ActiveConnection=Conn
	Cmd.CommandType=4 'adCmdStoredProc
	Cmd.prepared=true '保存编译
	Cmd.CommandText="p_splitpage" '存储过程 名称
	'设置参数
	Cmd.Parameters.Append Cmd.CreateParameter("@sql",200,1,500,Sql)
	Cmd.Parameters.Append Cmd.CreateParameter("@Current_Page",3,1,4,Cur_page)
	Cmd.Parameters.Append Cmd.CreateParameter("@pagesize",3,1,4,P_size)
	Cmd.Parameters.Append Cmd.CreateParameter("@recordcount",3,2)
	Cmd.Parameters.Append Cmd.CreateParameter("@pagecount",3,2)
	'set rs=cmd.execute '开始执行
	set  rs=server.CreateObject("adodb.recordset")    
	rs.CursorType  =3    
	rs.LockType  =3    
	rs.CursorLocation  =3    
	set  rs.Source  =cmd  
	rs.open
	R_Count=Cmd("@recordcount")
	P_Count=Cmd("@pagecount") 
'关键。。。不懂搞毛sqlserver2000+win2003直接获取的第二个表。win7+sqlserver2008得到的是第一个空的结果集合
    if rs.eof or rs.bof then set rs=rs.nextrecordset
	set GetData=rs
End Function

 



原创文章,转载请注明出处:sp_cursoropen返回空结果集导致获取不到sp_cursorfetch数据集解决办法
评论(0)Web开发网
阅读(56)喜欢(0)不喜欢(0)Asp/VBScript