唐山网站建设

设为主页 加入收藏 繁體中文

在VB中兼容非ACCESS数据库的技能

核心提示:本文从VB数据库体系结构的角度动身,结合1个具体实例,论述了在VB中兼容非ACCESS格式数据库的具体方法和技能。

本文从VB数据库体系结构的角度动身,结合1个具体实例,论述了在VB中兼容非ACCESS格式数据库的具体方法和技能。

关键词:VB、非ACCESS数据库、数据存取对象

1个完全的数据库治理系统(DBMS)应是能兼容市面上各种较流行数据格式的系统,它充分考虑了不同用户的实际要求。鉴于目前市面上有多种数据库格式(如Foxpro、DBase、Paradox等)流行,因此在VB数据库利用程序中兼容非ACCESS数据库就显得尤其重要了。

作为1种流行的开发平台,VB提供了强大的数据库功能。主要有以下3种:数据控件法:使用数据存取对象(Data Access Object )法;直接调用ODBC 2.0 API接口函数法。其中调用数据存取对象的方法相对其它两种方法具有方便灵活、功能强大的突出优点。本文即从调用数据库存取对象的方法动身,实现了非ACCESS格式数据库(以FoxPro数据库为例)的建新库、拷贝数据库结构、动态调进等操纵,论述了从编程技能上弥补VB对这些外来数据库支持不足的可行性。

1、VB数据库的体系结构

VB数据库的核心结构是所谓的MicroSoft JET数据库引擎,它为VB与数据库的接口提供了基本的方法和手段。JET引擎被Visual Basic、Microsoft ACCESS和其它Microsoft产品所共享。因此在VB中Access数据库格式是1种标准的内置格式,所有的非ACCESS数据库都被称为外来数据库。

JET引擎的作用就像是1块“面板”,在其上可以插进多种索引顺序存取方法(即ISAM)数据驱动程序。这就是VB对非ACCESS数据库具有丰富支持的真正缘由。VB专业版中提供了FoxPro、dBASE(或Xbase)、Paradox、Btrieve等数据库的ISAM驱动程序,这就使得VB能支持这些数据库格式。另外,其他的很多兼容ISAM的驱动程序也能够通过从厂商的售后服务得到。因此从理论上说,VB能支持所有兼容ISAM的数据库格式(条件是只需取得这些数据库的ISAM驱动接口程序)。

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

值得留意的是,大多数的程序员都不重视数据库配置文件的使用,却不知这是极其重要的。

假设在VB的程序中使用了数据库的操纵,将利用程序天生EXE文件或打包天生安装程序后,则必须提供1个数据库配置(.INI)文件,在INI文件中可以对不同类型的数据库进行设置。假设找不到这个INI文件,将会导致不能访问数据库。通常情况下,INI文件的文件名和利用程序的名称相同,所以假设没有指明,VB的程序会在Windows子目录中往找和利用程序同名的INI文件。可使用VB中的SetDataACCESSOptions语句来设置INI文件。

SetDataACCESSOptions语句的用法以下:

SetDataACCESSOptions 1,IniFileName

其中IniFileName参数指明的是INI文件的领路径的文件名。

值得留意的是,当利用程序找不到这个INI文件时,或在调用OpenDataBase函数时对其Connect参数值没有设定为VB规定的标准值,如对FoxPro 2.5格式设定为了“FoxPro;”(应为“FoxPro 2.5;”),或没有安装相应的ISAM驱动程序,则此时VB会显示1条毛病信息“Not Found Installable ISAM”。

通常,INI文件在利用程序分发出往之前已天生,或在安装时动态天生,也能够在利用程序中自己天生。通常这类INI文件中有“[Options]”、“[ISAM]”、“[Installed ISAMs]”、“[FoxPro ISAM]”、“[dBASE ISAM]”、“[Paradox ISAM]”等设置段,对1个完全的利用程序则还应有1个属于利用程序自己的设置段如“[MyDB]”。可在其中设置DataType、Server、DataBase、OpenOnStartup、DisplaySQL、QueryTimeOut等较为重要的数据库参数,并以此限定利用程序1般的运行环境。

Windows API接口函数在Win95系统提供的动态链接库中提供了1个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

通过此函数便可以实现对各种数据库格式的读取。

3、调用数据存取对象对非ACCESS数据库编程的方法及实在例

VB专业版中使用数据库存取对象变量(DAO)的方法最具有功能强大、编程灵活的特点。它能够在程序中存取ODBC 2.0的治理函数;可以控制多种记录集类型:Dynaset,Snapshot及Table记录集合对象;可以存储进程和查询动作;可以存取数据库集合对象,例如TableDefs,Fields,Indexes及QueryDefs;具有真实的事物处理能力。这类方法对数据库处理的大多数情况都非常适用。

