经典ASP/VBscript错误(无效字符)

经典ASP/VBscript错误(无效字符),vbscript,asp-classic,Vbscript,Asp Classic,当我加载一个ASP页面,该页面使用加载ASP页面时使用的参数从SQL 2000调用存储过程时,我遇到以下错误 我犯了小学生的错误吗?我该如何解决这个问题 错误 页面为stock_test.asp?ID=980028001365274 <!--#include file="includes/functions_test.asp"--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <

当我加载一个ASP页面,该页面使用加载ASP页面时使用的参数从SQL 2000调用存储过程时,我遇到以下错误

我犯了小学生的错误吗?我该如何解决这个问题

错误

页面为stock_test.asp?ID=980028001365274

<!--#include file="includes/functions_test.asp"-->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<%
declare @serial varchar(255)
set @serial = Request.QueryString("ID")

Call OpenDB()
Call OpenRecordSet(stock, "Exec sp_report_simon_test @serial")
%>

<html lang="EN">

<head>
    <title>Stock</title>
</head>

<body>

<table id="test">

    <tr>
        <td><b>Make</b></td>
        <td><b>Model</b></td>
        <td><b>Serial</b></td>
    </tr>

<%DO WHILE NOT stock.EOF%>

    <tr>
        <td><%=stock.Fields("Make").value %></td>
        <td><%=stock.Fields("Model").value %></td>
        <td><%=stock.Fields("serial_number").value %></td>
    </tr>

<%
stock.MoveNext
LOOP
%>

</table>

<%
Call CloseRecordSet(stock)
Call CloseDB()
%>

</body>
</html>

股票
制作
模型
电视连续剧
函数文件

<%
response.Charset="utf-8"
Session.lcid = 2057
Response.Buffer = False
Server.ScriptTimeout=200

Dim dbConn
Function OpenDB()
    Set dbConn = Server.CreateObject("ADODB.Connection")
    dbConn.Open "Driver={SQL Server}; Server=server_name; Database=db_name; UID=username; PWD=password; Option=4"
End Function

Function CloseDB()
    If ucase(TypeName(dbConn)) = "OBJECT" Then
        dbConn.Close
        Set dbConn = Nothing
    End If
End Function

Function OpenRecordSet(RecSet, SqlQuery)
    Set RecSet = Server.CreateObject("ADODB.Recordset")
    Set RecSet = dbConn.Execute(SqlQuery)
End Function

Function CloseRecordSet(RecSet)
    RecSet.Close
    Set RecSet = Nothing
End Function

Function ProcessSql(Sql, Page)
    Call OpenDB()
        dbConn.Execute(Sql)
    Call CloseDB()
    If Len(Page) > 0 Then   
        Response.Redirect(Page)
    End If
End Function

Function Encode(DirtyText)
    Dim CleanText
    Cleantext = Server.HtmlEncode(DirtyText)
    CleanText = Replace(CleanText, "'", "''")
    CleanText = Replace(CleanText, vbCrLf, "<br>")
    Encode = CleanText
End Function

Function mySqlDate(rawDate)
    Dim dateString
    dateString = DatePart("yyyy", cdate(rawDate))
    dateString = dateString & "-" & DatePart("m", cdate(rawDate))
    dateString = dateString & "-" & DatePart("d", cdate(rawDate))
    mySqlDate = dateString
End Function

Function GetMonthName(monthId)
    Dim monthNames
    monthNames = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
    GetMonthName = monthNames(monthId -1)
End Function

Function CheckQueryString(Qstring, QName, Page)
    If Not Len(QString) = 0 AND Len(QString) < 6 AND IsNumeric(QString) Then
        QName = QString
    Else
        Response.redirect(Page)
    End If
