2015-03-13 23 views
0

当我加载一个ASP页面时,出现以下错误,该页面使用加载ASP页面时使用的参数从SQL 2000调用存储过程。经典的ASP/VBscript错误(无效的字符)

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

错误

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 
%> 
+2

'声明@ serial varchar(255)'是SQL语法。 ASP不理解SQL语法。 – Tomalak 2015-03-13 11:28:32

+0

摆脱不是唯一问题的'@',调用OpenRecordSet(stock,“Exec sp_report_simon_test @serial”)'也不会工作。 – Fred 2015-03-13 11:29:12

+0

第一个错误是变量声明和赋值,应该看起来更像'Dim serial'和 'serial = Request.QueryString(“ID”)'发布'OpenRecordSet'函数,我也会尝试帮助解决这个问题。 – Fred 2015-03-13 11:39:16

回答

2

这是值得称道的,你尝试使用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 

文档:


为了能够使用常量像adCmdStoredProc直接在VBScript代码中,必须通过在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(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"--> 
+0

好的,谢谢@Tomalak,我已经将代码中的“@id”更改为“@serial”,因为这是存储过程中变量的名称。 当我尝试这虽然我得到的另一个错误,虽然 'ADODB.Command错误“800a0bb9” 参数的错误类型,超出可接受的范围内,或在与另一个冲突。 /simon/stock_test.asp,第13行' – chenks 2015-03-13 11:54:14

+0

名称并不重要,SQL Server只关心存储过程中的参数* order *。但是保持一致很好,这就是为什么你应该把你的查询字符串参数重命名为“Serial”。 – Tomalak 2015-03-13 11:57:46

+0

好吧,我已经更改查询字符串参数为“串行”太....在运行时仍然出现错误 'ADODB.Command错误'800a0bb9' 参数的类型错误,超出可接受的范围或彼此冲突。 /simon/stock_test.asp,第13行' – chenks 2015-03-13 12:04:28