共享数据的锁定--多客户环境下VB数据库编程之(3)

2016-02-19 12:56 11 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享共享数据的锁定--多客户环境下VB数据库编程之(3)吧。

【 tulaoshi.com - 编程语言 】

前一节介绍了对数据访问的一些限制,其中讲到了对表的锁定。这一节将进一步地谈一谈如何实现共享数据的锁定操作。要保护共享数据,可以在用户编辑数据时锁定它。数据被锁定后,任何用户都可以读取它,但仅有一个用户可以修改它。MicrosoftJet可以在以下三种不同的级别上锁定数据:
  
  ·独占模式:阻止其他所有用户访问数据库,这是限制最大的模式,上一节已介绍过。
  ·记录集锁定:即锁定Recordset对象的基本表,用读表锁定、写表锁定或两者都用。
  ·页面锁定:锁定含有正在编辑的数据的页面,其长度为2048个字节(2K)。这是限制最小的模式。
  
  在应用程序中用哪一种模式来锁定对象,主要看所需要的并发级别。例如,如果想使对象在任何时候都可用,则可使用页面锁定,因为它是限制最小的级别。如果应用程序要保证数据库中的大多数或所有数据都可访问,则应选择独占模式,这种模式确保应用程序独占数据库的访问。注意,这三种级别可以结合使用。例如,假定有一个订单系统,则可以用页面锁定来控制订单表的锁定,使订单接收者之间的并发程度最高。在一天结束时用记录集锁定来锁定汇总表,这个汇总表要用汇总数据来更新。最后,可以在夜间使用独占模式来整理数据库。
  
  1.共享模式与独占模式
  
  如前所述,独占模式是打开数据库限制最大的方式,它阻止其他所有用户打开该数据库。这种模式常用于数据库管理或数据库的批量修改,例如修复或整理操作以及改变数据库的结构等。在单用户环境中访问数据库时,通常以独占模式打开数据库,这可以提供更好的性能,因为MicrosoftJet不必对对象进行锁定和解锁,也不必刷新高速缓存器。但是,当在多用户环境中使用应用程序时,通常以共享模式打开数据库。
  
  (1).以共享模式打开数据库
  
  为了实现记录集锁定,必须以共享模式打开数据库。当以共享模式打开数据库时,可能会有多个用户同时对数据库进行访问,在这种情况下,MicrosoftJet将处理各用户间试图编辑相同记录的冲突。前一节中讲过,当用OpenDatabase方法打开数据库时,只要把Options参数的值设置为False,就能以共享模式打开数据库。下面举一个例子。
  
  编写一个Function过程,调用该过程,可以根据需要用共享模式或独占模式打开数据库。过程如下:
  
  FunctionOPenDatabaseX(dbsAsDatabase,strDBPathAsString,blnExclusiveAsBoolean)AsInteger'关闭错误捕获
  
  OnErrorResumeNext'打开strDBPath所指定的数据库。如果blnExclusive为True,则以独占模式打开数据库:否则,以共享模式打开数据库
  
  Setdbs=OpenDatabase(strDBPath,blnExclusiVe)
  SelectCaseErr
  CaSe0:
  OPenDatabaseX=0
  Case3033:
  OpenDatabaseX=3033
  Case3343:
  OpenDatabaseX=3343
  Case3044:
  OpenDatabaseX=3044
  Case3024:
  OpenDatabaseX=3024
  CaseElse:
  OpenDatabaseX=-l
  EndSelect
  EndFunCtion
  
  该过程以共享模式或独占模式打开一个数据库,由参数blnExclusive决定。如果blnExclusive参数为True,则数据库以独占模式打开;否则,数据库以共享模式打开。在该过程中,用错误处理程序来检测错误,并根据过程调用的执行情况返回错误代码。该过程有3个参数,分别为数据库对象变量名、数据库名(包括路径)和模式开关。为了调用这个过程,应先用Dim语句声明一个Database对象变量,然后把这个对象变量和数据库的名字(strDBPath)一起传送给OpenDatabaseX过程。在调用OpenDatabaseX的代码时,应当检查OpenDatabaseX的返回值,看是否有错误发生,然后根据发生的错误采取相应的措施。在窗体上画一个命令按钮,然后在下面的事件过程中调用过程OpenDatabaseX:
  
  PnvateSubCommandl_Click()
  DimaAsInteger
  DimMvDbsAsDatabase
  a=OpenDatabaseX(MyDbs,"c:Vb50iblio.mdb",False)
  SelectCasea
  Case0:
  MsgBox"调用成功"
  Case3033:
  MsgBoxError(3033)
  Case3343:
  MsgBOxError(3343)
  Case3044:
  MsgBoxEnor(3044)
  Case3024:
  MsgBoxError(3024)
  CaseElse:
  MSgBoxError(3024)
  EndSeleCt
  EndSub
  
  OPenDatabaseX过程的返回值是一个整型数,它是调用时产生的错误代码。当返回值为0时,表示调用成功,显示一个信息框。上述事件过程以共享方式打开一个数据库,如果把OpenDatabaseX的第三个参数改为True,则以独占方式打开该数据库。如果在调用时出错,则将返回错误代码,在事件过程中用Error函数显示相应的信息。例如,假定把数据库名改为:e:vb50iblio.mdb。则由于该数据库的路径不对而出错,产生出错信息。
  
  (2).使用只读模式
  
  只读模式是共享模式的特殊形式。当以只读模式打开一个数据库时,不能改变数据库的数据或对象。但是,其他用户可以改变数据,不要把这种模式与在操作系统级以只读模式打开文件相混淆。下面的代码以独占的只读模式打开一个数据库:
  SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",True,True)
  如果以共享的只读模式打开一个数据库,则应使用下面的代码:
  SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",False,True)
  注意,以只读模式打开数据库时,并不禁止共享表类型的锁定或读锁定;因此,以只读模式打开数据库不能防止锁定冲突的发生。限制程序为只读方式的另一种办法是为记录集使用快照,快照类型的记录集总是只读的。当基表中的数据不需要经常修改时,可以使用快照。由于快照存放在内存中,因此其操作比使用表或动态集的相同操作速度要快。但是,由于快照的内存需求和装入内存时要花费一定的时间,最好把快照用于返回记录在200以内的查询中。->