End Function
%>
0那么
响应.重定向(第页)
如果结束
端函数
函数编码(DirtyText)
变暗清除文本
Cleantext=Server.HtmlEncode(DirtyText)
CleanText=替换(CleanText,“,”)
CleanText=替换(CleanText,vbCrLf,“
”) 编码=清除文本 端函数 函数mySqlDate(rawDate) 暗日期字符串 dateString=DatePart(“yyyy”,cdate(原始日期)) dateString=dateString&“-”和DatePart(“m”,cdate(原始日期)) dateString=dateString&“-”和DatePart(“d”,cdate(原始日期)) mySqlDate=dateString 端函数 函数GetMonthName(monthId) 朦胧的蒙纳姆斯 monthNames=数组(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”) GetMonthName=monthNames(monthNames-1) 端函数 函数CheckQueryString(Qstring,QName,第页) 如果不是Len(QString)=0且Len(QString)<6且为数值(QString),则 QName=QString 其他的 响应.重定向(第页) 如果结束 端函数 %>
您尝试使用SQL参数是值得称赞的,但在ASP中它们不能以这种方式工作。不言而喻,您不能简单地将SQL放入ASP代码中

改用命令对象

Dim库存,serialVal
OpenDB()
serialVal=Request.QueryString(“串行”)
如果serialVal=”“,则serialVal=vbNull
使用Server.CreateObject(“ADODB.Command”)
Set.ActiveConnection=dbConn
.CommandText=“sp\U报告\U西蒙测试”
.CommandType=adCmdStoredProc
.Parameters.Append.CreateParameter(“@serial”,adVarChar,adParamInput,30,serialVal)
设置库存=.Execute
以
文件:


要能够在VBScript代码中直接使用诸如
adCmdStoredProc
之类的常量,必须通过在ASP页面顶部引用其类型库使其可用

对于Windows 7/Windows Server 2008及更高版本,请使用6.1版:

<!--metadata 
    type="TypeLib" 
    name="Microsoft ActiveX Data Objects 6.1 Library" 
    uuid="B691E011-1797-432E-907A-4D8C69339129"
    version="6.1"-->

对于早期版本(Windows XP/Windows Server 2003),请使用2.8版:

<!--metadata 
    type="TypeLib" 
    name="Microsoft ActiveX Data Objects 2.8 Library" 
    uuid="2A75196C-D9EB-4129-B803-931327F72D5C"
    version="2.8"-->


声明@serial varchar(255)
是SQL语法。ASP不理解SQL语法。要解决
@
这不是您唯一的问题,
调用OpenRecordSet(stock,“Exec sp_report\u simon_test@serial”)
也不起作用。第一个错误是变量声明和赋值,看起来更像
Dim serial
serial=Request.QueryString(“ID”)
发布
OpenRecordSet
函数,我也会尝试帮助。谢谢,我已经添加了函数文件codeOK谢谢@Tomalak,我已经将代码中的“@id”更改为“@serial”,因为这是存储过程中变量的名称。当我尝试此操作时,尽管ADODB.Command error“800a0bb9”参数类型错误、超出可接受范围或相互冲突,但仍会出现另一个错误/simon/stock_test.asp,第13行名称并不重要,SQL Server只关心存储过程中的参数顺序。但是保持一致性很好,这就是为什么您也应该将查询字符串参数重命名为“Serial”的原因。好的,太好了,我也将查询字符串参数更改为“Serial”。。。。运行ADODB时仍会出错。命令错误“800a0bb9”参数类型错误、超出可接受范围或相互冲突/simon/stock_test.asp,第13行我不能成为你的行式交互式调试助手。我只能推荐每个开发人员追踪问题的正常做法:创建一个空白ASP文件,将
Option Explicit
放在代码顶部(这样您就不会错过任何由未定义变量引起的错误),然后逐点构建语句。理解每一条语句,了解您选择的参数值,观察哪些值破坏了它,哪些值使它工作。我的代码肯定能用,你会找到你的代码关闭的地方。问题解决了。。代码中未定义varchar的长度。它现在可以与
“@serial”、adVarChar、adParamInput、30、Request.QueryString(“serial”)一起使用
<!--metadata 
    type="TypeLib" 
    name="Microsoft ActiveX Data Objects 2.8 Library" 
    uuid="2A75196C-D9EB-4129-B803-931327F72D5C"
    version="2.8"-->