我用类似下面的程序测试ado
for i=0 to rs.recordcount-1  strSql = "select * from xxx where personno='" & rs!personNo & "'"
  Set rs1 = New ADODB.Recordset
  rs1.CursorLocation = adUseClient
  rs1.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdText  Set rs2 = New ADODB.Recordset
  rs2.CursorLocation = adUseClient
  rs2.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdText  If rs2.RecordCount < 1 Then rs2.AddNew
  rs2("PersonNo") = rs1("PersonNo")
  rs2("PersonID") = rs1("PersonID")
  rs2("Photo") = rs1("Photo")  '是一张图片
  rs2.Updatenext结果是1000条记录左右速度还可以,此后越来越慢,查看资源使用情况CPU使用接近100,内存使用越来越多.
是不是ado效率太低,没释放内存,不知如何提高效率?

解决方案 »

  1.   

    你申请的对象rs1,rs2没有释放掉,这样写试试:
    Set rs1 = New ADODB.Recordset  
    Set rs2 = New ADODB.Recordset
    for i=0 to rs.recordcount-1  strSql = "select * from xxx where personno='" & rs!personNo & "'"  rs1.CursorLocation = adUseClient
    if rs1.state=1 then rs1.close
      rs1.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdText
      rs2.CursorLocation = adUseClient
    if rs2.state=1 then rs2.close
      rs2.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdText  If rs2.RecordCount < 1 Then rs2.AddNew
      rs2("PersonNo") = rs1("PersonNo")
      rs2("PersonID") = rs1("PersonID")
      rs2("Photo") = rs1("Photo")  '是一张图片
      rs2.Updatenext
    rs1.close
    rs2.close
    set rs1=nothing
    set rs2=nothing
      

  2.   

    不是ADO的问题,是你的问题。
      

  3.   

    rs1与rs2查询出的结果一莫一样吧?不知道你的目的是什么??有这样写的必要吗
    况且你的2个查询又都写在循环里面,不慢才怪,特别是还有图片!!
    即使rs1,rs2都要用,但是放在循环里每次去定义有必要吗?放在循环外一次定义即可
      

  4.   

    救命阿
    rs1.close
    rs2.close
    set rs1=nothing
    set rs2=nothing
    这样也不行!!!
      

  5.   

    照你的处理方法,不但是慢,而且是特慢.根本不关ADO的事.直接用更新语句不是更好吗?下面是SQL的写法,ACCESS与这个有所区别.你最好写出表结构及目的,然后考虑直接用一条语句更新,速度肯定很快.update 表1 set PersonNo=b.PersonNo
      ,PersonID=b.PersonID
      ,Photo=b.Photo
    from 表1 a inner join 表2 b on  a.personno=b.personNo
      

  6.   

    楼上的,不同数据库之间不能这样写SQL的,何况是在VB环境下
      

  7.   

    ACCESS与SQL均支持与其他数据库之间的数据交换.
      

  8.   

    '而且你的代码这样改,应该效率会高一些,当然,我只是根据你给出的代码片断做出判断,可以这样修改:strSql = "select * from xxx"
    Set rs1 = New ADODB.Recordset
    rs1.CursorLocation = adUseClient
    rs1.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdTextSet rs2 = New ADODB.Recordset
    rs2.CursorLocation = adUseClient
    rs2.Open strsql, strcon1, adOpenStatic, adLockOptimistic, adCmdTextfor i=0 to rs.recordcount-1
      rs1.filter="personno='" & rs!personNo & "'"
      rs2.filter="personno='" & rs!personNo & "'"  If rs2.RecordCount < 1 Then rs2.AddNew
      rs2("PersonNo") = rs1("PersonNo")
      rs2("PersonID") = rs1("PersonID")
      rs2("Photo") = rs1("Photo")  '是一张图片
      rs2.Updatenext