|
楼主 |
发表于 2016-4-22 15:03
|
显示全部楼层
本帖最后由 hyefeifei 于 2016-5-16 15:08 编辑
下面简单讲一下upEmp的代码,先插点题外话,说几句错误处理,我之前的贴子里推荐并提供下载了二本书,一本为《Excel专业开发》,另一本为《VBA高级开发指南》,这两本书里都提供了复杂的错误处理代码,拷过来就可以用,大家可以找找。示例代码(upEmp)中仅做了简单的错误处理,为使初学者明白,说明见图:
下面开始摘要讲一下sub upEmp程序:
1. Open strSQL, Conn, adOpenStatic, adLockOptimistic, adCmdText
当程序执行完这句时,value, OriginalValue, UnderlyingValue三个属性的值均已经确定,为1100。
2. rst.Properties("Update Resync") = adResyncConflicts
Recordset有一个属性集合Properties,这个集合中的属性来自于:
a: 当使用客户端临时表时,即cursorlocation值为aduseclient时,临时表引擎提供的属性。
b: 当你连接不同的数据库时(sqlserver,oracle,access等),不同的数据库各自支持的属性。
Properties集合中有一个Update Resync属性,它来自于a,值可以是下表中的常量:
常量 | 值 | 描述 | adResyncNone | 0 | 修改后不取回数据 | adResyncAutoIncrement | 1 | 默认值,取回新记录的自动增加字段的值 | adResyncConflicts | 2 | 取回由于开放式更新冲突导致更新失败的记录的基本值 | adResyncUpdates | 4 | 向数据库递交更新后,取回这些记录的当前内容 | adResyncInserts | 8 | 向数据库递交新记录后,取回它们的当前内容 |
|
这里我们用的是红字处的值,作用下面会讲到。
3. !sal = !sal + 500
当程序执行到这句时,value的值变为1600,OriginalValue, UnderlyingValue的值还都为1100。
4. .Update
当程序执行到这句时,ado会拿 UnderlyingValue 的值,与此刻数据库sal字段的值去比,如果之前没人修改过数据库sal字段的值,则顺利更新数据库。
如果假如有人提前把数据库这个字段的值改为了1700,那么UnderlyingValue的值1100就会与数据库的值不同,此时会发生什么?
这个时候,ado会提示错误信息,错误信息见前面的贴图,同时ado还会在数据库上执行 select * from emp where empno=7876并返回数据。
当执行完select * from emp where empno=7876后,此时UnderlyingValue的值变为1700,与数据库端的值相同了。
5. 看这句:'rst!sal.Value = rst!sal.Value - rst!sal.OriginalValue + rst!sal.UnderlyingValue
你看这句是被注释掉的,所以直接执行下句Resume,然后会跳到.Update,此时因为Underlyingvalue的值为1700,与数据库端的值是相同的,所以会顺利更新数据库,数据库端的sal值会被更新为1600。
假如天不凑巧,此时此刻有人又先你一步把数据库端的值由1700改为了1800,会发生什么?这你自己去想。
假如这句没被注释掉,会发生什么?
现在我们看一下此时三个属性的值 value:1600,OriginalValue:1100,UnderlyingValue:1700
所以这句执行完,rst!sal.value的值会变为1600-1100+1700即2200。也就是说,不管别人怎么修改此人的工资,我都会再此基础上给此人加500元工资。
这句执行完,会跳到.Update,执行完后,数据库端的sal值修改为2200。
待续.............. |
|
|