如何通过引用将ADODB.Recordset存储在变量中?

时间:2018-01-31 05:20:19

标签: 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("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>"

以及myTable is

的架构
server_name | product_name
--------------------------
svr1        | prod 1
server2     | prod 2
server2     | prod 3

现在,网页上的预期结果应显示为svr1prod 1,而是显示server2prod 2。这对我来说建议rs()正在发送对rs变量的引用,因此,当我去rs.MoveNext时,因为我的数组[0]只是对rs()的引用他们重视改变,这对于填充这些数组是不利的

我想知道的是如何存储ADODB.Recordset以便它不会被引用传递

注意:我应该指出上面的代码只是完整代码的一个示例。在MoveNextFor Each i之间,然后使用循环通过使用svrs展开来仅使用唯一值填充prodsReDim Preserve数组的结果他们动态地。

原始代码在执行For Each时给出了关于记录集的错误被删除或者在结束时,调试中的上述代码显示第一个值甚至不正确。

适用于那些insist you needed more context

的人

原始代码是

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>"

使用myTable is

的架构
key | server_name   | product_name  | version
---------------------------------------------
1   | svr1          | prod 1        | 1.0.2
2   | server2       | prod 2        | 1.0.1
3   | server2       | prod 3        | 1.0.14

注意:是的我正在使用服务器和产品表,并且在最终版本中使用外键,而是键是主键

这个想法是显示像

这样的数据
        | server    | server    | server    |
---------------------------------------------
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |
product | version   | version   | version   |

现在因为我读了here将字典放在字典中只会放入引用中我无法创建空prods字典,就像填充版本的模板一样(缺少版本)空的)所以我决定创建2个的唯一svrsprods的数组,然后用作循环的基础来访问版本的复合字典键。< / p>

因为(当时)我不知道如何初始化一个在inArray上没有错误的空数组我决定使用第一个服务器和产品值创建数组,然后通过追加循环它们。

完成所有这些后,我想确保我获得svrsprods的唯一值,所以我做了循环输出它们。我得到的错误是

  

ADODB.Field错误'80020009'

     

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

     

/myFile.asp,第0行

测试以确保它不是我的Do While循环我删除了输出循环并且我没有得到错误所以我删除了Do While循环并放回输出循环怀疑如果我应该拥有第一个元素的数组实际上是将裁判保持到rs并因此解释了我得到的ADODB错误,那么我就不会看到表中的第一个值而是第二个< /强>

因为我无法从开发者机器登录到我在工作场所的位置或插入USB设备来复制代码我必须重写它所以我把它写成最小可验证代码在另一台机器上,然后我测试并得到了与我期望的相同的错误结果。删除Do While和表的更改是为了删除不相关的因素(即,如所述,我在重写的减少代码中获得了相同的错误结果)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

由于您未明确设置数组的大小,因此需要在向数据添加新记录之前保留数组中的所有先前数据。您可以使用REDIM PRESERVE:

来完成此操作
Dim rs,SQL, counter : counter = 0
Dim svrs()
Dim prods()
Set rs = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT * FROM myTable"
'-- since you're only grabbing data from the DB, you don't need to worry about managing cursors, meaning it's more efficient to use set rs = conn.Execute( sql )
set rs = conn.Execute( sql )

do while not rs.EOF
    Redim Preserve svrs( counter )
    Redim Preserve prods( counter )

    svrs( counter )  = rs("server_name")
    prods( counter ) = rs("product_name")
    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>"

总而言之,您是否有一个特殊的原因,您有2个独立的阵列而不仅仅是2D阵列?如果您只需要一个数组,那么使用GetRows将记录集数据传输到数组会更容易:

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

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