?
(一) 多客户环境下VB 数据库编程之Microsoft Jet的多客户模型1.多客户环境下数据库的储存方法。在客户/效力器系统中,应用程序一般分为两种情况:一种是把整个应用程序放到网络效力器上,容许多个用户翻开数据库。在这种情况下,用户可以同享组成应用程序的全部数据库方针,包括存储数据的表。另一种是把应用程序分为两个数据库(双数据库):一个是包括应用程序数据表的后端数据库,另一个是包括应用程序其它方针(查询、窗体、报表、宏和模块)的前端数据库,前端数据库还可以处理暂时方针。后端数据库放到网络效力器上,而前端数据库分发给用户,使来自后端数据库的联接表作为前端数据库方针的基础。在多用户环境中,双数据库方法具有较为显着的优势,因为应用程序不必建立可以够与另一个用户发生冲突的暂时表。因此,在用户工作站上存储前端数据库,可以防止对暂时方针的争用;一起,因为在本地存储静态方针,因此当应用程序工作时,可以使网络通讯量削减到最小。
2.静态部件与动态部件。应用程序中的部件可以归为两类,即静态部件和动态部件。
(1)静态部件:应用程序中相对安稳,即不常常改动的有些。常用的静态部件是组成调用Microsoft Jet宿主程序的动态链接库(.dll)和可实行文件(.exe),例如Visual Basic,Microsoft Access,Microsoft Excel等。此外,应用程序中的部件,如窗体、报表和程序代码等,也归于静态部件。静态部件不常常改动,因此是工作站存储的志向选择。为了获得最佳功用,一般把静态方针安装在本地工作站上。这种情况下,当应用程序的描绘改动时,有必要对本地工作站上的方针进行更新。可是,如果用户工作站的磁盘空间不够用,或许希望能非常好地控制静态部件的改动,则可以把静态部件存储在网络效力器上。这样做会显着添加网络的通讯量和降低应用程序的功用,但可以使应用程序更易于处理。当然,如果可以的话,最好把静态部件存储在用户端。把部件移到工作站上,将会给应用程序的处理带来一些费事。例如,当需要批改应用程序的静态方针时,例如批改表的规划或程序代码,有必要有相应的机制来更新每个工作站上全部受影响的部件。当工作站较多时,这种操作恰当费时费劲。为了处置个疑问,可以运用下两种方法:
・在发起应用程序时检查部件的最新版别。例如,应用程序的发起代码可以把本地数据库中静态方针的批改日期与效力器的中间数据库中的日期进行比照,如果发现效力器方针的日期较新,则自动输入方针的最新版别,使本地数据库坚持最新。
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
・用Microsoft Jet的拷贝功用使方针同步。例如,可以建立数据库的复本并把它们存储在工作站上,然后就可以通过拷贝功用自动使方针同步。“数据库复本”在后面将讲到。
(2)动态部件:是一些文件,由在多用户环境顶用户访问的实习数据组成。这些文件
包括Microsoft Jet数据库(.mdb)文件、外部数据库文件(如 Microsoft FoxPro数据库文件)或存储在数据库效力器上的ODBC数据库文件。和静态部件相同,应用程序动态部件的存放方位相同可以是抉择应用程序全体功用的首要要素。例如,假定把应用程序的数据文件放置在网络效力器上,并且应用程序有必要在没有索引的表中查找一个记载。在这种情况下,Microsoft Jet有必要对整个表进行次第扫描以查找匹配效果,这意味着有必要把整个表从效力器传送到引擎的工作站。当表很大时,这种操作可以需要较长的时辰。一起,因为用户在实行查找时长时辰地等待照应,而网络上许多的通讯还会轮流地降低其他用户的速度,所以这个疑问会更加凌乱。为了减轻这种情况,可以给应用程序要查找的列添加索引。可是,添加索引又可以会添加网络通讯量,并且降低了并发和功用。这便是说,通过网络访问文件显着比在本地核算机上访问文件慢,在多用户环境中结束数据库系统实习上是以牺牲系统功用为价值的。因此,为了减小网络的通讯量,最好将某些应用程序的部件存储在本地工作站上。例如,假定应用程序运用一套存储邮政编码或零件编号表,而这些表不常常改动,则可以把它们移到本地工作站上,以防止网络访问。
3.Microsoft Jet多用户模型。Microsoft Jet多用户数据库应用程序由几个重要部件构成。在每个用户的工作站上都有Microsoft Jet的一个仿制在工作,如果运用双数据库方法,则一般静态部件会驻留在每个用户的核算机上,而动态部件会驻留在网络效力器上。除此之外,多用户应用程序具有下列文件:一个工作组信息文件,它可以会合驻留在网络效力器上,也可以驻留在每个用户工作站上;每个数据库有一个判定信息文件(.1db),它驻留在与数据库相同的文件夹内。
1).工作组信息文件工作组信息文件是一个Microsoft Jet数据库,用来存储用户、组和暗码信息以及用户设置的各种选项信息。在多用户环境中,工作组信息文件的方位是很重要的。可以把工作组信息文件放在每个本地工作站上,也可以把它放在网络效力器上。如果把它存储在本地机上,则有必要在改动安全性设置值时采用必要的进程对它进行更新。2).判定信息文件判定信息文件(.1db)用来存储数据库中全部其时判定记载的信息。在翻开数据库时,如果判定信息文件不存在,则Microsoft Jet数据库引擎会自动建立该文件。Microsoft Jet为每个以同享方法翻开的Microsoft Jet数据库文件建立一个判定信息文件。该文件与翻开的相应数据库同名,但文件名后缀为.1db。例如,与Northwind.mdb相对应的判定信息文件名叫Northwind.1db。判定信息文件与数据库存储在相伺的文件夹中。在数据库关闭时,Microsoft Jet会删去.1db文件。在多用户环境中,则在全部用户都退出应用程序时将其删去。Microsoft Jet支撑下列文件效力器和点对点网络:.Microsoft WindowsNT和Windows95网络.Banyan VINES 5.52.DECnet4.1. LANtastic 5.0. Novell NetWare3.x 和4.x. OS/2 LAN Manager 2.1 和2.2
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
一般来说点对点网络不能极好的满足多用户数据库系统的需要,大多数应用程序需要工作在有专用的文件效力器的网络上。(二) 数据访问控制在单用户环境中,只需一个用户在访问数据,因此应用程序不会发生资源央求冲突。而在多用户环境中,当用户访问数据时,可以会发生冲突。为了处理这些冲突,Microsoft Jet供应了数据访问控制和应用程序的判定效力,以确保在给定的时辰内只需一个用户可以访问数据。数据访问控制用来对数据库的有些或全部进行访问束缚,一般可分为两类,一类是用户束缚,另一类是功用束缚。用户束缚用来阻止某些人(或只容许某些人)检查或批改“活络”数据。例如,在薪酬系统中,大多数人可以检查职工的薪酬,但只需少数人才有权批改实习的薪酬信息。功用束缚只对程序的某个有些起作用,而不管用户是谁。例如,在订单挂号系统中,如果把报价表设为只读方法,则可防止用户随意批改某些项目的报价。 在应用程序中,可以经进程序控制或Microsoft Jet数据库引擎控制来处置束缚。其间程序控制可以施加于程序自身,而引擎级控制则束缚了任何妄图访问数据库信息的程序。
1.互斥地运用数据库。以互斥方法翻开数据库是对数据访问施加的最大束缚,它实习上是以“独占”方法运用数据库。这种束缚可以阻止任何用户或程序访问正在运用的数据库中的信息。因为这种方法的束缚太大,因此只用于那些影响整个数据库的操作,包括:
・紧缩数据库。
・更新整个表(例如用UPDATE查询)。
・通过添加表、字段或许索引来批改数据库的规划。
・处置格外的用户需要(例如传送审计信息)。
在程序代码中,为了以独占方法翻开一个数据库,有必要把OpenDatabase方法的第二个参数设置为True,例如:
Dim oldDb As Database
Dim oldws As workSpace
Set oldDb=oldWs.OpenDatabase("Members.mdb",True,False)
用上面的代码翻开数据库时,如果该数据库未被其它用户运用,则翻开数据库,这样直到关闭之前,该数据库不会被其它用户或程序访问;如果数据库正在被其它用户运用,则回来一个差错。
2.拒绝其它用户或程序访问指定的表。以独占方法翻开数据库后,可以拒绝其它用户或程序访问整个数据库(包括数据库中的每个表)。而对数据访问的一种较轻的束缚则是拒绝其它用户或程序访问由自个程序正在运用的表(即记载集),它实习上是对记载集进行判定。判定记载集的操作通过OpenRecordset方法中的Options参数来结束。我们知道,OpenRecordset方法的格式如下:
方针.OpenRecordset(type,OPtlons,lockedits)
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
其间的options参数用来设置对记载集的判定,该参数可以取多种值,以下两种值用来阻止其它用户对记载集进行读写操作:
1..阻止读(dbDenyRead)
OpenRecordset方法中的dbDenyRead常量用来阻止其它用户检查表中的数据,直到关闭该表中止。当需要更新整个表中的信息时,可以运用这个常量。例如:
Dim rst as Recordset
Set rst=dbs.OpenRecordset(strTable, _
dbOpenTable,dbDenyRead)
2.阻止写(dbDenywrite)
OpenRecordset方法中的dbDenyWrite常量用来阻止其它用户更新表中的数据,直到关闭该表中止。在这种情况下,其它用户可以检查表中的信息,也可以添加新记载,但不能对其进行批改。当需要向表中刺进新记载而又不想批改现有的记载时,可以运用这个常量,它对表和动态集都有用。例如:
Dim rst as Recordset
Set rst=dbs.OPenRecordset(strTable, _
dbOpenTable,dbDenyWrite)
用dbDenyRead和dbDenyWrite可以分别阻止对记载集进行读和写,如果既想阻止读,又想阻止写,则可一起运用这两个常量(用“十”号联接)。例如:
Dim rst as Recordset
Set rst=dbs.OpenRecordset(strTable, _
dbOpenTable,dbDenyRead + dbDenyWrite)(三) 同享数据的判定 前一节介绍了对数据访问的一些束缚,其间讲到了对表的判定。这一节将进一步地谈一谈怎样结束同享数据的判定操作。要保护同享数据,可以在用户批改数据时判定它。数据被判定后,任何用户都可以读取它,但仅有一个用户可以批改它。Microsoft Jet可以在以下三种不相同的等级上判定数据:
・独占方法:阻止其他全部用户访问数据库,这是束缚最大的方法,上一节已介绍过。
・记载集判定:即判定Recordset方针的底子表,用读表判定、写表判定或两者都用。
・页面判定:判定富含正在批改的数据的页面,其长度为2048个字节(2K)。这是束缚最小的方法。
在应用程序顶用哪一种方法来判定方针,首要看所需要的并发等级。例如,如果想使方针在任何时候都可用,则可运用页面判定,因为它是束缚最小的等级。如果应用程序要确保数据库中的大多数或全部数据都可访问,则应选择独占方法,这种方法确保应用程序独占数据库的访问。注意,这三种等级可以联络运用。例如,假定有一个订单系统,则可以用页面判定来控制订单表的判定,使订单接收者之间的并发程度最高。在一天结束时用记载集判定来判定汇总表,这个汇总表要用汇总数据来更新。结尾,可以在夜间运用独占方法来拾掇数据库。
1.同享方法与独占方法
如前所述,独占方法是翻开数据库束缚最大的方法,它阻止其他全部用户翻开该数据库。这种方法常用于数据库处理或数据库的批量批改,例如批改或拾掇操作以及改动数据库的规划等。在单用户环境中访问数据库时,一般以独占方法翻开数据库,这可以供应非常好的功用,因为Microsoft Jet不必对方针进行判定和解锁,也不必改写高速缓存器。可是,当在多用户环境中运用应用程序时,一般以同享方法翻开数据库。
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
(1).以同享方法翻开数据库
为了结束记载集判定,有必要以同享方法翻开数据库。当以同享方法翻开数据库时,可以会有多个用户一起对数据库进行访问,在这种情况下,Microsoft Jet将处置各用户间妄图批改相同记载的冲突。前一节中讲过,当用OpenDatabase方法翻开数据库时,只需把Options参数的值设置为False,就能以同享方法翻开数据库。下面举一个比方。
编写一个Function进程,调用该进程,可以依据需要用同享方法或独占方法翻开数据库。进程如下:
Function OPenDatabaseX(dbs As Database,strDBPath As _
String,blnExclusive As Boolean) As Integer ’关闭差错捕获
On Error Resume Next ’翻开strDBPath所指定的数据库。如果blnExclusive为True,则以独占方法翻开数据库:否则,以同享方法翻开数据库
Set dbs=OpenDatabase(strDBPath,blnExclusiVe)
Select Case Err
CaSe 0:
OPenDatabaseX=0
Case 3033:
OpenDatabaseX=3033
Case 3343:
OpenDatabaseX=3343
Case 3044:
OpenDatabaseX=3044
Case 3024:
OpenDatabaseX=3024
Case Else:
OpenDatabaseX=-l
End Select
End FunCtion
该进程以同享方法或独占方法翻开一个数据库,由参数blnExclusive抉择。如果blnExclusive参数为True,则数据库以独占方法翻开;否则,数据库以同享方法翻开。在该进程中,用差错处置程序来检测差错,并依据进程调用的实行情况回来差错代码。该进程有3个参数,分别为数据库方针变量名、数据库名(包括路径)和方法开关。为了调用这个进程,应先用Dim语句声明一个Database方针变量,然后把这个方针变量和数据库的姓名(strDBPath)一起传送给OpenDatabaseX进程。在调用OpenDatabaseX的代码时,应当检查OpenDatabaseX的回来值,看是不是有差错发生,然后依据发生的差错采用相应的方法。在窗体上画一个指令按钮,然后不才面的工作进程中调用进程OpenDatabaseX:
Pnvate Sub Commandl_Click()
Dim a As Integer
Dim MvDbs As Database
a=OpenDatabaseX(MyDbs,"c:Vb50biblio.mdb",False)
Select Case a
Case 0:
MsgBox "调用成功"
Case 3033:
MsgBoxError(3033)
Case 3343:
MsgBOxError(3343)
Case 3044:
MsgBoxEnor(3044)
Case 3024:
MsgBox Error(3024)
Case Else:
MSgBox Error(3024)End SeleCt
End Sub
OPenDatabaseX 进程的回来值是一个整型数,它是调用时发生的差错代码。当回来值为0时,标明调用成功,闪现一个信息框。上述工作进程以同享方法翻开一个数据库,如果把OpenDatabaseX的第三个参数改为True,则以独占方法翻开该数据库。如果在调用时犯错,则将回来差错代码,在工作进程顶用Error函数闪现相应的信息。例如,假定把数据库名改为:e:vb50biblio.mdb。则因为该数据库的路径不对而犯错,发生犯错信息。
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
(2).运用只读方法
只读方法是同享方法的格外方法。当以只读方法翻开一个数据库时,不能改动数据库的数据或方针。可是,其他用户可以改动数据,不要把这种方法与在操作系统级以只读方法翻开文件相稠浊。下面的代码以独占的只读方法翻开一个数据库:
Set dbsOrdEntry=OpenDatabase ("OrdEntry.mdb",True,True)
如果以同享的只读方法翻开一个数据库,则应运用下面的代码:
Set dbsOrdEntry=OpenDatabase ("OrdEntry.mdb",False,True)
注意,以只读方法翻开数据库时,并不阻止同享表类型的判定或读判定;因此,以只读方法翻开数据库不能防止判定冲突的发生。束缚程序为只读方法的另一种方法是为记载集运用快照,快照类型的记载集总是只读的。当基表中的数据不需要常常批改时,可以运用快照。因为快照存放在内存中,因此其操作比运用表或动态集的相同操作速度要快。可是,因为快照的内存需要和装入内存时要花费一定的时辰,最好把快照用于回来记载在200以内的查询中。(四) 记载集判定用记载集判定可以判定Recordset方针底子表,也可以指定只读或(和)只写访问。记载集判定只能应用于表类型和动态集类型的Recordset方针,页面判定(见下一节)不能应用于快照类型和仅向前类型的Recordset方针,因为它们正本便是只读方针。尽管如此,Microsoft Jet仍供应了同享表读判定和同享表写判定。
(1).翻开记载集。以同享方法翻开数据库之后,可以通过在OpenRecordset方法的oPtions参数中指定不相同的选项来结束记载集判定。为了用判定翻开一个记载集,可按如下进程操作:1.)以同享方法翻开Recordset方针的数据库。2.)用OpenRecordset方法翻开记载集,并把Options参数设置为所需要的判定方法。3.)当Recordset方针的运用结束时,关闭该方针以开释全部记载集级的判定。编写一个Function进程,以独占方法翻开一个表。
Function OpenTableExclusive(dbs As Database,rst As Recordset,strTable As String) As Integer
Set rst=dbs.OpenRecordset(strTable,dbOpenTable,dbDenyRead + dbDenyWrite)
Select Case Err
CaSe 0:
OpenTableExclusive=0
CaSe Else:
OpenTableExclusive=-1
End Select
Err=0
End Function
该进程通过dbDenyWrite 和 dbDenyRead选项常数的组合,以独占方法翻开一个表。如果进程调用成功(回来0),则在Recordset变量被显式或隐式地关闭之前,其它用户将不能访问该表。如果其它用户现已以独占方法翻开该表,或许发生了一个非预期的差错,则该进程回来 -1。为了调用上述进程,可以在窗体上画一个指令按钮,然后编写如下的工作进程:
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
Private Sub Command1_Click()Dim a As IntegerDim MvDbs As Database
Dim MvTabs As Recordset
Set MyDbs=OpenDatabase("C:dbdirdbl.mdb,true)
a=OpenTableExclusive(MyDbs,MyTabs,"Tabel1")
Select Case a
Case 0:
MsgBox "调用成功"
Case Else:
MsgBox "调用犯错"
End Select
End Sub
注意,如果翻开一个Recordset方针时没有指定option:参数值,则Microsoft Jet将运用页面判定。在这种情况下,将以同享方法翻开记载集,并且不阻止其他用户访问记载会合的数据,但它确实判定了其时页中正在批改的数据。
(2).在翻开记载集时检查差错。和以独占方法翻开数据库相同,当对Recordset方针设置确守时,如果判定失利,则会发生差错。如果某个用户以阻止其它用户获得判定的方法翻开了一个Recordset方针,则当妄图判定该Recordset方针时将会发生最常见的差错,即3262,其犯错信息为:“不能判定表XXX;其时正被用户XXX在机器XXX上运用。”。当妄图对不能判定的方针运用OpenRecordset方法时,也会发生这个差错。(五) 页面判定从志向的角度来说,如果能对记载进行判定,则会给多用户程序带来极大的灵活性。可是怅惘的是,Microsoft Jet引擎不支撑实在的记载判定,而是运用页面判定。页面判定只判定包括其时正在批改的记载的页,Microsoft Jet进行访问和判定的页的大小为2K(2048个字节)。在运用页面确守时,其他用户可以读取判定页中的数据,但不能对数据进行批改。在这种判定方案中,每次将判定多个记载,判定的记载的个数取决于每个记载的大小。例如,如果每个记载的长度为230个字节,则每次只能判定9个记载;而如果记载的长度为30个字节,则每次可判定68个记载。
判定方法。页面判定分为两种方法,即保管式判定和开放式判定,它判定了Microsoft Jet怎样对数据进行判定。当编写在页面等级上判定数据的应用程序时,有必要判定要运用哪种判定方法。页面判定可以通过两种方法来设置,即LockEdits特色和OpenRecordset方法中的lockedit5参数。
1.用LockEdits 特色指定判定方法。判定方法可以通过LockEdits特色来指定。该特色可用于各种Recordset方针,包括动态集、快照、表及动态类型的Recordset方针。LockEdits特色是一个布尔值,当把该值设置为True(缺省)时,将对记载集进行保管式判定,即在实行Edit方法时判定2K的页面:如果把该特色设置为False,则对记载集进行开放式判定,即在实行UPdate之前不判定要更新的记载地址的2K页面。如下面的比方:
Dim rstTemP As ReCordset
……
rstTemp.LockEdits=True
说明:a.判定页面后,其它用户不能对正在批改的记载地址页面进行批改,但可以读取判定页中的数据。在其它用户判定页面后,如果再把LockEdits特色设置为True,则会犯错。b.如果把LockEdits特色设置为False,且其它用户已判定页面,则这今后的用户在运用Update时将会犯错。c.当与Microsoft联接的ODBC数据源一起操作时,LockEdits特色被设置为False,即开放式判定。
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
2.用OpenRecordset方法指定判定方法。我们已多次运用过OpenRecordset方法,该方法的格式如下:
Set recordset=object.OpenRecordset(type,options,lockedits)
其间第三个参数,即lockedits,用来指定判定方法或以只读方法翻开记载集。该参数可以取以下5种值:
(1)dbReadOnly:以只读方法翻开记载集。注意,在options参数中也可以运用dbReadOnly,但不能一起运用,否则会发生差错。
(2)dbPessimistic:用保管式判定方法翻开记载集,一旦运用Edit方法,将当即判定正在批改的记载地址的页面,直到实行Update方法后才开释对该页面的判定。
(3)dbOptimistic:用保管式判定方法翻开记载集,在实行Update方法前不判定正在批改的记载地址的页面。
(4)dbOptimisticValue: 依据行值运用开放式并发(仅ODBCDirect工作区)。
(5)dbOptimisticBatch:容许开放式更新(仅ODBCDirect工作区)。
保管式判定和开放式判定。
1).保管式判定。保管式判定也称为绝望判定。设置保管式判定后,只需对某个记载运用Edit方法,就自动判定该记载地址的页面,直到显式地提交或吊销这个记载的改动(例如实行UPdate方法)后,才开释对该页面的判定,并把数据写入文件中。保管式判定是Recordset方针的缺省判定方法。保管式判定的首要利益是,获得判定之后,只需记载还被判定着,就可以防止其它用户批改该记载中的数据,因此不会发生任何判定冲突。另外,因为一个用户不能在另一个用户初步批改记载之后改动它,所以,保管式判定也是确保应用程序读取最新数据的仅有方法。保管式判定的缺点是,在批改和判定该记载的进程中,包括该记载的整个页面都被判定。当确守时辰较长时,可以会给其它用户构成不必要的费事。例如,用户设置保管式判定后,初步批改一个记载,并在记载被断守时辰离开了核算机(例如出去就事),这不只判定了用户正在批改的记载,并且判定驻留在该判定页面内的其它记载,使其它用户长时辰内无法批改页面中的记载。
2).开放式判定。开放式判定也称豁达判定。运用开放式确守时,MicrosoftJet引擎仅在妄图用Update方法提交记载改动时才判定页面,结束更新操作后当即开释对页面的判定。因为判定仅在应用程序妄图提交改动时发生,因此能使判定的时辰最短,使其它用户只在判定收效的较短时辰内不能访问该页面。这是开放式判定的首要利益。开放式判定的缺点是:当用户正在批改记载时,不能确保更新是不是会成功。如果另一个用户改动了第一个用户正在批改的记载,那么依赖于开放式判定的更新将会失利。例如,假定张三和李四正在批改同一个记载,张三初步以开放式判定批改某个客户记载。因为张三运用的是开放式判定,并没有实在判定记载,所以不能阻止李四妄图批改相同的记载。在李四批改相同的客户记载时,他不知道张三正在批改该记载,并且也没有看到最新的数据。当张三妄图在李四批改相同的客户记载时存储他的改动,就会发生一个差错。关于大多数数据库应用程序来说,可以要选择开放式判定,因为其它用户批改或删去自个正在运用的记载的可以性要小于妄图访问已被判定的页面上记载的可以性。可是,如果某个应用程序中有多个用户一起访问和批改记载,则应运用保管式判定,以确保在实行批改时辰记载不被其他人批改。在这种情况下,应注意不要使记载判定的时辰过长。
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
3).开释判定。如前所述,在实行Update方法后,将自动开释页面判定。可是,开释记载判定是一种后台进程,有时候,其它操作发生得很快,以至于数据库来不及处置该进程。如果正在开发一个数据输入密集型的应用程序,则可以需要暂停应用程序的处置,这可以通过Microsoft Jet数据库引擎的Idle方法来结束。Idle方法挂起数据处置,启用Microsoft Jet数据库引擎实行其它操作,比方内存优化或内存页超时等(仅Microsoft Jet工作区)。该方法用于DBEngine方针,格式如下:
DBEngine.Idle[dbRefreshCachel
在多用户环境中,用Idle方法可以使Microsoft Jet数据库引擎实行后台任务。在一般情况下,仅当没有任何操作(包括移动鼠标)发生时,才开释读判定并更新本地动态集类型的Recordset方针中的数据。如果守时地运用Idle方法,则Microsoft Jet可以开释不必要的读判定,以捕获后台处置任务。Idle方法有一个可选的参数,即dbRefreshCache,如果运用该参数,则可逼迫挂起写入.MDB文件,并用.MDB文件中的最新数据改写内存。(六) 结束页面判定的一个具体比方结束页面确守时运用开放式判定,可按如下进程操作:
(1)翻开一个表类型或动态集类型的记载集,它便是想要批改的数据。
(2)把数据指针移动到一个记载上。
(3)把记载集的LockEdits特色设置为False,指定开放式判定。
(4)用Edit方法批改该记载(该记载还没有被判定)。
(5)提交该记载。
(6)用Update方法来提交记载的改动(这将妄图判定记载)。
(7)检查Update方法是不是成功。如果没有成功,则再试;
当运用事务时,开放式判定将转换为保管式判定。因为在提交事务之前,事务一贯具有写判定,所以即使把LockEdits特色设置为False,也会转换为保管式判定。在保管式判定中,Update方法可以会失利。这是因为Edit方法没有设置写判定,并不意味着Update方法没有置写判定。换句话说,当一个用户用保管式判定翻开记载集时,即使第二个用户运用的是开放式判定,他对相同数据的更新也会失利。下面通过一个比方说明怎样结束保管式判定。编写一个Function进程,用来结束保管式判定,并用该进程更新数据库。
FUnctionUpdateUnitslnStoCk(strlAsString,Str2AsStnng)
Dim dbs As DatabaseDim rstStr As RecordsetDim blnError As BooleanDim intCount As IntegerDim intLockCount As IntegerDim intChoiCe As IntegerDim intRndCount As Integer
Dim i As Integer
OnErrorGoToErrorHandler ’以同享方法翻开数据库
Set dbs=openDatabase(“d:dbtestdbtest.mdb”) ’翻开表进行批改
Set rstStr=dbs.OpenRecordset(”tb”,dbOpenDynaset)
With rstStr
.LockEditS=True ’把判定类型设置为保管方法
VB 数据库编程之Microsoft Jet的多客户模型_vb数据库编程
.FindFirst”电话=” & Chr(34) & strl & Chr(34)
If.NoMatch Then
UpdateUnitslnStock=-l
GoTo CleanExit
End lf
’妄图批改记载。如果发生判定差错,则差错处置程序会试着处置它,因为该程序运用的是保管式判定,所以当妄图批改一个记载时会发生差错。如果它运用开放式判定,那么就会在更新记载时发生差错
.Edit
![电话]=str2
.Update
End With
CleanExit:
rstStr.Closedbs.CloSe
EXit Function
ErrorHandler:
Select Case Err
Case 3197
’记载会合的数据在被翻开之后发生了改动,再试一下批改该记载,这将自动改写记载集,以闪现最新的数据
Resume
Case 3260 '记载被判定
IntLockCount=IntLockCount + 1
’现已两次妄图获得判定,让用户吊销或重试
If intLockCount > 2 Then
intChoice=MsgBox(Err.Description & "Retry?",vbYesNo + VbQuestion)
If intChoice=vbYes Then
intLockCount=1
ElSe
UpdateUnitslnStock=ERR_RECORDLOCKED
Resume CleanExitEnd lf
End lf
’移交给Windows
DOEVents
’推延一个较短的随机时辰,每次判定失利后就把这个时辰间隔变长一些
intRndCount=intLockCount ^ 2 * Int(Rnd * 3000 + 1000)
For i=1 To intBndCount: Next i
Resume ’再试一次批改
Case Else '非预期的差错
MsgBOX"Error" & Err & ":" & Error, _
VbOKOnlv
UpdateUnitslnStock=FAILED
ResunleCleanExitEnd Select
End FunCtlon
上述进程翻开一个数据库dbtest.mdb,该数据库中有一个名为tb的表,
?
UpdateUnitslnStock进程有两个参数,第一个参数是表中指定字段(进程中为“电话”)正本的内容,第二个参数是该字段批改后的内容。进程顶用rstStr.LockEdits=True
指定保管式判定,接着指定要批改的字段,如果要批改的字段不存在,则进程回来值为 -1,并关闭表和数据库,退出进程;如果找到了要批改的字段,则用Edit和Update方法对其进行批改和更新。程序的其他有些是差错处置子程序,首要用来对可以出现的差错进行处置。
为了调用上面的进程,可以在窗体上画一个指令按钮,然后编写如下的工作进程:
Private Sub Command1_Click() 。
a=UpdateUnitslnStock(”3456.8765”,”2222.3333”)
b=UpdateUnitslnStock(”6845.7651”,”4444.5555”)
c=UPdateUnitslnStock(”6842.2939“,”6666.7777”)
End Sub
工作程序,单击指令按钮,即可调用UpdateUnitslnStock进程,批改“电话”字段的内容。
?