【问题标题】:classic ASP/VBscript error (Invalid character)经典的 ASP/VBscript 错误(无效字符)
【发布时间】:2015-03-13 11:25:49
【问题描述】:

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

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

错误

Microsoft VBScript compilation error '800a0408'
Invalid character
/simon/stock_test.asp, line 6
declare @serial varchar(255)
--------^

页面是 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
%>

【问题讨论】:

  • declare @serial varchar(255) 是 SQL 语法。 ASP 不理解 SQL 语法。
  • 摆脱@ 这不是你唯一的问题,Call OpenRecordSet(stock, "Exec sp_report_simon_test @serial") 也不起作用。
  • 第一个错误是变量声明和赋值应该看起来更像Dim serialserial = Request.QueryString("ID") 发布OpenRecordSet 函数,我也会尝试帮助解决这个问题。
  • 谢谢,我已经添加了函数文件代码

标签: vbscript asp-classic


【解决方案1】:

您尝试使用 SQL 参数是值得称道的,但它们在 ASP 中不能以这种方式工作。不言而喻,不能简单地将 SQL 放入 ASP 代码中。

改用 Command 对象。

Dim stock, serialVal

OpenDB()

serialVal = Request.QueryString("serial")
If serialVal = "" Then serialVal = vbNull

With Server.CreateObject("ADODB.Command")
  Set .ActiveConnection = dbConn
  .CommandText = "sp_report_simon_test"
  .CommandType = adCmdStoredProc
  .Parameters.Append .CreateParameter("@serial", adVarChar, adParamInput, 30, serialVal)
  Set stock = .Execute
End With

文档:


为了能够直接在 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"-->

【讨论】:

  • 好的,谢谢@Tomalak,我已将代码中的“@id”更改为“@serial”,因为这是存储过程中变量的名称。当我尝试这个时,虽然我得到了另一个错误ADODB.Command error '800a0bb9' Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another. /simon/stock_test.asp, line 13
  • 名称并不重要,SQL Server 只关心存储过程中的参数order。但是保持一致是很好的,这就是为什么您应该将查询字符串参数也重命名为“Serial”。
  • 好的,我也将查询字符串参数更改为“serial”....运行时仍然出现错误ADODB.Command error '800a0bb9' Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another. /simon/stock_test.asp, line 13
  • 我不能成为你的逐行交互式调试助手。我只能推荐每个开发人员跟踪问题的正常做法:创建一个空白 ASP 文件,将 Option Explicit 放在代码顶部(这样您就不会错过任何由未定义变量引起的错误)和然后一点一点地构建语句。理解每个陈述,注意您选择的参数值,并观察哪些值破坏了它,哪些值使它起作用。我的代码肯定有效,你会找到你的代码关闭的地方。
  • 问题已解决.. varchar 的长度未在代码中定义。它现在适用于"@serial", adVarChar, adParamInput, 30, Request.QueryString("serial") _
猜你喜欢
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多