本帖最后由 hyefeifei 于 2015-10-16 16:39 编辑
之前上传总有错误,再试一次。 第二个题目:ADO如何更新(rst.update) 1. 啥是ADO? 只需知道,ADO通过OLEDB操作数据库即可。 2. 进入正题,请看代码: - strSQL = "Select * from 表名"
- rst.cursorlocation = adUseClient
- 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,该如何做呢? - rst.Filter = "币种='人民币'"
- Do Until rst.EOF
- rst!金额 =rst!金额 + 1000
- rst.update
- rst.movenext
- loop
复制代码
我们也可以这样: - Do Until rst.EOF
- rst.Find "币种='人民币'"
- rst!金额 =rst!金额 + 1000
- rst.update
- rst.movenext
- loop
复制代码
假如我们有100条记录符合条件,每修改一条记录时,都用update方法提交给数据库这样我们就与数据库交互了100次,我们可以用乐观批锁定方式一次性提交给数据库,请看代码: - rst.Open strSQL, conn, adOpenStatic, adLockBatchOptimistic 'adlockbatchoptimistic参数,设置临时表锁定方式为乐观批锁定。
- rst.Filter = "币种='人民币'"
- Do Until rst.EOF
- rst!金额 =rst!金额 + 1000
- rst.movenext
- loop
- 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完整代码如下: - Do Until rst.EOF
- rst!金额 =rst!金额 + 1000
- rst.movenext
- loop
- rst.Properties("Update Criteria") = adCriteriaKey
- rst.updatebatch
复制代码
注意,以上代码需要你的表中有关键字,事实上,虽然sqlserver不强制每张表都要有主键,但实际工作中,你应该给每张表一个主键。 待续......
|