VB 数据库编程.docx
- 文档编号:7003504
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:13
- 大小:26.22KB
VB 数据库编程.docx
《VB 数据库编程.docx》由会员分享,可在线阅读,更多相关《VB 数据库编程.docx(13页珍藏版)》请在冰点文库上搜索。
VB数据库编程
VB数据库编程
(一)多客户环境下VB数据库编程之MicrosoftJet的多客户模型
1.多客户环境下数据库的贮存办法。
在客户/效劳器体系中,应用程序通常分为两种状况:
一种是把整个应用程序放到网络效劳器上,答应多个用户翻开数据库。
在这种状况下,用户能够同享组成应用程序的一切数据库目标,包含存储数据的表。
另一种是把应用程序分为两个数据库(双数据库):
一个是包含应用程序数据表的后端数据库,另一个是包含应用程序其它目标(查询、窗体、报表、宏和模块)的前端数据库,前端数据库还能够办理暂时目标。
后端数据库放到网络效劳器上,而前端数据库分发给用户,使来自后端数据库的衔接表作为前端数据库目标的根底。
在多用户环境中,双数据库办法具有较为显着的优势,由于应用程序不用树立能够够与另一个用户发作抵触的暂时表。
因而,在用户作业站上存储前端数据库,能够避免对暂时目标的争用;一同,由于在本地存储静态目标,因而当应用程序运转时,能够使网络通讯量削减到最小。
2.静态部件与动态部件。
应用程序中的部件能够归为两类,即静态部件和动态部件。
(1)静态部件:
应用程序中相对安稳,即不常常改动的有些。
常用的静态部件是组成调用MicrosoftJet宿主程序的动态链接库(.dll)和可履行文件(.exe),例如VisualBasic,MicrosoftAccess,MicrosoftExcel等。
此外,应用程序中的部件,如窗体、报表和程序代码等,也归于静态部件。
静态部件不常常改动,因而是作业站存储的抱负挑选。
为了取得最佳功用,通常把静态目标安装在本地作业站上。
这种状况下,当应用程序的设计改动时,有必要对本地作业站上的目标进行更新。
可是,若是用户作业站的磁盘空间不够用,或许希望能非常好地操控静态部件的改动,则能够把静态部件存储在网络效劳器上。
这样做会显着增加网络的通讯量和下降应用程序的功用,但能够使应用程序更易于办理。
当然,若是能够的话,最好把静态部件存储在用户端。
把部件移到作业站上,将会给应用程序的办理带来一些费事。
例如,当需求修正应用程序的静态目标时,例如修正表的布局或程序代码,有必要有相应的机制来更新每个作业站上一切受影响的部件。
当作业站较多时,这种操作适当费时吃力。
为了处置个疑问,能够运用下两种办法:
·在发动应用程序时查看部件的最新版别。
例如,应用程序的发动代码能够把本地数据库中静态目标的修正日期与效劳器的中心数据库中的日期进行对比,若是发现效劳器目标的日期较新,则主动输入目标的最新版别,使本地数据库坚持最新。
·用MicrosoftJet的仿制功用使目标同步。
例如,能够树立数据库的复本并把它们存储在作业站上,然后就能够经过仿制功用主动使目标同步。
“数据库复本”在后面将讲到。
(2)动态部件:
是一些文件,由在多用户环境顶用户拜访的实践数据组成。
这些文件
包含MicrosoftJet数据库(.mdb)文件、外部数据库文件(如MicrosoftFoxPro数据库文件)或存储在数据库效劳器上的ODBC数据库文件。
和静态部件一样,应用程序动态部件的寄存方位一样能够是决议应用程序整体功用的首要因素。
例如,假定把应用程序的数据文件放置在网络效劳器上,而且应用程序有必要在没有索引的表中查找一个记载。
在这种状况下,MicrosoftJet有必要对整个表进行次序扫描以查找匹配成果,这意味着有必要把整个表从效劳器传送到引擎的作业站。
当表很大时,这种操作能够需求较长的时刻。
一同,由于用户在履行查找时长时刻地等候呼应,而网络上很多的通讯还会轮番地下降其他用户的速度,所以这个疑问会愈加杂乱。
为了减轻这种状况,能够给应用程序要查找的列增加索引。
可是,增加索引又能够会增加网络通讯量,而且下降了并发和功用。
这即是说,经过网络拜访文件明显比在本地核算机上拜访文件慢,在多用户环境中完结数据库体系实践上是以献身体系功用为价值的。
因而,为了减小网络的通讯量,最好将某些应用程序的部件存储在本地作业站上。
例如,假定应用程序运用一套存储邮政编码或零件编号表,而这些表不常常改动,则能够把它们移到本地作业站上,以避免网络拜访。
3.MicrosoftJet多用户模型。
MicrosoftJet多用户数据库应用程序由几个重要部件构成。
在每个用户的作业站上都有MicrosoftJet的一个复制在运转,若是运用双数据库办法,则通常静态部件会驻留在每个用户的核算机上,而动态部件会驻留在网络效劳器上。
除此之外,多用户应用程序具有下列文件:
一个作业组信息文件,它能够会集驻留在网络效劳器上,也能够驻留在每个用户作业站上;每个数据库有一个断定信息文件(.1db),它驻留在与数据库一样的文件夹内。
1).作业组信息文件作业组信息文件是一个MicrosoftJet数据库,用来存储用户、组和暗码信息以及用户设置的各种选项信息。
在多用户环境中,作业组信息文件的方位是很重要的。
能够把作业组信息文件放在每个本地作业站上,也能够把它放在网络效劳器上。
若是把它存储在本地机上,则有必要在改动安全性设置值时采纳必要的进程对它进行更新。
2).断定信息文件断定信息文件(.1db)用来存储数据库中一切当时断定记载的信息。
在翻开数据库时,若是断定信息文件不存在,则MicrosoftJet数据库引擎会主动树立该文件。
MicrosoftJet为每个以同享办法翻开的MicrosoftJet数据库文件树立一个断定信息文件。
该文件与翻开的相应数据库同名,但文件名后缀为.1db。
例如,与Northwind.mdb相对应的断定信息文件名叫Northwind.1db。
断定信息文件与数据库存储在相伺的文件夹中。
在数据库封闭时,MicrosoftJet会删去.1db文件。
在多用户环境中,则在一切用户都退出应用程序时将其删去。
MicrosoftJet撑持下列文件效劳器和点对点网络:
.MicrosoftWindowsNT和Windows95网络.BanyanVINES5.52.DECnet4.1.LANtastic5.0.NovellNetWare3.x和4.x.OS/2LANManager2.1和2.2
通常来说点对点网络不能极好的满意多用户数据库体系的需求,大多数应用程序需求运转在有专用的文件效劳器的网络上。
(二)数据拜访操控
在单用户环境中,只需一个用户在拜访数据,因而应用程序不会发作资源恳求抵触。
而在多用户环境中,当用户拜访数据时,能够会发作抵触。
为了办理这些抵触,MicrosoftJet供给了数据拜访操控和应用程序的断定效劳,以保证在给定的时刻内只需一个用户能够拜访数据。
数据拜访操控用来对数据库的有些或悉数进行拜访约束,通常可分为两类,一类是用户约束,另一类是功用约束。
用户约束用来阻碍某些人(或只答应某些人)查看或修正“灵敏”数据。
例如,在薪酬体系中,大多数人能够查看员工的薪酬,但只需少量人才有权修正实践的薪酬信息。
功用约束只对程序的某个有些起作用,而不论用户是谁。
例如,在订单挂号体系中,若是把报价表设为只读办法,则可避免用户随意修正某些项目的报价。
在应用程序中,能够经进程序操控或MicrosoftJet数据库引擎操控来处置约束。
其间程序操控能够施加于程序本身,而引擎级操控则约束了任何企图拜访数据库信息的程序。
1.互斥地运用数据库。
以互斥办法翻开数据库是对数据拜访施加的最大约束,它实践上是以“独占”办法运用数据库。
这种约束能够阻碍任何用户或程序拜访正在运用的数据库中的信息。
由于这种办法的约束太大,因而只用于那些影响整个数据库的操作,包含:
·紧缩数据库。
·更新整个表(例如用UPDATE查询)。
·经过增加表、字段或许索引来修正数据库的布局。
·处置特别的用户需求(例如传送审计信息)。
在程序代码中,为了以独占办法翻开一个数据库,有必要把OpenDatabase办法的第二个参数设置为True,例如:
DimoldDbAsDatabase
DimoldwsAsworkSpace
SetoldDb=oldWs.OpenDatabase("Members.mdb",True,False)
用上面的代码翻开数据库时,若是该数据库未被其它用户运用,则翻开数据库,这样直到封闭之前,该数据库不会被其它用户或程序拜访;若是数据库正在被其它用户运用,则回来一个过错。
2.回绝其它用户或程序拜访指定的表。
以独占办法翻开数据库后,能够回绝其它用户或程序拜访整个数据库(包含数据库中的每个表)。
而对数据拜访的一种较轻的约束则是回绝其它用户或程序拜访由自己程序正在运用的表(即记载集),它实践上是对记载集进行断定。
断定记载集的操作经过OpenRecordset办法中的Options参数来完结。
咱们晓得,OpenRecordset办法的格局如下:
目标.OpenRecordset(type,OPtlons,lockedits)
其间的options参数用来设置对记载集的断定,该参数能够取多种值,以下两种值用来制止其它用户对记载集进行读写操作:
1..制止读(dbDenyRead)
OpenRecordset办法中的dbDenyRead常量用来制止其它用户查看表中的数据,直到封闭该表停止。
当需求更新整个表中的信息时,能够运用这个常量。
例如:
DimrstasRecordset
Setrst=dbs.OpenRecordset(strTable,_
dbOpenTable,dbDenyRead)
2.制止写(dbDenywrite)
OpenRecordset办法中的dbDenyWrite常量用来制止其它用户更新表中的数据,直到封闭该表停止。
在这种状况下,其它用户能够查看表中的信息,也能够增加新记载,但不能对其进行修正。
当需求向表中刺进新记载而又不想修正现有的记载时,能够运用这个常量,它对表和动态集都有用。
例如:
DimrstasRecordset
Setrst=dbs.OPenRecordset(strTable,_
dbOpenTable,dbDenyWrite)
用dbDenyRead和dbDenyWrite能够别离制止对记载集进行读和写,若是既想制止读,又想制止写,则可一同运用这两个常量(用“十”号衔接)。
例如:
DimrstasRecordset
Setrst=dbs.OpenRecordset(strTable,_
dbOpenTable,dbDenyRead+dbDenyWrite)
(三)同享数据的断定
前一节介绍了对数据拜访的一些约束,其间讲到了对表的断定。
这一节将进一步地谈一谈怎么完结同享数据的断定操作。
要维护同享数据,能够在用户修正数据时断定它。
数据被断定后,任何用户都能够读取它,但仅有一个用户能够修正它。
MicrosoftJet能够在以下三种不一样的等级上断定数据:
·独占办法:
阻碍其他一切用户拜访数据库,这是约束最大的办法,上一节已介绍过。
·记载集断定:
即断定Recordset目标的根本表,用读表断定、写表断定或两者都用。
·页面断定:
断定富含正在修正的数据的页面,其长度为2048个字节(2K)。
这是约束最小的办法。
在应用程序顶用哪一种办法来断定目标,首要看所需求的并发等级。
例如,若是想使目标在任何时候都可用,则可运用页面断定,由于它是约束最小的等级。
若是应用程序要保证数据库中的大多数或一切数据都可拜访,则应挑选独占办法,这种办法保证应用程序独占数据库的拜访。
注意,这三种等级能够联系运用。
例如,假定有一个订单体系,则能够用页面断定来操控订单表的断定,使订单接收者之间的并发程度最高。
在一天结束时用记载集断定来断定汇总表,这个汇总表要用汇总数据来更新。
最终,能够在夜间运用独占办法来收拾数据库。
1.同享办法与独占办法
如前所述,独占办法是翻开数据库约束最大的办法,它阻碍其他一切用户翻开该数据库。
这种办法常用于数据库办理或数据库的批量修正,例如修正或收拾操作以及改动数据库的布局等。
在单用户环境中拜访数据库时,通常以独占办法翻开数据库,这能够供给非常好的功用,由于MicrosoftJet不用对目标进行断定和解锁,也不用改写高速缓存器。
可是,当在多用户环境中运用应用程序时,通常以同享办法翻开数据库。
(1).以同享办法翻开数据库
为了完结记载集断定,有必要以同享办法翻开数据库。
当以同享办法翻开数据库时,能够会有多个用户一同对数据库进行拜访,在这种状况下,MicrosoftJet将处置各用户间企图修正一样记载的抵触。
前一节中讲过,当用OpenDatabase办法翻开数据库时,只需把Options参数的值设置为False,就能以同享办法翻开数据库。
下面举一个比如。
编写一个Function进程,调用该进程,能够依据需求用同享办法或独占办法翻开数据库。
进程如下:
FunctionOPenDatabaseX(dbsAsDatabase,strDBPathAs_
String,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:
\Vb50\biblio.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:
\vb50\biblio.mdb。
则由于该数据库的途径不对而犯错,发作犯错信息。
(2).运用只读办法
只读办法是同享办法的特别办法。
当以只读办法翻开一个数据库时,不能改动数据库的数据或目标。
可是,其他用户能够改动数据,不要把这种办法与在操作体系级以只读办法翻开文件相混杂。
下面的代码以独占的只读办法翻开一个数据库:
SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",True,True)
若是以同享的只读办法翻开一个数据库,则应运用下面的代码:
SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",False,True)
注意,以只读办法翻开数据库时,并不制止同享表类型的断定或读断定;因而,以只读办法翻开数据库不能避免断定抵触的发作。
约束程序为只读办法的另一种办法是为记载集运用快照,快照类型的记载集总是只读的。
当基表中的数据不需求常常修正时,能够运用快照。
由于快照寄存在内存中,因而其操作比运用表或动态集的一样操作速度要快。
可是,由于快照的内存需求和装入内存时要花费必定的时刻,最好把快照用于回来记载在200以内的查询中。
(四)记载集断定
用记载集断定能够断定Recordset目标根本表,也能够指定只读或(和)只写拜访。
记载集断定只能应用于表类型和动态集类型的Recordset目标,页面断定(见下一节)不能应用于快照类型和仅向前类型的Recordset目标,由于它们正本即是只读目标。
尽管如此,MicrosoftJet仍供给了同享表读断定和同享表写断定。
(1).翻开记载集。
以同享办法翻开数据库之后,能够经过在OpenRecordset办法的oPtions参数中指定不一样的选项来完结记载集断定。
为了用断定翻开一个记载集,可按如下进程操作:
1.)以同享办法翻开Recordset目标的数据库。
2.)用OpenRecordset办法翻开记载集,并把Options参数设置为所需求的断定办法。
3.)当Recordset目标的运用结束时,封闭该目标以开释一切记载集级的断定。
编写一个Function进程,以独占办法翻开一个表。
FunctionOpenTableExclusive(dbsAsDatabase,rstAsRecordset,strTableAsString)AsInteger
Setrst=dbs.OpenRecordset(strTable,dbOpenTable,dbDenyRead+dbDenyWrite)
SelectCaseErr
CaSe0:
OpenTableExclusive=0
CaSeElse:
OpenTableExclusive=-1
EndSelect
Err=0
EndFunction
该进程经过dbDenyWrite和dbDenyRead选项常数的组合,以独占办法翻开一个表。
若是进程调用成功(回来0),则在Recordset变量被显式或隐式地封闭之前,其它用户将不能拜访该表。
若是其它用户现已以独占办法翻开该表,或许发作了一个非预期的过错,则该进程回来-1。
为了调用上述进程,能够在窗体上画一个指令按钮,然后编写如下的事情进程:
PrivateSubCommand1_Click()DimaAsIntegerDimMvDbsAsDatabase
DimMvTabsAsRecordset
SetMyDbs=OpenDatabase("C:
\dbdir\dbl.mdb,true)
a=OpenTableExclusive(MyDbs,MyTabs,"Tabel1")
SelectCasea
Case0:
MsgBox"调用成功"
CaseElse:
MsgBox"调用犯错"
EndSelect
EndSub
注意,若是翻开一个Recordset目标时没有指定option:
参数值,则MicrosoftJet将运用页面断定。
在这种状况下,将以同享办法翻开记载集,而且不制止其他用户拜访记载会集的数据,但它的确断定了当时页中正在修正的数据。
(2).在翻开记载集时查看过错。
和以独占办法翻开数据库一样,当对Recordset目标设置确守时,若是断定失利,则会发作过错。
若是某个用户以制止其它用户取得断定的办法翻开了一个Recordset目标,则当企图断定该Recordset目标时将会发作最常见的过错,即3262,其犯错信息为:
“不能断定表XXX;当时正被用户XXX在机器XXX上运用。
”。
当企图对不能断定的目标运用OpenRecordset办法时,也会发作这个过错。
(五)页面断定
从抱负的视点来说,若是能对记载进行断定,则会给多用户程序带来极大的灵活性。
可是惋惜的是,MicrosoftJet引擎不撑持真实的记载断定,而是运用页面断定。
页面断定只断定包含当时正在修正的记载的页,MicrosoftJet进行拜访和断定的页的巨细为2K(2048个字节)。
在运用页面确守时,其他用户能够读取断定页中的数据,但不能对数据进行修正。
在这种断定计划中,每次将断定多个记载,断定的记载的个数取决于每个记载的巨细。
例如,若是每个记载的长度为230个字节,则每次只能断定9个记载;而若是记载的长度为30个字节,则每次可断定68个记载。
断定办法。
页面断定分为两种办法,即保存式断定和开放式断定,它断定了MicrosoftJet怎么对数据进行断定。
当编写在页面等级上断定数据的应用程序时,有必要断定要运用哪种断定办法。
页面断定能够经过两种办法来设置,即LockEdits特点和OpenRecordset办法中的lockedit5参数。
1.用LockEdits特点指定断定办法。
断定办法能够经过LockEdits特点来指定。
该特点可用于各种Recordset目标,包含动态集、快照、表及动态类型的Recordset目标。
LockEdits特点是一个布尔值,当把该值设置为True(缺省)时,将对记载集进行保存式断定,即在履行Edit办法时断定2K的页面:
若是把该特点设置为False,则对记载集进行开放式断定,即在履行UPdate之前不断定要更新的记载地点的2K页面。
如下面的比如:
DimrstTemPAsReCordset
……
rstTemp.LockEdits=True
阐明:
a.断定页面后,其它用户不能对正在修正的记载地点页面进行修正,但能够读取断定页中的数据。
在其它用户断定页面后,若是再把LockEdits特点设置为True,则会犯错。
b.若是把LockEdits特点设置为False,且其它用户已断定页面,则这以后的用户在运用Update时将会犯错。
c.当与Microsoft衔接的ODBC数据源一同操作时,LockEdits特点被设置为False,即开放式断定。
2.用OpenRecordset办法指定断定办法。
咱们已屡次运用过OpenRecordset办法,该办法的格局如下:
Setrecordset=object.OpenRecordset(type,options,lockedits)
其间第三个参数,即lockedits,用来指定断定办法或以只读办法翻开记载集。
该参数能够取以下5种值:
(1)dbReadOnly:
以只读办法翻开记载集。
注意,在options参数中也能够运用dbReadOnly,但不能一同运用,不然会发作过错。
(2)dbPessimistic:
用保存式断定办法翻开记载集,一旦运用Edit办法,将当即断定正在修正的记载地点的页面,直到履行Update办法后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 数据库编程 数据库 编程