我的Sql Server2000存储过程及其在ASP中的调用代码,为啥老是不对头呢?高分征解。

YangYun 2006-01-04 06:06:40
我的ASP代码如下(主要的错误地方我在后面用注解标明):
<!-- #include virtual="adovbs.inc"-->
<%
Set Conn=Server.CreateObject("Adodb.connection")
conn.open connstr
Set ObjCmd=Server.CreateObject("Adodb.Command")
objCmd.CommandText="Music_GetByClass"
objCmd.CommandType=4
set objCmd.ActiveConnection=Conn

'问题1:为啥我用下面的代码添加参数却不能成功,浏览器提示什么参数类型不一致
' setobjParam=objCmd.CreateParameter("@MusicClass",200)
' objCmd.Parameters.Append objParam
' objParam.Value="MP3"

objCmd.Parameters.Append objCmd.CreateParameter("@MusicClass", 200, 1, 50, "MP3")
'问题2:下面如果我添加第二个参数@PageNo,浏览器也提示错误
'objCmd.Parameters.Append objCmd.CreateParameter("@PageNo",3,1,5,"5")
Set Rs=objCmd.execute

'问题3:下面我想获得返回的记录数,可是输出结果却为-1,但当我用
'do while not rs.eof 输出记录,rs.movenext Loop形式时,却有很多记录存在。
response.write rs.recordcount&"<br>"

我的存储过程为:
CREATE PROCEDURE Music_GetByClass
@MusicClass varchar(50)
AS
//本来我想用@PageNO来传入参数的,但由于在ASP中定义该参数出错,这里手工进行定义、修改,以方便调试。
declare @PageNo int
declare @tempSize varchar(50)
//问题4:这里非常奇怪,我把下面的@Pageno=1可以得到结果。但我将@PageNO设为>=2以上的值时,浏览器却提示“必须声明变量 '@MusicClass' ,在某某ASP里某一行”
     
set @Pageno=1

set @TempSize=Cast((@PageNo-1)*15 as varchar(50))
if @PageNo=1
Select top 15 *
From CM_Music
Where Music_Class=@MusicClass
Order By Music_LastPlayTime DESC
else

