经典ASP/VBscript错误(无效字符)
当我加载一个ASP页面,该页面使用加载ASP页面时使用的参数从SQL 2000调用存储过程时,我遇到以下错误 我犯了小学生的错误吗?我该如何解决这个问题 错误 页面为stock_test.asp?ID=980028001365274经典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"> <
<!--#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"-->