从VB的程序代码的角度来看,提供给VB程序员的记录集对象(RecordSet)同所使用的数据库格式及类型是相互独立的。即对FoxPro等数据库依然可使用众多的数据库存取对象变量,这就为非ACCESS数据库的访问提供了最重要的条件和方法。

在VB中从1种数据库类型转化为另1种数据库类型几近不需要或只需要很少的代码修改。而且,虽然dBASE、Paradox本身的DDL(Data Definition Language,即数据定义语言)和DML(Data Manipulation Language,即数据操纵语言)是非结构化查询的,但它们依然可使用VB的SQL语句和JET引擎来操纵。

因此对FoxPro等非ACCESS数据库而言,调用数据库存取对象的方法一样也是1种最好的选择。

(1)非ACCESS数据库的新建及库结构的修改

VB专业版中的数据库存取对象变量可以分为两类,1类用于数据库结构的保护和治理,另1类用于数据的存取。其中表示数据库结构时可使用下面的对象:DataBase、TableDef、Field、Index,和3个集合(Collection):TableDefs、Fields和Indexes。每1个集合都是由若干个对象组成的,这些数据对象的集合可以完全看做是1个数组,并按数组的方法来调用。

1旦数据库对象建立后,便可以够用它对数据库的结构进行修改和数据处理。

对非ACCESS数据库,大部份都是对应于1个目录,所以可使用VB的MkDir语句先天生1个目录,亦即新建1个数据库。而每1个非ACCESS数据库文件可看做是此目录下的1个数据表(Table),但实际上它们是相互独立的。

下面是新建1个FoxPro 2.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$ ’新建1个子目录
Set Db1 = OpenDatabase(Path$, True, False, "FoxPro 2.5;")
Set Td = Db1.TableDefs
T1.Name = "MyDB" ’新建1个数据表,数据表名为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
T1.Fields.Append F3
Ix1.Name = "Name" ,Ix1.Fields = "Name", Ix1.Primary = True ’新建索引
T1.Indexes.Append Ix1 ’向数据库的Indexes集合中添加新的索引
Td.Append T1 ’向TableDefs集合中添加新表
Db1.Close ’必须先封闭数据库对象再退出
End Sub

在此段程序中值得留意的是,对非Access数据库的新建不用CreateDatabase函数,而是用OpenDatabase函数,这点与Access数据库大不1样,但也仅仅是针对非ACCESS数据库而言才能用OpenDatabase函数来新建1个数据库对象。

在VB中,外来数据库的不同格式只在OpenDatabase函数的最后1个参数Connect中有所体现,不同格式的外来数据库其Connect参数值也不同,除此之外,在VB专业版中其编程的方法和步骤及技能是基本相同的。

新建子目录后,不能用ChDir语句进进它,否则会出现“‘MyDB’ is not a valid path”的毛病。同时,对F1、F2、F3等新建字段对象的定义也必须分别定义,否则会出现“Element not defined”(变量未定义)的毛病。

通过1定的编程技能还可以实现非ACCESS数据库的库结构的拷贝,下面是1段相应的程序。

Function GetPos( TFname$ ) ’此自定义函数完成对领路径文件名中最后1个“\”符号的定位

以下为援用的内容:

