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
字典,就像填充版本的模板一样(缺少的版本为空)因此,我决定创建两个数组,分别是uniquesvrs
和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()