ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lbpp

[分享] 一句话让程序运行速度提高了几百倍(recordset的CursorLocation属性)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-6-22 14:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:ADO技术
Call 查连接                     '查看数据库是否连接
        
    SQL = " select * from 加工流程表 where 页码='615741'"
   
    Set rs = Nothing
   
    rs.Open SQL, cnn, 1, 1, 1       '打开一个不存在的记录,这时的记录集为空但应有表头!
   
    A = "F:\111"
    If Len(Dir(A)) > 0 Then Kill A  '先清除原文件
    rs.Save A                       '将这个空的记录集保存到本机文件中
    Set rs = Nothing
   
    '打开保存的文件rstSaveFile
    rs.Open A, , 1, 2, 1 '3, 4, 256 'adOpenStatic, adLockBatchOptimistic, adCmdFile
   
    '打开本机文件,查看是否有内容表头之类
    '这时可以打出表头的名称,但总的记录数据为 0
    Debug.Print rs.RecordCount
    For i = 1 To rs.Fields.Count: Debug.Print rs.Fields(i - 1).Name, ",",:   Next

   
   
    '但下面的更新却不成立
   
        For i = 1 To 11
            rs.AddNew
            rs("输入日期") = Now
            rs("班组") = "陈新盛"
            rs("页码") = "615741"   '流程表页码


            rs("机台") = "我"
            rs("下工序") = "试"
            rs("备注") = "下"
            rs("班次") = "再"
            rs("生产人员") = "说"
            rs("生产日期") = CDate("2009-12-1")
            rs("计件小组") = "陈新盛"

            rs("单号") = "12345678"
            rs("序号") = "1000"

            rs("数量") = i
            

            rs("核算班组") = "新"
            rs("计件小组") = "盛"

            rs.Update
        Next
        
        
        '经历了本过程后,文件大小不见增长,
        '再用 rs.Open A,   与开始保存的一样,没有内容增加了


楼主:这是我的试验结果,这样的问题吗?

我的想法是先将一个空的记录集保存出来一个文件,再将这个文件的内容新增
再用
'rs.ActiveConnection = cnn
'rs.UpdateBatch

但前面的步骤就不能处理了,请指教

谢谢

TA的精华主题

TA的得分主题

发表于 2009-6-22 14:33 | 显示全部楼层
连ID列,一共有22列,有些是允许空的,有些是默认值的,必须有值的都在这上面记入了

这有关系吗?

TA的精华主题

TA的得分主题

发表于 2009-6-22 15:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享!慢慢学习……

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-22 16:13 | 显示全部楼层
原帖由 sunsoncheng 于 2009-6-22 14:27 发表
Call 查连接                     '查看数据库是否连接
        
    SQL = " select * from 加工流程表 where 页码='615741'"
   
    Set rs = Nothing
   
    rs.Open SQL, cnn, 1, 1, 1       '打开一个 ...


不好意思,今天太忙来不及测试,回去我去试一下。我粗略看了一下代码,是不是最后还需save一下?

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-23 20:52 | 显示全部楼层
原帖由 sunsoncheng 于 2009-6-22 14:27 发表
Call 查连接                     '查看数据库是否连接
        
    SQL = " select * from 加工流程表 where 页码='615741'"
   
    Set rs = Nothing
   
    rs.Open SQL, cnn, 1, 1, 1       '打开一个 ...


经测试,原因的确和前面分析的一样,当调用update后,其实只对内存中的recordset进行了更新,而没有直接更新文件,需要再执行save,直接省略保存路径后会将数据保存至找开的文件。

将我帖子中的附件中添加下面的代码,可以测试一下。


  1. Sub RstFileSave()
  2.     Dim rsGzb As ADODB.Recordset
  3.     Set rsGzb = New ADODB.Recordset
  4.     With rsGzb
  5.         .Open ThisWorkbook.Path & "\rstSaveFile", , adOpenStatic, adLockBatchOptimistic, adCmdFile

  6.         Sheet1.Range("A1").CopyFromRecordset rsGzb

  7.         .AddNew Array("gh", "xm"), Array("TTTT", "ttt")
  8.         .Update

  9.         .MoveFirst
  10.         Sheet1.Range("E1").CopyFromRecordset rsGzb

  11.         .Save

  12.         .Close
  13.     End With
  14.     Set rsGzb = Nothing

  15. End Sub
复制代码
上面的代码第二次运行时将会发现第一次打开的recordset中已经增加了一条TTTT,ttt的记录,每运行一次会增加一条。

在客户机端的recordset上调用update方法,若使用批更新,则被修改的记录中的改动将保存到缓冲区中,直到调用updatebatch方法才提交到数据库。因此只要使用update来更新recordset中的数据,直到有数据连接的时候,调用一下updatebatch就可以更新数据库了。

