Asp classic 如何将ADODB.Recordset存储在变量中而不是通过引用?

Asp classic 如何将ADODB.Recordset存储在变量中而不是通过引用?,asp-classic,Asp Classic,我有以下代码 Dim rs,SQL Dim svrs, prods Set rs = Server.CreateObject("ADODB.Recordset") SQL = "SELECT * FROM myTable" rs.Open SQL,conn // conn is the connection variable svrs = Array(rs("server_name")) prods = Array(rs("

我有以下代码

Dim rs,SQL
Dim svrs, prods
Set rs = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM myTable"
rs.Open SQL,conn // conn is the connection variable

svrs = Array(rs("server_name"))
prods = Array(rs("product_name"))
rs.MoveNext

For Each item In svrs
    Response.Write item
    Response.Write "<br>"
Next
Response.Write "<br>"

For Each item In prods
    Response.Write item
    Response.Write "<br>"
Next
Response.Write "<br>"

现在,网页上的预期结果应该显示
svr1
prod1
,但我得到的是
server2
prod2
。这对我来说意味着
rs()
正在发送对
rs
变量的引用,因此,当我转到
rs.MoveNext
时,因为我的数组[0]只是对
rs()
的引用,它们的值也会发生变化,这对填充这些数组不利

我想知道的是如何存储ADODB.Recordset,使其不通过引用传递


注意:我应该指出,上面的代码只是完整代码的一个示例。在每个的
MoveNext
之间,我使用循环遍历结果,通过使用
ReDim Preserve
动态扩展,将
svrs
prods
数组填充为唯一值

为每个
执行
时,原始代码给出了一个关于记录集的错误,要么被删除,要么在最后,调试中的上述代码显示第一个值甚至不正确


这是为那些谁

原来的代码是

Dim rs,SQL
Dim svrs, prods, vers
Set rs = Server.CreateObject("ADODB.Recordset")

Set vers = CreateObject("Scripting.Dictionary")

SQL = "SELECT * FROM myTable"
rs.Open SQL,conn 

svrs = Array(rs("server_name"))
prods = Array(rs("product_name"))
vers.Add rs("server_name")&"-"&rs("product_name"),rs("version")
rs.MoveNext

Do While NOT rs.EoF
    If inArray(svrs,rs("server_name")) = false Then
        ReDim Preserve svrs(UBound(svrs) + 1)
        svrs(UBbound(svrs)) = rs("sever_name")
    End If
    
    If inArray(prods,rs("server_name")) = false Then
        ReDim Preserve prods(UBound(prods) + 1)
        prods(UBbound(prods)) = rs("sever_name")
    End If
    
    vers.Add rs("server_name")&"-"&rs("product_name"),rs("version")
    rs.MoveNext
Loop

For Each item In svrs
    Response.Write item
    Response.Write "<br>"
Next
Response.Write "<br>"

For Each item In prods
    Response.Write item
    Response.Write "<br>"
Next
Response.Write "<br>"
注意:是,我使用的是服务器和产品表,在最终版本中使用的是外键,是键是主键

其想法是将数据显示为

        | server    | server    | server    |
---------------------------------------------
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
现在因为我读到将字典放入字典只会放入引用,所以我无法创建一个空的
prods
字典,就像填充版本的模板一样(缺少的版本为空)因此,我决定创建两个数组,分别是unique
svrs
prods
,然后作为循环的基础,用于访问版本的复合字典键

因为(当时)我不知道如何初始化空数组,这样就不会在
inaray
上出错,所以我决定用第一个服务器和产品值创建数组,然后循环附加它们

完成所有这些之后,我想确保我得到了
svrs
prods
的唯一值,所以我进行了循环以输出它们。我犯的错误是

ADODB.字段错误“80020009”

BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录

/myFile.asp,第0行

为了测试以确保它不是我的
Do While
循环,我移除了输出循环,并且我没有得到错误,所以我移除了
Do While
循环,并将其放回输出循环,怀疑如果我的数组(应该有第一个元素)实际上将裁判控制在
rs
,因此在解释我得到的ADODB错误时,我不会看到表中的第一个值,而是第二个值


因为我不能从开发人员的机器上登录,所以我在工作场所的何处或插入USB设备来复制代码,我不得不重写它,所以我在另一台机器上以最小可验证代码的形式编写了它,然后我对它进行了测试,得到了与预期相同的错误结果。删除
Do While
和表的更改是为了删除不相关的因素(如前所述,我用重写的缩减代码得到了相同的错误结果)

您需要做的就是使用字段的而不是字段本身

svrs=Array(rs(“服务器名称”).Value)
产品=阵列(rs(“产品名称”).值)

您需要做的就是使用字段本身,而不是字段本身

svrs=Array(rs(“服务器名称”).Value)
产品=阵列(rs(“产品名称”).值)

由于没有明确设置数组的大小,因此在向数据添加新记录之前,需要保留数组中以前的任何数据。您可以使用REDIM PREVICE执行此操作:

Dim rs、SQL、计数器:计数器=0
Dim svrs()
Dim prods()
Set rs=Server.CreateObject(“ADODB.Recordset”)
SQL=“从myTable中选择*
“--因为您只从数据库中获取数据,所以不必担心管理游标,这意味着使用set rs=conn.Execute(sql)更有效
设置rs=conn.Execute(sql)
做而不做
重拨保留SVR(计数器)
Redim保存产品(计数器)
svrs(计数器)=rs(“服务器名称”)
产品(计数器)=rs(“产品名称”)
下一个
环
对于SVR中的每个项目
回答。写下项目
响应。写入“
” 下一个 响应。写入“
” 对于prods中的每个项目 回答。写下项目 响应。写入“
” 下一个 响应。写入“
说到这里,有没有什么特别的原因让你有两个独立的数组而不是一个二维数组?如果您只需要一个数组,那么只需使用它将记录集数据传输到一个数组中就会容易得多:

set rs = conn.Execute( sql )
dim arr2D = rs.GetRows()

现在,您的所有数据都在一个数组中,不再需要两个不同的数组,并且可以跳过Do-While循环。

因为您没有明确设置数组的大小,所以在向数据添加新记录之前,需要保留数组中以前的任何数据。您可以使用REDIM PREVICE执行此操作:

Dim rs、SQL、计数器:计数器=0
Dim svrs()
Dim prods()
Set rs=Server.CreateObject(“ADODB.Recordset”)
SQL=“从myTable中选择*
“--因为您只从数据库中获取数据,所以不必担心管理游标,这意味着使用set rs=conn.Execute(sql)更有效
设置rs=conn.Execute(sql)
做而不做
重拨保留SVR(计数器)
Redim保存产品(计数器)
svrs(计数器)=rs(“服务器名称”)
产品(计数器)=rs(“产品名称”)
下一个
环
对于SVR中的每个项目
回答。写下项目
响应。写入“
” 下一个 响应。写入“
” 对于prods中的每个项目 回答。写下项目 响应。写入“
” 下一个 响应。写入“
        | server    | server    | server    |
---------------------------------------------
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
set rs = conn.Execute( sql )
dim arr2D = rs.GetRows()