簡體   English   中英

Microsoft VBScript運行時錯誤'800a0009'

[英]Microsoft VBScript runtime error '800a0009'

我最近在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
%>

關於這里發生的事情以及如何解決它的任何想法?

謝謝!

您已經將dTitle,dDescription和dLink聲明為大小為100的數組。遍歷記錄集時,正在為這些數組分配元素。 似乎您的記錄集中有100多個記錄,因此邏輯嘗試執行以下操作:

dTitle(101) = rs.fields.item("dTitle").value

這將引發錯誤,因為您的數組不足以容納所有數據。

您選擇的“解決方案”不是很好。 如果兩年內將超過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中將出現空白錨,因為NULL在VBScript中不是空字符串。

通過這種方式,可以使用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

%> 

筆記:

  • Select語句僅包含結果中所需的那些字段,應避免使用*
  • 使用參數化的命令可避免來自SQL聯系人的SQL注入威脅。
  • 用於將字段索引到所得二維數組中的常量。
  • 盡管此代碼復制了標題值的原始內容,但此處僅作為示例。 實際上,應該盡可能晚地構建HTML,並且在發送到響應之前,應通過Server.HTMLEncode傳遞所有諸如標題和描述之類的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM