2015-03-13 3 views
0

Я получаю следующую ошибку, когда загружаю страницу ASP, вызывающую хранимую процедуру из SQL 2000 с параметром, используемым в момент загрузки страницы ASP.классическая ошибка 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

+0

Избавьтесь от '@', это не ваша единственная проблема: 'Call OpenRecordSet (запас,« Exec sp_report_simon_test @serial »)' тоже не работает. – Fred

+0

Первой ошибкой является объявление переменной и присваивание, которые должны больше походить на «Dim serial» и 'serial = Request.QueryString (« ID »)' Опубликовать функцию OpenRecordSet', и я также попытаюсь помочь с этим. – Fred

ответ

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 

Docs:


Чтобы иметь возможность использовать константы как 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 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

+0

Это не очень важно, SQL Server заботится только о параметре * order * в хранимых процедурах. Но хорошо быть последовательным, поэтому вы должны переименовать свой параметр строки запроса в «Serial». – Tomalak

+0

хорошо, я изменил параметр строки запроса на «serial» тоже ....все еще получая ошибку, хотя при ее запуске 'ADODB.Command error '800a0bb9' Аргументы неправильного типа, находятся в допустимом диапазоне или находятся в конфликте друг с другом. /simon/stock_test.asp, строка 13' – chenks

Смежные вопросы