NextRecordset 和 GetRows 双簧合奏
NextRecordset 和 GetRows 大家可能用的很少!
( H/ J8 H& |& L; L1 k5 F; l' N最近使用使用,不错的好东东!7 L6 l3 `+ J) V3 J- r
对提高批量查询,查询纪录集不是巨海量的情况很有效果
1 }4 y, l5 X6 \$ O6 E( k2 g. SNextRecordset 和 GetRows 是Recordset的两个属性(属性还是方法我是常混淆是非#$#$,弄不清四下五除一) ' b1 Z+ B6 k1 {' A7 q
( F) k$ t9 O2 T/ ^$ W1 ~
5 B8 N% F+ ]! i
5 F/ f8 H! q9 d& E# |# pGetRows --- 将recordset记录集提取到一个二维数组中,我们对recordset数据的行为就转移到该数组,可以早早的断开纪录集,不用再使用元数据操作,rs.movnext, while not rs.eof等可以省掉 % w1 X5 R* m. m6 a& [9 t9 B+ m
3 l) \" @# _- c* y- q+ HNextRecordset ---- 就是在一次提交多个查询,形成多个reordset结果集的情况下,提供一个离开当前工作的recordset,转移到第二个recordset的方法!6 |/ b9 A1 \7 E. v, {8 y1 V
主要是用在多个SELECT形成的结果集的情况 , j; k; Y% D/ l' \ x2 Y4 Q- E
' x# B0 C7 R! T" G* h+ A+ |. j
示例如下:
5 y# ~" n. r+ Q. y# H* h
8 |5 R& n) B) X3 {' M0 ^dim SQL,Rs,arrA,arrB,rowsA,rowsB
5 c9 k9 a0 P' _7 A# e/ c8 k! U
7 N" I# E$ z9 @8 O8 I'======提取数据库库记录====
9 o& F% m+ n, P0 @( m. s4 f- m$ M S. `' i0 P8 p- l
(adodb.connection 的连接部分省略,假定CONN.open CONNstr)- c9 Q4 @) y# z: U/ g
SQL=" select Ca1,Ca2,Ca3,Ca4 from TableA " '---------------SELECTa
& E" f! ^. x @: }0 }1 ZSQL=SQL" select Cb1,Cb2,Cb3,Cb4,Cb5 from TableB " '-------------SELECTb
% c! S2 J' E7 K5 c- O; _ m$ S9 |' Q
Set Rs=conn.execute(SQL) , o7 _9 F9 Q5 I! d# y z) L
'执行结果将有两个select 的结果集,当前第一个select的recordset处于激活状态
% d2 V3 h8 c6 K$ T. K" }
* g6 i- _% ?9 t2 x5 CarrA=rs.GetRows '----------取得SElECTa Recordset的二维数组 . M! u' U: t ^: O
: a2 l( h8 `2 b" }
set rs=rs.NextRecordset # l! r. s1 t4 g, n9 V' c9 A
'------------最关键的一步,使用Nextrecordset激活下一个recordset + t2 K5 R& d2 Z3 y
- ^' C( c: _, P( w
arrB=rs.GetRows '----------再次取得第二个SElECTb Recordset的二维数组 ! ]6 K4 g( x$ L" {- y' x
4 p; N+ _6 R9 e) YRs.close, f# c! L3 `7 m
set rs=nothing '---------尽早释放数据库对象,关闭记录集
- P- Q8 p" h9 ^, @! TCONN.close
2 u# L" ]$ V! a+ X" Cset CONN=Nothing
3 J$ a- A6 p, s6 W6 E6 I/ h2 J这样,我们所有关于数据库的数据干干净净的提取完成,用最早的时间释放数据库资源 2 r T3 r, p# {7 ~; e8 N& O+ {) x# _
'-----------// 9 n/ _" N6 r/ a3 X2 c$ |8 s
% F7 e1 {# _4 W5 s; ], ~
'========用取得的arrA arrB进行页面处理,显示数据结果======
$ S& Q2 ] C( Z3 z, d4 k j7 C R; e'注意,arrA=GetRows 后得到的数组,第一维是代表列,第二维代表行
: `( M. W6 k4 ?- N1 j: D
4 Y3 ]$ n/ ]+ B4 x. V' Y; }5 w* ]rowsA=ubound(arrA,2) '----提取arrA的第二维下标,相当于取得recordset 的记录行数' U; ~( X7 m/ ~' i4 C* \2 R) i& v
rowsB=ubound(arrB,2) '-----同上,提取arrB的第二维下标
4 d$ U3 L7 m" N1 j6 V1 S) i
3 n8 n2 E/ A" K; ]; ~'做数据循环: ) h2 T1 H; X- J" ?" Y! _9 \
" u4 a4 G6 X" X1 W0 T
'第一个select表的循环( D }) C3 L! P
response.write "table"
/ f6 P4 j7 | F n4 B5 j6 cFor i=0 to rowsA
" X* Z2 {9 @! f2 A( x6 q1 qresponse.write "tr+ b# x1 i- w$ z Z( j4 G+ z
response.write "td"arrA(i,0)"/td" 'tableA.Ca1
+ j( @2 t8 S# A6 Qresponse.write "td"arrA(i,1)"/td" 'tableA.Ca2
! L4 p* p; K& i, B3 |: Z0 n6 Qresponse.write "td"arrA(i,2)"/td" 'tableA.Ca3
6 k1 }3 M2 x" m% h2 n- zresponse.write "td"arrA(i,3)"/td" 'tableA.Ca4
# y' r" r4 l9 n. {response.write "/tr"
5 e9 p$ a5 d' b" s$ {Next
9 W' z7 O8 f6 t" @+ P% G# ?response.write "/table
) K: o. ?2 \+ e1 Z6 c) z7 N
+ \8 a) c- b6 y'第二个select表循环( q3 X. [9 m, J/ [
response.write "table"6 T8 G1 \, [0 c' I* Q$ @
For i=0 to rowsB. m9 P( z# A* H7 D# Q
response.write "tr
/ Z1 g q$ x B2 Nresponse.write "td"arrB(i,0)"/td" 'tableB.Cb1
% i( c8 D, F. h/ F- Z: Mresponse.write "td"arrB(i,1)"/td" 'tableB.Cb2
5 |, o2 o q( Zresponse.write "td"arrB(i,2)"/td" 'tableB.Cb3
6 L( X4 O. G6 M8 D, N9 i2 U1 Vresponse.write "td"arrB(i,3)"/td" 'tableB.Cb4 $ V1 F! v1 C- ~& n/ n3 l
response.write "td"arrB(i,4)"/td" 'tableB.Cb5
' I. H Y" c7 x+ Kresponse.write "/tr") E+ [; Y5 t, q6 ?$ Y
Next
" \* w# M5 x m; @$ Sresponse.write "/table 8 d: C+ B! J8 I0 g/ B
! Z7 ~' W9 }) T$ d' x' Z'--------OVER
" O' D3 }; c. I$ A. c4 v: ]/ @2 O! N4 V
REM '============小结======== & \1 T' o+ Q& s" ~# U }/ i, r
( H/ ]+ `' A) H+ Q* n: F4 ]. W. B
这样的结果,再清楚不过!
) X1 c2 J3 {8 f% p1 d1 B* G1 l(1)使用Nextrecordset,可以处理多个select语句一次发送形成的结果集,减少网络流量,必定加快速度!
9 x4 U/ k2 c& f$ O, M- e不使用NextRecordset 则会这样操作:$ |: J( }; G. r1 T/ M
SQL="select Ca1,Ca2,Ca3, Ca4 From TableA "
3 I' Y0 ]; S5 E* G9 yset Rs=CONN.execute (SQL)7 H- C `. c) e5 l& ~) [! ?
SQL=" select Cb1,Cb2,Cb3,Cb4,Cb5 from TableB "
( B" \" o, k W, D6 f( fSet Rs=CONN.execute (SQL), F d9 g/ S% w" o4 n4 W$ J0 S( l
(2)使用GetRows将记录集提取到数组中(放到内存,所以要求记录集不要海大啦)
. x$ g2 F$ c, {( h用内存的数组工作,而且省掉EOF,movenext等的判断,谁更快!自不必说!' a- i8 k6 q4 p$ p
(3)最最主要的,我们利用上二者,一次性将所有的数据提完,快速断开数据库连接和摧毁建立recordset数据库对象,大大减少网络流量!性能自然要提高很多!
# K/ O- n7 E0 e: _) L
3 ]$ j3 O+ X4 W# y; y'-----------呵呵!及时原创,初浅晦色,见谅见谅"""""""V37
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