问题二 再查询与事务
1.再查询数据
在多用户应用程序中,如果以可视的形式把数据显示在窗口中,则需要用最新的数据来更新用户的视图。而要获得由其他用户修改了的最新视图,应用程序必须显式地对数据执行再查询操作。为了获得记录集中数据的最新视图,首先应确定记录集是否支持Requery方法。如果ReCordset对象的Restartable属性值为Tme,则可以使用Requery方法来刷新Recordset对象的内容。如果记录集不支持Requery方法,则必须用OpenRecordset方法再次打开记录集。一般说来,重新打开记录集比使用Requery方法要慢一些。下面这个过程,用来测试一个记录集是否可执行再查询。
过程如下:
Function RequeryRecordset(dbs As Database,rst As Recordset) As Integer
On Error Resume Next
注释:能够再查询记录集吗?
If rst.Restartable=False Then
requeryRecordset=-1
EXit Function
End lf
rst.Requery 注释:再查询记录集
Select Case Err 注释:处理所有错误
Case 0
RequeryReCordset=0
EXit Function
Case Else
Err=0
注释:重新打开记录集
注释:使用rstNane来获取SQL
注释:字符串、表或QueryDef的值
注释:记录集最初是基于它们的
Set rst=dbs.OpenRecordset(rst.Name, rst.Type)
Select Case Err
Case0
RequeryRecordset=0
EXit Function
Case Else
注释:不返回错误给调用程序
Err=0
RequeryRecordset=-l
EXit FUnctlon
End Select
End Select
End Function
用上面的过程可以再查询一个指定的记录集。如果再查询成功,则过程返回0;如果程序不能对记录集进行再查询,则重新打开记录集。如果不能重新打开记录集,则过程返回-1。该过程有两个参数,其中参数dbs是一个数据库对象;而rst是一个Recordset对象。为了调用上面的过程,可以在窗体上画一个命令按钮,然后编写如下的事件过程:
Private Sub Command1_CliCk()
Dim Mvdbs As Database
Dim MvTab As Recordset
Set Mydbs=OPenDatabase("c:\dbdir\db1.mdb",dbOpenDynaset)
Set MyTab=Mydbs.OpenRecordset("Tabel1",dbOpenTable)
a=RequeryReCordset(Mydbs,MyTab)
If a=0 Then
MsgBox "再查询成功"
ElSe
MsgBox "不能执行再查询"
End if
End Sub
程序运行后,单击命令按钮,将调用上面的过程,然后根据具体情况显示相应的信息框。在一般情况下,大多数Recordset对象是可重启动的(或者是可以被再查询的),但基于传递查询和没有固定列宽的交叉表查询的Recordset对象例外,不能再查询这些类型的Recordset对象,为了获得数据的最新状态,必须重新打开这些对象。
2.在多用户环境中使用事务
可以用Microsoft Jet事务把更新划分为多个单元,使它能够被当作整体提交或回退。由于事务缓冲区的更新是临时文件,而不是实际的表,所以它们在多用户环境中也是有用的。在多用户环境中,事务的一般用途是:确保用户在变更共享数据时,所看到的共享数据的视图是完整的。例如,假定应用程序正在执行更新数据的代码,而另一个用户又正在生成相同数据的报表。如果更新没有被包装进事务中,则生成报表的用户接收到的数据可能是不一致的。而如果把更新包装进事务中,则可以确保共享数据的其它用户视图在代码结束运行之前不会受到代码的影响。注意,不要使事务保持打开的时间太长。由于编辑事务而产生的所有锁定,在事务被提交或回退之前,将保持锁定状态,这可能会对应用程序的多用户并发产生有害的影响。