Dim I As Integer,Tmp As String
Tmp$ = TFname$
For I = 0 To 255
Pos% = Pos% + InStr( 1, Tmp$, "\" )
E1% = InStr( 1, Tmp$, "\" )
Tmp$ = Right$( Tmp$, Len(TFname$) - Pos% )
If E1% = 0 Then ’找到最后1个“\”符号的位置,并记下来
GetPos = Pos%
Exit For
End If
Next I
End Funtion
Sub CopyStruc( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs, Fld As Fields
Dim Fname,SourceF,DestF,Path As String,Pos1 As Integer
CMD1.Filter = "FoxPro数据库文件(*.DBF)|*.DBF|所有文件|*.*" ’CMD1为1个对话框的控制名
CMD1.DialogTitle = "调进Ms FoxPro数据库文件"
CMD1.FilterIndex = 1
CMD1.Action = 1
DestF$ = InputBox$( "请输进目标文件名:", "输进对话框" )
If CMD1.FileName = “ ”Or DestF$ = " " Then
MsgBox "源文件或目标文件名为空"
Exit Sub
Else
SourceF$ = CMD1.Filename
End If
FileCopy SourceF$, DestF$
Pos1% = GetPos( SourceF$ )
Path$ = Left$( SourceF$, Pos1% ) ’取得源文件所在的路径名
Fn$ = Left$( DestF$, InStr(1, DestF$, ".") - 1 ) ’取得新文件的数据库名
’Fn$为实际的Foxpro数据库名,也即CreateDynaset函数内的source属性值
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then ’数据库内的无记录则退出
TotalNum% = 0
MsgBox "此数据表为空表!"
Exit Sub
End If
’删除记录,保存库结构
Ds1.MoveFirst
Do
Ds1.Delete
Ds1.MoveNext
Loop Until Ds1.EOF
End Sub

可见,拷贝库结构的方法在于把1个已存在的数据库拷贝到1个新文件中,然后再删除新文件内的所有记录,保存其库结构,得到的就是1个新建的库结构完全的空库。

(2)非ACCESS数据库的动态调进

在实际利用的很多情况下,常常需要在对1些事前其实不知道其具体库结构的数据库进行调进、显示及打印其记录。因此实现未知格式数据库的动态调进也是评价VB数据库利用程序兼容性的1个重要标志。

在VB中,网格控件非常适适用于浏览数据库中的数据,只需把数据放进网格即可。

在使用网格时动态调进的关键在于记录(Colume)内容和字段(Row)内容(包括字段的名称、类型、值等)的读取,因此天生1个可以对应于1个或多个数据表中的全部或部份记录的Dynaset对象是非常必要的。Dynaset对象还可以是1个动态查询的结果,能进行记录的增加、删除和修改等操纵。

下面是1段用网格显示FoxPro数据库的程序。

以下为援用的内容:

Sub DBLoad( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs,Fld As Fields
Dim Fname,Tmp,Path ToTalNum As String,I,J,Pos1 As Integer
Dim MyNum ’定义1个变体型数据
CMD1.Filter = "FoxPro数据库文件(*.DBF)|*.DBF|所有文件|*.*"
CMD1.DialogTitle = "调进Ms FoxPro数据库文件"
CMD1.FilterIndex = 1
CMD1.Action = 1
Fname$ = CMD1.Filename
Pos1% = GetPos( Fname$ )
Path$ = Left$( Fname$, Pos1% )
Tmp$ = Right$( Fname$, Len(Fname$)-Pos1)
Fn$ = Left$( Tmp$, Instr( 1,Tmp$,“.”) - 1 )
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then '数据库表内无记录则退出
TotalNum = 0
MsgBox "此数据表为空表!"
Exit Sub
Else '显示数据库表内的实际记录数
Ds1.MoveLast
TotalNum = Ds1.RecordCount
Grid1.Rows = TotalNum + 1 ’置网格的实际行数
Total.Caption = Str$(TotalNum)
End If
'置网格的实际列数并置每列的宽度
Set Td = Db1.TableDefs
Set Fld = Td( Fn$ ).Fields
Grid1.Cols = Fld.Count + 1
Grid1.ColWidth(0) = 600
For I = 1 To Fld.Count
Grid1.ColWidth(I) = 1500
Next I
'在网格的第1行内填进字段名
Grid1.Row = 0, Grid1.Col = 0
Grid1.Text = "序号"
For I = 1 To Fld.Count
Grid1.Col = I
Grid1.Text = Fld(I - 1).Name
Next I
'在网格中填进相应的数据
Ds1.MoveFirst
I = 1
Do While Not Ds1.EOF
Grid1.RowHeight(I) = 300
Grid1.Row = I
Grid1.Col = 0
Grid1.Text = I
For J = 1 To Fld.Count
Grid1.Col = J
MyNum = Ds1.Fields(J - 1).Value
'对记录的数据类型进行判定后做相应的处理
If IsNumeric( MyNum ) Or IsDate( MyNum ) Then
Grid1.Text = Str$( Ds1.Fields(J - 1).Value )
Else If VarType( MyNum ) = 8 Then
Grid1.Text = Ds1.Fields(J - 1).Value
Else If VarType( MyNum ) = 0 Or VarType( MyNum ) = 1 Then
Grid1.Text = " "
End If
On Error Resume Next
Next J
Ds1.MoveNext
I = I + 1
Loop
Ds1.Close
Db1.Close
Exit Sub

最后应记住,在VB的数据库利用程序运行之前,1定要在AUTOEXEC.BAT文件中加进1句SHARE.EXE /L:500。

以上所有程序均在Pentium/166机、中文Windows95下用VB4调试通过。

4、结束语

对非Access数据库的兼容是VB数据库编程中不可分割的重要部份。因此熟练掌控使用DAO方法对非ACCESS数据库的编程是极其重要的。并且,1定编程技能的利用也有助于弥补VB对外来数据库支持的不足。

http://www.fw8.net/


TAG:数据库,程序,格式,函数,对象
评论加载中...
内容:
评论者: 验证码: