Private Sub Form_Load()
Dim cnn As ADODB.Connection
Dim ObjRS As ADODB.Recordset
Dim ssql As String
Dim strCnn As String
Dim strID As String
dim x as Integer
dim total,total2 as double
'Open ADO connection
strCnn = "driver={SQL Server};database=test;server=192.168.1.252;UID=nmkspro;PWD=123;"
Set cnn = New ADODB.Connection
cnn.Open strCnn
Set ObjRS = New ADODB.Recordset
for x=0 to x<100
  ssql = "SELECT sum(fs) as total2 FROM TABLE1 where 班号=x"
  ObjRS.Open ssql, cnn
  total1=total2+total1
  ObjRS.close
  set ObjRS=nothing
next x
msgbox total1
End Sub请问如果TABLE1的数据量有上百万条记录,在循环内每次 ObjRS.Open 都要ObjRS.CLOSE ,是不是速度会很慢,如果每次循环一定要做重新查询,除了重新打开表,还有别的办法解决吗?

解决方案 »

  1.   

    ObjRS.Filter = "状态 = '正在购物' and 销售单号 = '" & DataGrid1.Columns(0).Text & "'"
    看看他可以减少点
      

  2.   

    ssql = "SELECT sum(fs) as total2 FROM TABLE1 where 班号>=0 and 班号<100 group by 班号"while not rs.eof 
    ...
      

  3.   

    奇怪,最后目的是要拿到总数,为什么还要循环然后相加?
    ssql = "SELECT sum(fs) as total2 FROM TABLE1"
    ObjRS.Open ssql, cnn
    msgbox ObjRS!total2
      

  4.   

    ssql = "SELECT sum(fs) as total2 FROM TABLE1 where 班号>=0 and 班号<100 group by 班号"
      

  5.   

    我是意思是一定要在循环内改变查询语句,而且重新执行查询语句,因为循环内要做很多的处理;上面的原码只是随便举例的,并不是简单的统计一个数。这样除了重新OPEN还有什么办法?
      

  6.   

    这个方法供参考,我不确定它的速度会比较快。
    for x=0 to 99
      strSQL = strSQL & "SELECT sum(fs) as total2 FROM TABLE1 where 班号=" & x & ";"
    next x
    rst.open strSQL, cnn, , , adCmdText
    do until rst.State = adStateClosed
        total1 = total1 + rst!total2
        set rst = rst.NextRecordset
    loop
    msgbox total1
      

  7.   

    谢谢楼上的兄弟,效果真的比每次去OPEN、CLOSE快很多,很明显。