Asp classic 经典ASP结果集-终极困惑!

Asp classic 经典ASP结果集-终极困惑!,asp-classic,Asp Classic,考虑一个来自mysql查询的简单结果集 rs("description") 及 应该被视为同一件事。但是,根据您访问它们的方式,您会得到不同的结果(!!) 直接访问rs(“描述”),系统将返回一个“字段”对象。或者,更重要的是,在调用中直接使用它,将返回一个“Field”对象 将其分配给另一个变量,该对象的值将被分配 mydescription = rs("description") “mydescription”的内容是一个字符串 为什么会有这种差异?在ASP的生命周期中的某一时刻,它们的

考虑一个来自mysql查询的简单结果集

rs("description")

应该被视为同一件事。但是,根据您访问它们的方式,您会得到不同的结果(!!)

直接访问rs(“描述”),系统将返回一个“字段”对象。或者,更重要的是,在调用中直接使用它,将返回一个“Field”对象

将其分配给另一个变量,该对象的值将被分配

mydescription = rs("description")
“mydescription”的内容是一个字符串


为什么会有这种差异?在ASP的生命周期中的某一时刻,它们的工作方式肯定完全相同,那么它们为什么会发生变化,我如何才能将其更改回来?

管理记录集的最佳方法是使用数组。这将大大提高性能。我发现有时候记录集可能像你描述的那样模棱两可,不可靠,速度慢。这样做可以解决您的所有问题:

rsCommon.open "SELECT ID, name FROM tblPeople", adoCon
    arrData = rsCommon.getRows()
rsCommon.close

for i = 0 to ubound(arrData,2)

    response.write(arrData[0][i] & " - " & arrData[1][i] & "<br />")

next
rsCommon.open“从tblPeople中选择ID、名称”,adoCon
arrData=rsCommon.getRows()
rsCommon.close
对于i=0到ubound(arrData,2)
响应.写入(arrData[0][i]&“-”和arrData[1][i]&“
”) 下一个
您实际上在中做了两件不同的事情:

案例1
mydescription=rs(“description”)+“是描述”

以及

案例2
mydescription=rs(“description”)


在案例2中,您正在访问记录集中的对象。在案例1中,您正在访问记录集中的对象,将该对象转换为字符串,并将其与另一个值为
“的字符串连接起来,这是描述”
。这不容易确定,因为在ASP Classic中,强制转换是隐式的。基本上,案例1
mydescription=CStr(rs(“description”)+“是描述”
相同。如果你这样看,很容易看出为什么你没有得到预期的结果。

据我所知,这种行为从未改变过

rs(“description”)始终返回ADO字段对象

恰好(方便地)field对象的默认属性是“.value”属性,在大多数情况下,该属性工作正常

如果您始终希望确保访问的是记录集字段的实际数据,那么您将始终指定“.value”属性。这是确保不会在不需要的地方出现Field对象的最佳方法。如果省略.value属性,则将其交给vbscript和ADO来决定


如果这是vbScript,则
Set
语句意味着设置对象,否则将传递值。可能已经改变了?请尝试使用适当的运算符:
mydescription=rs(“description”)&“是描述”
这样ASP应该将两者都视为字符串,从而执行自动转换。我的问题是……为什么这会停止工作?这是在服务器上运行的代码…不管它有多糟糕。我只是不明白
+
运算符在数字之间使用,所以ASP试图将
rs(“说明”)
转换为数字,当它失败时(或者提前查看它不是数字),它会恢复为其真正的类型,即字段对象。使用
&
操作符ASP应该尝试将值转换为字符串并成功。完全同意-如果我有时间,我会检查整个代码库并更改它,唉,我现在没有。它在列表中,但目前它只需要工作,因为无论我如何使用rs(“描述”),它都会遇到相同的问题。它“曾经”起作用(可能在IIS6上),但现在不起作用了。@Paul也许你应该在db字段描述中查找该值。由于它在一个环境中工作,而不是在另一个环境中工作,唯一的区别可能是数据。当asp进行隐式转换时,数据是非常重要的
mydescription = rs("description")
rsCommon.open "SELECT ID, name FROM tblPeople", adoCon
    arrData = rsCommon.getRows()
rsCommon.close

for i = 0 to ubound(arrData,2)

    response.write(arrData[0][i] & " - " & arrData[1][i] & "<br />")

next