【问题标题】:Classic ASP extract data from a SQL Database and put it into array经典 ASP 从 SQL 数据库中提取数据并将其放入数组
【发布时间】:2023-03-29 20:12:01
【问题描述】:

SQL Server 2000 中包含两个字段(两个季节的每月苹果数和每月橙子数)的简单表(表 1)。我需要使用经典 ASP 提取这些字段的值并填充两个数组。约束:这些数组已经由一个现成的应用程序定义,我不需要过多接触,因为我是 Classic ASP 的初学者,我可能会做错事。

这些数组的定义如下:

Dim m_arrApples, m_arrOranges

我已成功连接到数据库,提取数据,然后在浏览器中显示(格式化数字)。然而,当我需要将它传输到一个数组中(以便被那个现成的应用程序接管并处理它(以图形格式显示)时,我遇到了一个错误。这是我的代码:

'Open connection with SQL Server
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;server=" & NameServer & ";database=" & DataBaseName & ";uid=" & NameUser & ";pwd=" & DataBasePassword & ";" 

'Open table and all records for further processing 
dim strSQL
strSQL = "select * from " & Table1
Set rst = conn.Execute(strSQL)

'Going through the records in the table and try to get values of each field and allocate them to the array
If rst.BOF And rst.EOF Then
    Response.Write "No data"
Else

i=0

Do While (Not rst.EOF)
i=i+1

'The line below confirms that the data extracted from database is displayed in the browser
'in its primary form (not graph), but that means I did it correctly up to this point 
Response.Write rst("Apples") & "/" & rst("Oranges") & "<br>"

m_arrApples(i)= rst("Apples")         ' THE ERROR IS AT THIS LINE. HERE THE SCRIPT IS STOPPED
m_arrOranges(i)= rst("Oranges")

rst.MoveNext
Loop
End If

错误是:

Microsoft VBScript runtime error '800a000d' 
Type mismatch 

任何提示将不胜感激。

【问题讨论】:

  • 使用动态数组时,您需要使用ReDim Preserve 来定义新大小,如果您已经知道大小,请使用固定数组(如果您知道您将使用 10 个值) Dim m_arrApples(9)).
  • 是的。有效。谢谢!我在哪里相信你的答案?很久没用stackoverflow了……
  • 这不是您使用错误的方法来调整数组大小,而是您没有定义任何数组,无论是动态的、固定的还是其他的。 Lankymart 的回答依赖于 Redim 实际上会将非数组变量转换为数组这一事实,但如果您将数组调暗为数组,您的代码会更容易理解:Dim m_arrApples(), m_arrOranges()
  • @Martha 同老说法,差别不大,只要你ReDim 无关紧要。然而,使用Dim yourvar() 仍然有一个令人信服的理由,那就是IsArray() 将永远是True,因为Dim yourvar 只是一个变量,所以它会返回False - 请参阅Dim output() versus Dim output
  • @Gab2020 那是一条评论,我现在added an answer

标签: arrays asp-classic


【解决方案1】:

使用动态数组时,您需要使用

ReDim Preserve m_arrApples(i + 1)

要增加数组的大小,如果您已经知道大小,请使用固定数组(如果您知道将有 10 个值,请使用 Dim m_arrApples(9)


有用的链接

【讨论】:

    【解决方案2】:

    尝试使用 Recordset 的 Getrows() 方法

    'Create a Recordset
    Dim objRS
    Set objRS = Server.CreateObject("ADODB.Recordset")
    objRS.Open "SELECT * FROM Table1", objConn
    
    'now read the Recordset into a 2nd array
    Dim aTable1Values
    aTable1Values = objRS.GetRows()
    

    然后您可以循环遍历二维数组:

    Dim iRowLoop, iColLoop
    For iRowLoop = 0 to UBound(aTable1Values, 2)
      For iColLoop = 0 to UBound(aTable1Values, 1)
        Response.Write(aTable1Values(iColLoop, iRowLoop) & "<br>")
      Next 'iColLoop
    
      Response.Write("<p>")
    Next 'iRowLoop
    

    更多信息在这里 http://www.4guysfromrolla.com/aspfaqs/ShowFAQ.asp?FAQID=161

    【讨论】:

    • 这不是给你两个单维数组,而是给你一个多维数组,你仍然必须把它分解成两个数组 - “我需要提取那些的值使用经典 ASP 的字段并填充两个数组。约束:那些数组已经定义了"。在您发布之前,OP 也有 already commentedGetRows() 很棒,我一直在使用它,但在这种情况下没有任何好处。
    • 它确实为您提供了数组的大小以帮助进行 redim。
    • @BrianT:嗯,你知道objRS.RecordCount,不是吗?
    • @Martha - 授予,你可以使用它,但你有一个太多了,不是吗? ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多