来源:http://www.tulaoshi.com/n/20160219/1602478.html

延伸阅读
空字段的处理 在往SQLServer数据库中添加记录时,每个字段必须给予明确赋值(即在没有给数据表设定缺省规则或给每个字段设定缺省值的情况下),否则便发生错误。因此我用VB编写了一个处理函数,将其放入标准模块,以供相应程序调用。函数首先判断是否给字段赋值,若没有,则根据字段类型的不同赋予不同数值(数字赋零,字符赋空格)。...
长期用VB50进行数据库应用软件的编程,遇到过不少问题,走了不少弯路,也积累了不少经验。在此,将它们做个小结,希望对同样从事VB50编程的朋友有所帮助。 1、在Form_Load事件中不能对Data控件进行控制 如果确实需在窗体被打开时使用Data控件,可在Form_Activate事件中进行控制。由于Activate事件在窗体被激活时发生,就是说在窗体...
标签: vb
DAO(Data Access Object)全称为数据访问对象,它是数据库编程的重要方法之一。DAO的一种面向对象的界面接口,特色为它不是可视化的对象,使用它全部都要靠编码来完成,DAO是设计关系型数据库系统结构的对象类的集合。它提供了完成管理这样一个系统所需的全部操作的属性和方法,包括创建数据库,定义表、字段和索引,建立表间的关系,定位...
从前面的介绍可以看出,可以为各种类型的数据库管理系统编写VisualBasic前端。事实上,使用ODBC驱 动程序,可以建立与几乎任何数据库管理系统连接的应用程序。这一节中,将介绍可以与VisualBasic数据库应用程序一起使用的几种数据库管理系统。 普通的关系数据库管理系统 普通的关系数据库管理系统(RDBMS)一般是指传统的桌面RDB...
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把...

经验教程

856

收藏

97
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部