日期:2012-02-23  浏览次数:20843 次

引用记录集中域值的最有效方法是什么?

  到目前为止,我都是用名字引用记录集中的域值的。这可能是一种效率很低的方法,因为每次调用都需要查找域。为了证明这一点,下面的测试就要通过记录集中域的集合的指针来引用域(ADO__08.asp):

 'write data
 Do While Not objRS.EOF
  Response.Write( _
  "< TR >" & _
  "< TD >" & objRS(0) & "< /TD >" & _
  "< TD >" & objRS(1) & "< /TD >" & _
  "< TD >" & objRS(2) & "< /TD >" & _
  "< TD >" & objRS(3) & "< /TD >" & _
  "< TD >" & objRS(4) & "< /TD >" & _
  "< TD >" & objRS(5) & "< /TD >" & _
  "< TD >" & objRS(6) & "< /TD >" & _
  "< /TR > " _
  )
  objRS.MoveNext
 Loop

  正如我们所预料的,装载时间的变化很小(差异可能是由于代码上的轻微减少引起的)。但是这种技术在有效显示时间上却带来了明显的减少。

  在下面的例子中,我们将给每个域指定一个单独的变量。这种方法避免了在表格循环内的所有查找( ADO__09.asp ):

 If objRS.EOF Then
  Response.Write("No Records Found")
 Else
  'write headings
  ...
  Dim fld0
  Dim fld1
  Dim fld2
  Dim fld3
  Dim fld4
  Dim fld5
  Dim fld6
  Set fld0 = objRS(0)
  Set fld1 = objRS(1)
  Set fld2 = objRS(2)
  Set fld3 = objRS(3)
  Set fld4 = objRS(4)
  Set fld5 = objRS(5)
  Set fld6 = objRS(6)
  'write data
  Do While Not objRS.EOF
  Response.Write( _
  "< TR >" & _
  "< TD >" & fld0 & "< /TD >" & _
  "< TD >" & fld1 & "< /TD >" & _
  "< TD >" & fld2 & "< /TD >" & _
  "< TD >" & fld3 & "< /TD >" & _
  "< TD >" & fld4 & "< /TD >" & _
  "< TD >" & fld5 & "< /TD >" & _
  "< TD >" & fld6 & "< /TD >" & _
  "< /TR >" _
  )
  objRS.MoveNext
  Loop
  Set fld0 = Nothing
  Set fld1 = Nothing
  Set fld2 = Nothing
  Set fld3 = Nothing
  Set fld4 = Nothing
  Set fld5 = Nothing
  Set fld6 = Nothing
  Response.Write("< /TABLE >")
 End If

  到目前,这种方法形成的结果是最好的。每条记录的显示时间下降成了.45 毫秒。

  现在,所有测试脚本的配置都要求对结果记录集有一些了解。比如说,我们一直在栏标题中给域名编码,单独地引用这些域的值。下面的例子提供了一个动态的解决方案,在域的集合中循环,不仅得到数据,也得到域的标题(ADO__10.asp ):

 If objRS.EOF Then
  Response.Write("No Records Found")
 Else
  'write headings
  Response.Write("< TABLE BORDER=1 >< TR >")
  For Each objFld in objRS.Fields
  Response.Write("< TH >" & objFld.name & "< /TH >")
  Next
  Response.Write("< /TR >")
  'write data
  Do While Not objRS.EOF
  Response.Write("< TR >")
  For Each objFld in objRS.Fields
  Response.Write("< TD >" & objFld.value & "< /TD >")
  Next
  Response.Write("< /TR >")
  objRS.MoveNext
  Loop
  Response.Write("< /TABLE >")
 End If

 可以看到,我们在性能上有一个损失,但是这个方法还是比ADO__07.asp要快一些。

  下面的测试是在最后两个测试之间进行一些折中。通过在一个动态分配数组中保存域的引用,既维持了动态的灵活性,也挽回了一些性能上的损失。

 If objRS.EOF Then
  Response.Write("No Records Found")
 Else
  Dim fldCount
  fldCount = objRS.Fields.Count
  Dim fld()
  ReDim fld(fldCount)
  Dim i
  For i = 0 to fldCount-1
  Set fld(i) = objRS(i)
  Next
  'write headings
  Response.Write("< TABLE BORDER=1 >< TR >")
  For i = 0 to fldCount-1
  Response.Write("< TH >" & fld(i).name & "< /TH >")
  Next
  Response.Write("< /TR >")