我有以下代码
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
现在,网页上的预期结果应显示为svr1
和prod 1
,而是显示server2
和prod 2
。这对我来说建议rs()
正在发送对rs
变量的引用,因此,当我去rs.MoveNext
时,因为我的数组[0]只是对rs()
的引用他们重视改变,这对于填充这些数组是不利的
我想知道的是如何存储ADODB.Recordset以便它不会被引用传递
注意:我应该指出上面的代码只是完整代码的一个示例。在MoveNext
和For Each
i之间,然后使用循环通过使用svrs
展开来仅使用唯一值填充prods
和ReDim 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个的唯一svrs
和prods
值的数组,然后用作循环的基础来访问版本的复合字典键。< / p>
因为(当时)我不知道如何初始化一个在inArray
上没有错误的空数组我决定使用第一个服务器和产品值创建数组,然后通过追加循环它们。
完成所有这些后,我想确保我获得svrs
和prods
的唯一值,所以我做了循环输出它们。我得到的错误是
ADODB.Field错误'80020009'
BOF或EOF为True,或者当前记录已被删除。请求的操作需要当前记录
/myFile.asp,第0行
测试以确保它不是我的Do While
循环我删除了输出循环并且我没有得到错误所以我删除了Do While
循环并放回输出循环怀疑如果我应该拥有第一个元素的数组实际上是将裁判保持到rs
并因此解释了我得到的ADODB错误,那么我就不会看到表中的第一个值而是第二个< /强>
因为我无法从开发者机器登录到我在工作场所的位置或插入USB设备来复制代码我必须重写它所以我把它写成最小可验证代码在另一台机器上,然后我测试并得到了与我期望的相同的错误结果。删除Do While
和表的更改是为了删除不相关的因素(即,如所述,我在重写的减少代码中获得了相同的错误结果)
答案 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循环。