机房收费系统最近才可以敲,不过刚开始,就遇到一个难题。
当我往数据库的表里更新记录时,老是更新不成功,对于更新代码的反复修改,仍旧不能解决问题,这个问题困扰了我接近两天,于是找了几个同学来解决都未果,最终在徐恕的帮助下,找到了原因。罪魁祸首是锁定类型AdLockOptimistic。
我的这个错误属于“打开游标”类型的错误。所以就将这块知识点进行下梳理,希望对大家能有所帮助。
打开游标的语法是:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
现在我就拿我们的机房收费系统里的打开游标的代码来解释一下。
Set rst = NewADODB.Recordset
rst.Open Trim$(SQL),cnn, adOpenKeyset, adLockOptimistic
Source 一般是可选的,包括变量名、SQL语句、表名、存储过程调用或持久Recordset文件名,而我们的代码Trim$(SQL)就是一个SQL语句。
ActiveConnection也是可选的,包括Connection连接对象变量名,比如说我们代码中的Cnn,还包括字符串ConnectionString参数。
CursorType可选的,确定提供者打开RecourdSet时应该使用的游标类型。我们代码里的adOpenKeyset就属于打开键集类型游标,游标类型还包括其它三种:AdOpenForwardOnly(这种一般是默认的)打开仅向前类型游标,AdOpenDynamic打开动态类型游标、AdPenStatic打开静态类型游标。
LockType也是可选的,确定提供者打开 Recordset 时应该使用的锁定类型,如果不进行设置的话,一般默认AdlockReadOnly ,是只读的不能改变数据的,所以一般称为缺省锁定类型;还包括AdlockPessimistic又叫悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录,只要编辑一开始,则立即锁住记录;还有一个与之相对的称为乐观锁定的AdlockOptimistic,用法是直到用Update方法提交更新记录时才锁定记录;还有最后一个批量乐观锁定AdlockBatchOptimistic,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。
对LockType的选择,当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。 对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,数据在这段时间被更新。这减少了资源的使用。
而最后的这个Options,是用户指示提供者如何计算Source参数的,在我们的的系统里没有涉及到,有兴趣的同学可以去了解下。