VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 非access数据库在vb中的编程及应用
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10091, 日期:2000-10-27
非access数据库在vb中的编程及应用

visual basic有着强大的数据库存取能力,不仅能够直接支持ms access数据库,而且通过其内部安装的isam驱动程序使它能间接支持foxpro、dbase等外来数据库。本文不仅从vb数据库体系结构的角度探讨了vb对这些外来数据库的支持,还结合了一些实例具体阐述了使用数据库存取对象变量的方法实现这些外来数据库的新建、库结构修改、显示及其运行环境设置。


关键词


visual basic access, 外来数据库,数据库


正文


存取对象变量库结构  作为一个功能较完备的windows软件开发平台,visual basic专业版提供了对数据库应用的强大支持。尤其提供了使用数据控件和绑定控制项,使用数据库存取对象变量(data access object variable),直接调用odbc 2.0 api接口函数等三种访问数据库的方法。对其标准内置的ms access数据库,它可以提供不弱于专业数据库软件的支持,可以进行完整的数据库维护、操作及其事务处理。在vb中,将非access数据库称为外来数据库。对于foxpro、dbase、paradox等外来数据库。虽然借助vb的datamanager能够对这些数据库进行new、open、design、delete等操作,但在应用程序的运行状态中并不能从底层真正实现这些功能。本文从使用数据库存取对象变量的方法出发,实现了非access格式数据库(以foxpro数据库为例)的建新库、拷贝数据库结构、动态调入等操作,阐述了从编程技巧上弥补vb对这些外来数据库支持不足的可行性。


一、vb数据库的体系结构具体的vb的数据库结构。


vb数据库的核心结构是所谓的microsoft jet数据库引擎,jet引擎的作用就像是一块“面板”,在其上可以插入多种isam(indexed sequential access method,即索引顺序存取方法)数据驱动程序。jet引擎为access格式数据库提供了直接的内部(build-in)支持,这就是vb对access数据库具有丰富支持的真正原因。vb专业版中提供了foxpro、dbase(或xbase)、paradox、btrieve等数据库的isam驱动程序,这就使得vb能支持这些数据库格式。另外,其他的许多兼容isam的驱动程序也可以通过从厂商的售后服务得到。因而从理论上说,vb能支持所有兼容isam的数据库格式(前提是只需获得这些数据库的isam驱动接口程序)。由上可见,msjet引擎实质上提供了:一个符合ansi标准的语法分析器;为查询结果集的使用而提供的内存管理功能;同所支持的数据库的外部接口;为应用代码提供的内部接口。实际上,在vb中从一种数据库类型转化为另一种数据库类型几乎不需要或只需要很少的代码修改。而且,尽管dbase、paradox本身的ddl(data definition language,即数据定义语言)和dml( data manipulation language,即数据操纵语言)是非结构化查询的,但它们仍然可以使用vb的sql语句和jet引擎来操纵。从vb的程序代码的角度来看,odbc,isam驱动程序以及ms access数据库的整个外部结构够可以统一为一个一致的编程接口。也即是说,提供给vb应用程序员的记录集对象视图同所使用的数据库格式及类型是相互独立的。即对foxpro等数据库仍然可以使用众多的数据库存取对象变量,这就为非access数据库的访问提供了最重要的方法。

二、使用非access数据库时的参数设置及配置文件的参数读取


如果在vb的程序中使用了数据库的操作,将应用程序生成exe文件或打包生成安装程序后,则必须提供一个配置(.ini)文件,在ini文件中可以对不同类型的数据库进行设置。如果找不到这个ini文件,将会导致不能访问数据库。通常情况下,ini文件的文件名和应用程序的名称相同,所以如果没有指明,vb的程序会在windows子目录中去找和应用程序同名的ini文件。可以使用vb中的setdataaccessoptions语句来设置ini文件。


setdataaccessoptions语句的用法如下:


setdataaccessoptions1,inifilename


其中inifilename参数指明的是ini文件的带路径的文件名。值得注意的是,当应用程序找不到这个ini文件时,或在调用opendatabase函数时对其connect参数值没有设定为vb规定的标准值,如对foxpro2.5格式设定为了“foxpro;”(应为“foxpro2.5;”),或者没有安装相应的isam驱动程序,则此时vb会显示一条错误信息“not found installable isam”。通常,ini文件在应用程序分发出去以前已经生成,或者在安装时动态生成,也可以在应用程序中自己生成。通常这种ini文件中有“[options]”、“[isam]”、“[installed isams]”、“ [foxpro isam] ” 、 “ [dbase isam] ” 、 “ [paradox isam] ”等设置段,对于一个完整的应用程序则还应有一个属于应用程序自己的设置段如“[mydb]”。可在其中设置datatype、server、database、openonstartup、displaysql、querytimeout等较为重要的数据库参数,并以此限定应用程序一般的运行环境。windows api接口函数在kernel.exe动态链接库中提供了一个oswriteprivateprofilestring函数,此函数能按windows下配置文件(.ini)的书写格式写入信息。在通常情况下,应用程序还需要在运行时读取配置文件内相关项的参数。比如pagetimeout(页加锁超时时限)、maxbuffersize(缓冲区大小)、lockretry(加锁失败时重试次数)等参数,通过对这些参数的读取对应用程序运行环境的设定、潜在错误的捕获等均会有很大的改善。设此应用程序的配置文件为mydb.ini,则具体过程如下 :  