Exec('Select top 15 *
From CM_Music
Where ID Not in (
Select top '+@TempSize+' ID
From CM_Music
Where Music_Class=@MusicClass
Order By Music_LastPlayTime DESC )
Order By Music_LastPlayTime DESC')
GO


今天我就被这几个问题折腾了一天了,问题还是没有解决,有没有哪位高手帮帮忙啊,敬请各位大虾帮助。
...全文
254 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexlam 2006-04-11
  • 打赏
  • 举报
回复
给一个实例吧.
YangYun 2006-01-11
  • 打赏
  • 举报
回复
虽然我照大家的方法没有成功,但我也知道大家的方法是正确的,但在我这里就是不成功,没办法。但我还是准备给大家先结贴再说,谢谢各位高人的帮助。
YangYun 2006-01-10
  • 打赏
  • 举报
回复
唉,我已经快彻底崩溃了,我的代码怎么看都没有错啊,为啥就是通不过呢?
我的代码如下啊:

Set Conn=Server.CreateObject("Adodb.connection")
conn.open connstr
Set ObjCmd=Server.CreateObject("Adodb.Command")
objCmd.CommandText="Music_GetByClass"
objCmd.CommandType=4
set objCmd.ActiveConnection=Conn

PageSize=15
PageNo=1
MusicClass="MP3"
Set objparam=objCmd.CreateParameter("@MusicClass",adVarChar,adParamInput,50,MusicClass)
objCmd.Parameters.Append objparam
Set objParam=objCmd.CreateParameter("@PageSize",adInteger,adParamInput,10,PageSize)
objCmd.Parameters.Append objParam
set objParam =objCmd.CreateParameter("@PageNo",adInteger,adParamInput,10,PageNo)
objCmd.Parameters.Append objParam
Set Rs=objCmd.execute

浏览器就是报错:错误如下:
错误类型:
Microsoft OLE DB Provider for SQL Server (0x80040E14)
必须声明变量 '@MusicClass'。
/Music/bak/test.asp, 第 22 行




这究竟是怎么回事啊
是是非非 2006-01-10
  • 打赏
  • 举报
回复

'问题1:为啥我用下面的代码添加参数却不能成功,浏览器提示什么参数类型不一致
' setobjParam=objCmd.CreateParameter("@MusicClass",200)
' objCmd.Parameters.Append objParam
' objParam.Value="MP3"

其实有一个简单的办法的
objCmd.CommandType=4
objCmd.CommandText="Music......"
在这个之后来一个
objCmd.Parameters.Refresh
然后就可以直接使用了,不需要CreateParameter然后Append了

objCmd.Parameters("@PageNo").Value=1 '这样
YangYun 2006-01-10
  • 打赏
  • 举报
回复
对不起了各位,这几天忙着其它事情,还没有上来看看,让各位久等了,我的代码跟大家的差不多,但就是通不过,出不来结果,看了几位高手的回复,非常感谢,我马上再去试一下,不管怎样,我都要感谢各位的盛情参与。
竹林听雨2005 2006-01-05
  • 打赏
  • 举报
回复
学习一下,
chinastorm 2006-01-05
  • 打赏
  • 举报
回复
高手都说过了,我来学习
syhxj 2006-01-05
  • 打赏
  • 举报
回复
问题1、问题2:
命令的参数和存储过程的参数的顺序、类型等都必须一致,给命令添加参数时最好按照标准格式来添加,不要自己想当然的写。
问题3:
用命令返回的记录集相当于Rs.open strSQL,conn,而这种情况下返回的recordcount就是-1。你可以用存储过程来返回。
问题4:估计是你的asp代码有问题,仔细看看吧
  • 打赏
  • 举报
回复
哈哈,昨天我太困了,上班也是半睡半醒,下班一下睡了12个小时........

楼主这个问题怎么还没搞定啊,嘿嘿,多看看别人的代码就是了,这些都不是问题的问题....

你找一个ado手册看看去,变量的各个定义都在里面的
  • 打赏
  • 举报
回复
up
rawjim 2006-01-04
  • 打赏
  • 举报
回复
<!--#include virtual="include/adovbs.inc"-->
<%
dim conn,strConn
dim objCommand
dim objPara
dim ClassName,PageSize,PageNo
dim rs
' 连接数据库
set conn=server.CreateObject("ADODB.Connection")
set rs=server.CreateObject("adodb.recordset")
strConn = "Driver={SQL Server};SERVER=10.33.250.110;UID=sa;Password=;DATABASE=master"
conn.open strConn

ClassName="mp3"
PageSize=5
PageNo=1
Set objCommand = Server.CreateObject("ADODB.Command")
objCommand.ActiveConnection = conn
objCommand.CommandText = "Music_GetByClass" ' 存储过程名
objCommand.CommandType = 4 ' 4代表存储过程

set objPara = objCommand.CreateParameter("MusicClass",200,1,50,ClassName)
objCommand.Parameters.Append objPara
set objPara = objCommand.CreateParameter("PageSize",3,1,10,PageSize)
objCommand.Parameters.Append objPara
set objPara = objCommand.CreateParameter("PageNo",3,1,10,PageNo)
objCommand.Parameters.Append objPara


set Rs=objCommand.execute


' rs.recordcount ' 特别注意, 这句始终是-1
response.write("<table border='1'>")
do while not rs.eof
response.write("<tr><td>"&rs(0)&"</td><td>"&rs(1)&"</td><td>"&rs(2)&"</td></tr>")
rs.movenext
loop
response.write("</table>")

set rs=nothing
set conn=nothing
set objPara=nothing
set objCommand=nothing

%>
rawjim 2006-01-04
  • 打赏
  • 举报
回复
-- 【注意:我的代码可能会覆盖你的数据,请作好备份】
-- 【创建表CM_Music】
if exists (select * from dbo.sysobjects where id = object_id(N'[CM_Music]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [CM_Music]
GO

CREATE TABLE [CM_Music] (
[ID] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Music_Class] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Music_Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO
-- 【在CM_Music插入示意数据】
Insert Into CM_Music
select '1','mp3','音乐1'
union all select '2','mp3','音乐2'
union all select '3','mp3','音乐3'
union all select '4','mp3','音乐4'
union all select '5','mp3','音乐5'
union all select '6','mp3','音乐6'
union all select '7','mp3','音乐7'
union all select '8','mp3','音乐8'
union all select '9','mp3','音乐9'
union all select '10','mp3','音乐10'
union all select '11','mp3','音乐11'
union all select '12','mp3','音乐12'
union all select '13','mp3','音乐13'
union all select '14','mp3','音乐14'
union all select '15','mp3','音乐15'
union all select '16','mp3','音乐16'
union all select '17','mp3','音乐17'
GO
-- 【在创建存储过程】
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'Music_GetByClass'
AND type = 'P')
DROP PROCEDURE Music_GetByClass
GO
CREATE PROCEDURE Music_GetByClass
@MusicClass varchar(50),
@PageSize int,
@PageNo int
AS
begin
declare @TempSize bigint
declare @strSQL NVARCHAR(500)
declare @tempChar char(1)
set @tempChar=''''
if @PageNo=1
set @strSQL='Select top '+cast(@PageSize as varchar)+' * From CM_Music Where Music_Class='+@tempChar+@MusicClass+@tempChar
else
begin
set @TempSize=(@PageNo-1) * @PageSize
set @strSQL='Select top '+cast(@PageSize as varchar)+' * From CM_Music Where ID Not in ( Select top '+cast(@TempSize as varchar)+' ID From CM_Music Where Music_Class='+@tempChar+@MusicClass+@tempChar+') and Music_Class='+@tempChar+@MusicClass+@tempChar
end
exec sp_executesql @strSQL
--print @strSQL
end
rawjim 2006-01-04
  • 打赏
  • 举报
回复
为了回你的帖子,费了我几个小时,以前我也没写过。靠,觉得心理很不平衡,你的问题,为什么要别人给你琢磨。

以下代码全部调试通过。
wlnh420 2006-01-04
  • 打赏
  • 举报
回复
存储过程重新在修改一下

你的rs游标也不支持recordcount
YangYun 2006-01-04
  • 打赏
  • 举报
回复
我是说下面的语句在ASP程序里就是不能通过:objCmd.Parameters.Append objCmd.CreateParameter("@PageNo",3,1,,5)
而上一句:objCmd.Parameters.Append objCmd.CreateParameter("@MusicClass", 200, 1, 50, "MP3") 就能通过。
  • 打赏
  • 举报
回复
分页存储过程然后你通过rs获取的recordcount只会有你设定的每页记录数这些,要想返回所有记录数可以通过定义存储过程中的输出,你可以搜索以下

  • 打赏
  • 举报
回复
存储过程需要修改,接收外部传入参数的必须在as前
CREATE PROCEDURE Music_GetByClass
@MusicClass varchar(50),
@PageNo int
AS
//本来我想用@PageNO来传入参数的,但由于在ASP中定义该参数出错,这里手工进行定义、修改,以方便调试。

1.
setobjParam=objCmd.CreateParameter("@MusicClass",200,1,50,"MP3")
2.objCmd.Parameters.Append objCmd.CreateParameter("@PageNo",3,1,,5)

objCmd.Parameters.Append objParam
3.你用的rs的游标方式不支持recordcount,可以在存储过程里面写

YangYun 2006-01-04
  • 打赏
  • 举报
回复
唉,还是没用人来回复一下啊
YangYun 2006-01-04
  • 打赏
  • 举报
回复
居然没有关注他一下啊。高手到哪儿去了

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