2015-03-13 87 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