funtion getinistring$( byval fname$ , byval szitem$ , byval szdefault$ ) ’ 此 自定义子函数实现ini文件内设置段内参数的读取


dim tmp as string , x as integer


tmp = string( 2048,32 )


x = osgetprivateprofilestring( fname$ , szitem$ , szdefault$ , tmp , len(tmp) , “ mydb.ini ” )


getinistring = mid$( tmp,1,x )


end function


以下这些函数的声明可写在模块文件内,且每个函数的声明必须在一行内


declare function osgetprivateprofilestring% lib "kernel" alias "getprivateprofilestring" (byval appname$, byval keyname$, byval keydefault$, byval returnstring$, byval numbytes as integer, byval filename$)


declare function oswriteprivateprofilestring% lib "kernel" alias "writeprivateprofilestring" (byval appname$, byval keyname$, byval keydefault$, byval filename$)


declare function osgetwindowsdirectory% lib "kernel" alias "getwindowsdirectory" (byval a$, byval b%)


sub form1_load( )


dim st as string dim x as integer


dim tmp as string tmp = string$( 255, 32 )


’ 在 ini 文 件 内 为 各 种 数 据 库 格 式 指 明 已 安 装 的 相 应 isam 驱 动 程 序


x = oswriteprivateprofilestring(" installable isams", "paradox 3.x", "pdx110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "installable isams", "dbase iii", "xbs110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "installable isams", "dbase iv", "xbs110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "installable isams", "foxpro 2.0", "xbs110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "installable isams", "foxpro 2.5", "xbs110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "installable isams", "btrieve", "btrv110.dll", "mydb.ini" )


x = oswriteprivateprofilestring( "dbase isam", "deleted", "on", "mydb.ini" )


’ 指 明 ini 文 件 的 位 置


x = osgetwindowsdirectory( tmp, 255 )


st = mid$( tmp, 1, x ) setdataaccessoption 1, st + "\mydb.ini"


’ 获 得 ini 文 件 一 些 参 数


gwmaxgridrows = val(getinistring( “ mydb.ini ” ,"maxrows", "250" ))


glquerytimeout = val(getinistring( “ mydb.ini ” ,"querytimeout", "5" ))


gllogintimeout = val(getinistring( “ mydb.ini ” ,"logintimeout", "20" ))


end sub  

三 、数据存取对象变量对外来数据库编程的方法及其实例


在vb专业版数据库编程的三种方法中,第二种—使用数据库存取对象变量(dao)的方法最具有功能强大、灵活的特点。它能够在程序中存取odbc2.0的管理函数;可以控制多种记录集类型:dynaset,snapshot及table记录集合对象;可以存储过程和查询动作;可以存取数据库集合对象,例如tabledefs,fields,indexes及querydefs;具有真正的事物处理能力。因而,这种方法对数据库处理的大多数情况都非常适用。由于vb中的记录集对象与所使用的数据库格式及类型是相互独立的,所以在非access数据库中也可以使用数据库存取对象变量的方法。因而对foxpro等外来数据库而言,使用数据库存取对象变量的方法同样也是一种最佳的选择。有一点需要注意的是,vb的标准版中仅能使用数据控件(data control)对数据库中的记录进行访问,主要的数据库存取对象中也仅有database、dynaset对象可通过数据控件的属性提供,其它的重要对象如tabledef、field、index、querydef、snapshot、table等均不能在vb的标准版中生成,所以使用数据存取对象变量的方法只能用vb3.0以上的专业版。


非access数据库的新建及库结构的修改


vb专业版中的数据库存取对象变量可以分为两类,一类用于数据库结构的维护和管理,另一类用于数据的存取。其中表示数据库结构时可以使用下面的对象:database、tabledef、field、index,以及三个集合(collection):tabledefs、fields和indexes。每一个集合都是由若干个对象组成的,这些数据对象的集合可以完全看作是一个数组,并按数组的方法来调用。一旦数据库对象建立后,就可以用它对数据库的结构进行修改和数据处理。对于非access数据库,大部分都是对应于一个目录,所以可以使用vb的mkdir语句先生成一个目录,亦即新建一个数据库。而每一个非access数据库文件可看作是此目录下的一个数据表(table),但实际上它们是互相独立的。下面是新建一个foxpro2.5格式数据库的程序实例。


sub createnew ( )


dim db1 as database , td as tabledefs dim t1 as new tabledef , f1 as new field , f2 as new field , f3 as new field


dim ix1 as new index


dim path as string


const db_text = 10 , db_integer = 3


chdir "\" path$ = inputbox( " 请 输 入 新 路 径 名 : ", " 输 入 对 话 框 " ) mkdir path$


’ 新 建 一 个 子 目 录


set db1 = opendatabase(path$, true, false, "foxpro 2.5;")


set td = db1.tabledefs t1.name = "mydb"


’ 新 建 一 个 数 据 表 , 数 据 表 名 为 mydb


f1.name = "name" , f1.type = db_text , f1.size = 20 f2.name = "class" , f2.type = db_text , f2.size = 20 f3.name = "grade" , f3.type = db_integer t1.fields.append f1


’ 向 数 据 表 中 添 加 这 些 字 段 t1.fields.append f2