我最近在ASP中继承了一个我不熟悉的网站。昨天,其中一个页面开始出错:
Microsoft VBScript runtime error '800a0009'
Subscript out of range: 'i'
default.asp, line 19
以下是第13-27行的代码:
<%
set rs = Server.CreateObject("ADODB.Recordset")
rs.open "SELECT * FROM VENDORS_LIST_TBL WHERE inStr('"& dVendorStr &"','|'&ID&'|')", Cn
DIM dTitle(100), dDescription(100), dLink(100)
i = 0 : Do while NOT rs.EOF : i = i + 1
dTitle(i) = rs.fields.item("dTitle").value
dDescription(i) = rs.fields.item("dDescription").value
dLink(i) = rs.fields.item("dLink").value : if dLink(i) <> "" then dTitle(i) = "<a href=""" & dLink(i) & """>" & dTitle(i) & "</a>"
if NOT rs.EOF then rs.movenext
Loop
x = i
rs.Close : Set rs = Nothing
%>
关于这里发生了什么以及如何解决这个问题的想法?
谢谢!
答案 0 :(得分:2)
您已将dTitle,dDescription和dLink声明为大小为100的数组。当您浏览记录集时,您将为这些数组分配元素。看来您的记录集中有超过100条记录,因此逻辑尝试执行以下操作:
dTitle(101) = rs.fields.item("dTitle").value
这会引发错误,因为您的数组不足以保存所有数据。
答案 1 :(得分:2)
您选择的“解决方案”并不是很好。如果在2年内会有超过500个怎么办?你会忘记这一切,再浪费时间。
您可以使用动态数组代替固定大小的数组:
DIM dTitle(), dDescription(), dLink()
ReDim dTitle(0)
ReDim dDescription(0)
ReDim dLink(0)
i = 0
Do while NOT rs.EOF
i = i + 1
ReDim Preserve dTitle(i)
ReDim Preserve dDescription(i)
ReDim Preserve dLink(i)
dTitle(i) = rs.fields.item("dTitle").value
dDescription(i) = rs.fields.item("dDescription").value
dLink(i) = rs.fields.item("dLink").value
If (Not(IsNull(dLink(i)))) And (dLink(i) <> "") Then
dTitle(i) = "<a href=""" & dLink(i) & """>" & dTitle(i) & "</a>"
End If
rs.movenext
Loop
这将从每个数组中的一个(空)项开始 - 由于某种原因,代码似乎需要这个 - 然后在每次迭代时将添加一个项目,保留其他项。
请注意,我还修复了可能导致问题的小问题 - 如果“dLink”字段中出现NULL值,则会在HTML中出现空白锚点,因为在VBScript中NULL不是空字符串。
答案 2 :(得分:1)
这可以用GetRows
来实现同样的目标。
<%
Function VendorSearch(sVendor)
Dim cn: Set cn = SomeLibraryFunctionThatOpensAConnection()
Dim cmd: Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT dTitle, dDescription, dLink FROM VENDORS_LIST_TBL WHERE inStr(?,'|'&ID&'|')"
cmd.Parameters.Append cmd.CreateParameter("Vendor", adVarChar, adParamInput, Len(sVendor), sVendor)
Set cmd.ActiveConnection = cn
Dim rs : Set rs = cmd.Execute()
VendorSearch = rs.GetRows()
rs.Close()
cn.Close()
End Function
Dim arrVendor : arrVendor = VendorSearch(dVendorStr)
Const cTitle = 0, cDesc = 1, cLink = 2
Dim i
For i = 0 To UBound(arrVendor, 2)
If IsNull(arrVendor(cLink, i) Or arrVendor(cLink, i) = "" Then
arrVendor(cTitle, i) = "<a href=""" & arrVendor(cLink, i) & """>" & arr(cTitle, i) & "</a>"
End If
Next
%>
注意:
Server.HTMLEncode
输出所有这些字符串作为标题和描述。