ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 杂谈 ADO

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-8 08:29 | 显示全部楼层
本帖已被收录到知识树中,索引项:ADO技术
岗纯一郎 发表于 2015-10-7 18:22
楼主可否帮我解决一下问题?
http://club.excelhome.net/thread-1233800-1-1.html

excel 不支持这种操作,建议你用ado 操作access,mysql,sqlserver等。

TA的精华主题

TA的得分主题

发表于 2015-10-8 21:12 | 显示全部楼层
hyefeifei 发表于 2015-10-8 08:29
excel 不支持这种操作,建议你用ado 操作access,mysql,sqlserver等。

Excel 操控Excel我看书上有讲连接的,当然操作数据库的情况比较多些,因目前工作需要,转化为数据库有些困难。

TA的精华主题

TA的得分主题

发表于 2015-10-9 14:01 | 显示全部楼层
好贴,顶你
我用excel 导入 SQL 2008,经常会触发触发器,而且是结果是 SQL 不能保存数据,能有什么办法把触发器禁止掉,程序执行完毕后恢复?

TA的精华主题

TA的得分主题

发表于 2015-10-9 15:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习,受益匪浅!

TA的精华主题

TA的得分主题

发表于 2015-10-9 15:51 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-15 21:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 hyefeifei 于 2015-10-16 09:06 编辑

这个贴子请版主帮忙删除了吧,修改了三次,提交后面目全非,少内容让人看了误会 ,不知是审核出的毛病,还是怎么回事,多谢了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-15 21:36 | 显示全部楼层
本帖最后由 hyefeifei 于 2015-10-15 21:56 编辑

搞不懂一提交格式乱了,且还丢内容,修改后,审核又这么慢

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-16 11:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 hyefeifei 于 2015-10-16 16:39 编辑

之前上传总有错误,再试一次。
第二个题目:ADO如何更新(rst.update)
1. 啥是ADO? 只需知道,ADO通过OLEDB操作数据库即可。
2. 进入正题,请看代码:
  1.       strSQL = "Select * from 表名"
  2.       rst.cursorlocation = adUseClient
  3.       rst.Open strSQL, conn, adOpenStatic, adLockOptimistic
复制代码

⑴ recordset的CursorLocation属性设为adUseClient,意味着临时表在本地。如果设置为adUseServer,临时表则在服务器,此时,本地仅保留少量缓存数据,这个缓存由recordset的CacheSize属性决定。比如:
rst.CacheSize=10
当我们要取第11条记录时,则清空本地缓存,从服务器端再取10条记录,存入本地缓存。而临时表在本地的话,ado一次性把所有记录取到本地,这样做虽然在一次性取数据时用时稍长些,但却可不用总与数据库交互,只需要处理完数据时再提交数据库即可。
我的建议是永远要把临时表放在本地处理,这样才可最大化的利用ado带来的便利。

⑵ strSQL="Select* from 表名",跟据上面所说,要把临时表放在本地,这句SQL语句,即是把所有记录放到本地,当我们用这条sql语句把记录取到本地后,ado就接管了之后的工作,就不再需要sql语句了。

初学者或许会问,如果我的表中有十年的数据,难道都要取到本地吗?当然不是,你只要把可能用得着的数据取到本地即可。所以一般来说,这句应该是这样的:
strSQL="Select * from 表名 where 条件"

⑶ 第3句要讲的是后两个参数,第一个adOpenStatic,意思是静态表,当临时表在本地时,这个参数可随意,因为ado只能把表当成静态表,adLockOptimistic,它的意思是乐观锁定。

3. 现在假如我们把用得着的记录已经取回本地了,且表中有一个字段“币种”,还有一个字段“金额”,我们想把所有币种为人民币的金额都在原有基础上增加1000,该如何做呢?
  1.        rst.Filter = "币种='人民币'"
  2.        Do Until rst.EOF
  3.              rst!金额 =rst!金额 + 1000
  4.              rst.update
  5.              rst.movenext
  6.        loop
复制代码

我们也可以这样:
  1.       Do Until rst.EOF
  2.             rst.Find "币种='人民币'"
  3.             rst!金额 =rst!金额 + 1000
  4.             rst.update
  5.             rst.movenext
  6.        loop
复制代码

假如我们有100条记录符合条件,每修改一条记录时,都用update方法提交给数据库这样我们就与数据库交互了100次,我们可以用乐观批锁定方式一次性提交给数据库,请看代码:
  1. rst.Open strSQL, conn, adOpenStatic, adLockBatchOptimistic   'adlockbatchoptimistic参数,设置临时表锁定方式为乐观批锁定。
  2. rst.Filter = "币种='人民币'"
  3. Do Until rst.EOF
  4.             rst!金额 =rst!金额 + 1000
  5.             rst.movenext
  6. loop
  7. rst.updatebatch
复制代码


4. 我们考虑一下,当程序执行到rst.update时,发生了什么事情呢?假设原来的金额为500,增加1000后,金额就变为1500了,实际上ado是把如下SQL语句提交给了数据库:

update表名 set 金额=1500 where 币种='人民币' and 金额=500 and 序号=xxx   '序号为主键

因为where后面的条件里包括金额=500,所以在执行此条语句之前,正好有其他连到数据库的人先把金额改成了比如800,你再提交这条语句,ADO就会弹出出错提示。这该怎么办呢?

假如别人的修改都不算数,以你的为准,那么你可以在执行rst.update之前,加上这句代码: rst.Properties("Update Criteria") = adCriteriaKey完整代码如下:
  1.      Do Until rst.EOF
  2.              rst!金额 =rst!金额 + 1000
  3.              rst.movenext
  4.      loop
  5.      rst.Properties("Update Criteria") = adCriteriaKey
  6.      rst.updatebatch
复制代码

注意,以上代码需要你的表中有关键字,事实上,虽然sqlserver不强制每张表都要有主键,但实际工作中,你应该给每张表一个主键。
待续......


TA的精华主题

TA的得分主题

发表于 2016-1-15 08:52 | 显示全部楼层
楼主能帮忙解决这个问题吗
我想实现输入要查找的内容后能把外部sql数据库里相应的内容提取出来显示在表格里,比如我在A1输入单号,数据库里这个单号的型号单价姓名地址等等显到A2,A3,A4.....,如何实现?

TA的精华主题

TA的得分主题

发表于 2016-1-17 11:36 | 显示全部楼层
老师,能否帮忙解决一个"[求助] 怎样实现数据分栏按部门汇总分页打印",谢谢!
http://club.excelhome.net/thread-1251329-1-1.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-2 01:31 , Processed in 0.046097 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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