[ 本帖最后由 lbpp 于 2009-6-23 20:58 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-6-24 08:27 | 显示全部楼层
后面的SAVE好象是不重要的!

正如楼主讲的,其实内存中已处理了,SAVE只是给人看一下而已

现在的问题是这段:

在客户机端的recordset上调用update方法,若使用批更新,则被修改的记录中的改动将保存到缓冲区中,直到调用updatebatch方法才提交到数据库。因此只要使用update来更新recordset中的数据,直到有数据连接的时候,调用一下updatebatch就可以更新数据库了。

能给个详细的代码吗?      
就是如何将你之前存了的RSSAVEFILE文件的资料存到数据库中?

我试了好多次后,仍然更新不了数据库!
谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-24 19:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 sunsoncheng 于 2009-6-24 08:27 发表
后面的SAVE好象是不重要的!

正如楼主讲的,其实内存中已处理了,SAVE只是给人看一下而已

现在的问题是这段:

在客户机端的recordset上调用update方法,若使用批更新,则被修改的记录中的改动将保存到缓冲区中, ...


按你的要求做了一个示例。压缩包里做了一个示例数据库备份(Sql Server2000),数据库名为lbpp,内有一个表jb,由gh,xm,jb三个字段组成。
示例中 RstSave2File 从数据库中读取数据保存到文件UpdateDbTest中
ReadFile_UpdateDB中将打开UpdateDbTest文件,然后新增一条记录,然后建立连接后更新数据库。

  1. Const sSAVE_FILE_NAME As String = "\UpdateDbTest"
  2. Const sHOST As String = "localhost"
  3. Const sDB_NAME As String = "lbpp"
  4. Const sUSER_NAME As String = "sa"
  5. Const sPASSWORD As String = "!@#lbpp"

  6. Sub RstSave2File()

  7.     Dim cn As ADODB.Connection

  8.     Dim sSqlCommand As String

  9.     sSqlCommand = "select * from jb"

  10.     '建立连接
  11.     Call ConnectDB(cn, SQL_Server, sHOST, sDB_NAME, sUSER_NAME, sPASSWORD)

  12.     Dim rs As ADODB.Recordset
  13.     Set rs = New ADODB.Recordset
  14.     rs.CursorLocation = adUseClient
  15.    
  16.     rs.Open sSqlCommand, cn, adOpenStatic, adLockBatchOptimistic

  17.     rs.Save ThisWorkbook.Path & sSAVE_FILE_NAME

  18.     Set rs.ActiveConnection = Nothing
  19.    
  20.     Call CloseConnect(cn)

  21.     rs.Close
  22.     Set rs = Nothing

  23. End Sub

  24. Sub ReadFile_UpdateDB()

  25.     Dim cn As ADODB.Connection

  26.     Dim rs As ADODB.Recordset
  27.     Set rs = New ADODB.Recordset
  28.     With rs
  29.         .Open ThisWorkbook.Path & sSAVE_FILE_NAME, , adOpenStatic, adLockBatchOptimistic, adCmdFile

  30.         .AddNew Array("gh", "xm", "jb"), Array("3456", "李四", 100.38)
  31.         .Update


  32.         Call ConnectDB(cn, SQL_Server, sHOST, sDB_NAME, sUSER_NAME, sPASSWORD)
  33.         '=============== 恢复连接 ================
  34.         rs.ActiveConnection = cn
  35.         rs.UpdateBatch
  36.         
  37.         
  38.         .Close
  39.     End With
  40.     Set rs = Nothing

  41. End Sub
复制代码



由于没有看到你的代码,找不到具体原因,我的想法是,你新增记录不成功是不是因为你找开的recordset中的记录是来自多张表的,如果那样的话,我想应该是不能新增记录的,这就是在SQL中直接做也是不行的。方便的话把你的代码发一个给我看看,可以发到我邮箱中    litbearpp@gmail.com

demo2.rar

77.29 KB, 下载次数: 96

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-13 15:34 | 显示全部楼层
速度变快的真正原因找到了。
ADO临时表引擎会自动对客户端临时表建立索引,而不对服务器端临时表建立索引,索引对于查找的速度影响是非常巨大的,所以这才是速度变快的真正原因。

[ 本帖最后由 lbpp 于 2009-8-13 15:36 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-8-13 15:52 | 显示全部楼层
虽然我等菜鸟不知道你们在说些什么,但是还是觉得你们的水平——高!高老庄的高!

TA的精华主题

TA的得分主题

发表于 2009-8-13 15:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-19 22:09 , Processed in 0.045577 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表