当前位置:文档之家› 数据库

数据库

Dim Con1 As ADODB.Connection
Dim Rs1 As ADODB.Recordset
Set Con1 = New ADODB.Connection
Con1.Open ″Provider=Microsoft.Jet.OLEDB.4.0?User ID=Admin?″ & _
Data Source="longtai.mdb"


″Mode=Share Deny None?Extended Properties=''?Persist Security Info=False?″ & _
″Jet OLEDB?Database Password='1234'?″


Set Rs1 = New ADODB.Recordset
Rs1.CursorType = adOpenKeyset
Rs1.LockType = adLockOptimistic
Rs1.Open ″SELECT ? FROM 表名″? LocCnn1?adCmdText

在VB中进行数据库记录的查询操作,必需根据打开数据库的方式来确定。以VB3.0为例,数据集对象有Table、Dynaset、Snapshot三种
,下面四种查询方法分别适用于以上面不同的对象方式打开的数据库。
1.用SEEK方法查询。这种方法只使用于以Opentable方式打开的Table类型的数据表,而且在查询之前必须要以查询字段建立索引文件,
由于已建立了索引文件,所以查询速度很快,这种方式的查询结果是将指针移到符合条件的第一个记录。例如:
set tb=db.opentable("demo")
tb.index="nameindex”
tb.seek "=","张三"
2.用FILTER属性查询。Filter属性是Dynaset和Snapshot对象才具备的,所以也只能适用于这两者,不能用于Table。Filter是
用来过滤数据的,只要我们给定过滤条件就可以将所需的记录筛选出来。需要说明的是,我们需要将以Filter属性筛选出来的数
据集打开才能对其操作。例如:
set dy1=db.createDynaset(”demo”)
dy1.filter=”姓名 like ’刘*’”
set dy2=dy1.createDynaset()
3.用FIND方法查询。FIND适用于Dynaset和Snapshot对象,有Findfirst和Findnext两个方法,每次查询到一个记录。例如:
set dy=db.createDynaset(”demo”:)
s=”工资>160 and姓名 like ’刘*’”
dy.findfirst s
dy.findnext s
4.用SQL查询。SQL是一种结构化数据查询语言,SQL也只能适用Dynaset和Snapshot数据集对象,这种方法是根据SQL条件生成一个数据集对象。例如:
s=”select * from demo where 姓名 like ’刘*’”
set dy=db.createDynaset(s)
〖注〗:本文中的db为数据库对象,打开方式为:
例如:set db=OpenDatabase(”C:\VB\SAMPLE.MDB”)。

谈谈VB的数据库编程方式
成都 郑剑敏
VB全称Visual Basic,是微软公司推出的基于Basic语言的可视化编程环境,以其简单易学功能强大而倍受广大电脑爱好者的青睐。
VB的数据库编程方面按其难易程度可分为三类(由易到难);
●使用数据库控制项和绑定控制项
●使用数据库对象变量进行编程
●直接调用ODBC2.0API
在使用VB进行数据库编程时,通常,会首先选择三种基本方法之一来进行数据库应用程序的方案设计, 现在就将以上三种设计方法的适应范围及其优缺点进行一个比较。
1 使用数据库

控制项和绑定控制项
1.1 优点
它是三种方法中编码量最小的
不必了解CDBC2.0API的细节
允许使用标准的和第三方厂商制订的控制项
简化了错误处理
支持所有的动态集方法及属性
1.2 缺点
不能存取快照对象(snapshop)对象或表格对象(都属于记录集对象)
不能存取数据库集合,比如表定义(TableDefs)字段(Fieds),索引( Indexes)及查询定义(QueryDefs)
只能存取部分ODBC2.0管理函数
不能进行真正的事务处理
有限的错误诊断功能
1.3 应用
对中小规模的数据库表(通常少于一千条记录)只进行简章的浏览操作
基本SQL查询所对应的结果集长度有限(通常结果集的记录数小于一百, 这些记录从一个或两个长度有限的表中检索出来)
应用程序的数据输入/输出项较少(通常只涉及一个或两个长度有限的表、并且表中的字段数在10个左右且不具有关系完整性限制

2 使用数据库对象变量进行编程
2.1 优点
可以在程序中存取ODBC2.0的管理函数
可以控制多种记录集类型:Dynaset、Snapshop及Table记录集合对象
可以存取存储过程和查询动作
可以存取数据库集合对象,例如TableDefs、Fields、Indexes及QueryDefs具有真正的事务处理能力 , 包括启动事务 ( Begintrans) 、 提交事务(CommitTrans)及回滚事务(Rollback)
2.2 缺点
比使用数据控制项的方法编码量较大
只能进行间接的错误处理和错误恢复
对每个数据库操作没有细粒度的控制
对结果集和包含结果集的内丰资源的操作受到限制
同直接使用ODBC2.0API函数的方法相比性能较低
2.3 应用
应用程序需要在执行期间动态地建立表、字段及索引
应用程序涉及同步更新几张表(但在逻辑上保持一致性)的复杂事务
应用程序使用结果集而不是Dynaset的窗体(FORMS),例如Snapshots或Tables,这里是设计要考虑的关键
应用程序的表非常大,多于1000条记录
应用程序具有复杂的数据输入/输出项,它涉及许多内部相关的字段并且包括数据库参照完整性或一致性规则
应用程序需要执行一些额外的操作和对结果集的查询后处理, 尤其是需要很高的数据格式化显示
应用程序需要利用复杂的ODBC管理功能以选择、配置、校验及建立各种数据源
应用程序需要在执行期间“显示”数据库的基本结构
应用程序需要使用复杂的多码索引方式来检索或更新记录
3 直接调用ODBC2.0API
3.1 优点
可以直接参与结果集的开发、管理及规范化
对结果集游标提供了更多的控制,并且提供了更多的游标类型和执行动作
能够确定ODBC驱动程序及SQL的一致性级别
可以更好地控制Windows的执行调度及资源利用
其他方面同其他方法差不多,因此这种方法很可能具有最好的性能
3

.2 缺点
较其他两种方法需要大量的代码
代码复杂并且要求程序员具有编制API调用的经验
在网络上Visual Basic运行期间库的错误处理缺乏安全性,因此代码运行期间出现的错误所造成的后果会非常严重
3.3 应用
如果系统环境为客户机/服务器模式下的大规模多用户环境,那么应用程序必须都能够准确地解决可能出现的系统错误和失败
应用程序强调资源使用,这里如何对内存、 网络服务器资源进行直接控制是首要的考虑因素
应用程序使用超大规模数据库,例如数据库表可能包含几万或几十万条记录

VB访问数据库方法简介
南京河海大学 陈鹏
Visual Basic(简称VB)是一种可视化的、事件驱动型的Windows应用程序开发工具,
它在GUI设计、绘图、制表、运算、通信和多媒体开发方面都具有简单易行、功能强大等优点
,所以越来越受到开发人员的亲睐。同时,VB在数据库开发方面也具有Foxpro所远不能及的强大功能。
VB能够读取和访问Access、Excel、DbaseX、Foxpro、Btrieve和ODBC等多种数据库,
并能利用VB自身所带的数据库引擎创建Access数据库。所以VB在管理信息系统(MIS)
的开发和建设方面得到了是益广泛的应用。现在,笔者就VB应用数据库的一些方法作一简单的介绍。
VB访问数据库通常有三种途径:第一,通过数据库控制控件Data Control访问;第二,通过VB提供
的数据库对象变量编程访问;第三,通过ODBC接口访问ODBC API函数。在这三种方法中,
第一种方法操作起来最方便、灵活、易于掌握,同时也最能体现Visual Basic面向对象的特色,
故这里以Foxpro2.5的数据库为例,介绍数据库控制控件(Data Control)访问数据库的方法与步骤:
一、 在Form窗口中加入Data Control控件
用鼠标在工具窗口的Data Control控件按钮上双击左键,该对象即出现在Form窗口的中间(控件名为Data1)
,用鼠标调整好控件的大小及位置。如工具箱中无此控件,可打开主菜单的Tools/Custom,在列表中
选中Microsoft Data Control复选框,确认后即可将此控件加入到工具箱中去。
二、 设置联接库
用鼠标单击Data1,按下F4,打开属性窗口,设置Connect属性为Foxpro2.5,设置DatabaseName 为c:\foxprow\student.dbf(假设磁盘上已有这个文件)。
三、 加入字段显示、编辑控件(数据库捆绑控件)
在Form窗口中加入DGrid控件,如不在此控件,可打开主菜单Tools/Custom,在列表中选择Apex Data BroundGrid复选框
,确认后即可向工具箱中加入此控件。在Form窗口中单击选中此控件(DGrid1),按下F4打开属性窗口,
设置Datasource属性为Data1,在Form窗口中用鼠标右键单击控件DGrid1,选择 Retrieve Fields;再用鼠
标右键单击

控件DGrid1,选择Edit,用鼠标调整控件及有关字段大小;再用鼠标右键单击控件DGrid1,选择
Properties(属性),在弹出窗口中,选择Colums标签,在下拉列表中选Colum1,将Caption属性改为
“学号”,选择Colum2,Caption属性改为“姓名”,选择Colum3、4将Caption属性改为“性别”、
“专业”,按下“确定”按钮。
再向Form窗口中加入一个按钮控件,将Caption属性设置为“退出”,双击该控件(Command1),在代码窗口中写入“END”,存盘。
此时,一个具备数据库读写、浏览功能的应用程序就建立了,按下F5运行,通过单击Data1的各按钮即可看出当前记录的变化情况。
在此基础上,我们还可以借助数据库控制控件的有关属性和方法进行更灵活的操作和控制。
1、 设置Data1.Visiable=False’将控件设为不可见
2、 将按钮Command2,3,4,5,6,7的Caption属性分别设置为“追加”、“首记录”、“上一条”、
“下一条”、“尾记录”、“删除”,双击各按钮,分别写入事件代码:
Sub Command1-Click() ’关闭应用程序
End
End Sub
Sub Command2-Click() ’追加记录
Data1.Recordset .Addnew
Data1.Recordset .Update
Data1.Recordset .MoveLast
End Sub
Sub Command3-Click() ’移向首记录
Data1.Recordset .MoveFirst
End Sub
Sub Command4-Click() ’移向上一条记录
Data1.Recordset .MovePrevius
If Data1.Recordset .Bof Then
Data1.Recordset .MoveFirst
End If
End Sub
Sub Command3-Click() ’移向尾记录
Data1.Recordset .MoveLast
End Sub
Sub Command4-Click() ’移向下一条记录
Data1.Recordset .MoveNext
If Data1.Recordset .Eof Then
Data1.Recordset .MoveLast
End If
End Sub
除此之外,数据库控制控件还有Bookmark、RecordCount等许多属性与方法,能对数据库进行各种方便的操作。
由此可见,数据库控制控件具有数据库操作方面的强大功能。另外,数据库控制控件的RecordSource 属性可
用一个SQL语句赋值,以此来有效地调用SQL语句,从而发挥SELECT语句强大的功能,更使数据库控制控件(Data Control)锦上添花。

真正删除数据库的记录
大家知道,缺省情况下,VB 删除记录只是把记录作上个删除标志而已,并没有真正删除。要真正删除记录,你可以使用 VB 提供的以下方法:
BeginTrans、CommitTrans、RollBack。其中,BeginTrans 方法开始记录数据库的变动,CommitTrans 方法确认数据库的变动,
而 RollBack 方法则可以恢复被删除或修改的记录。它们可以嵌套使用。因此,要恢复被删除的记录,应该在使用 BeginTrans
方法之后及使用 CommiTrans 方法之前使用 RollBack 方法。

不用 DATA 控件操作数据库文件
大家知道,在 VB 中如果使用 DATA 控件访问数据库,那么程序执行就必须要

一些大型 DLL 支持。这对于安装盘的发放是一个大问题。
那么,在 VB 中能不能不用 DATA 控件访问数据库呢?
在 VB 中不用 DATA 控件而访问数据库,只有一法:将数据库文件当成2进制文件打开。但此法最大困难就是你必须了解数据库文件的
结构形式。
比如:FoxBase的DBF文件(我不了解其它数据库的文件结构,大家可以去查查):它由记录头和记录构成。
而记录头又由两部分构成:记录头=数据库说明+字段说明。下面列出 FoxBase 数据库说明: FoxBase 数据库说明 起始地址 字节数 含义
1 1 FoxBase 数据库文件标志
2-4 3 最后一次修改日期,3个字节分别为年、月、日
5-8 4 文件记录总数
9-10 2 记录头长度
11-12 2 每个记录长度
13-22 20 未使用
下面列出字段说明,每个字段由 32 个字节构成。
字段说明 起始地址 字节数 含义
1-11 11 字段名称
12 1 字段类型(分别为C、N、D、L等)
13-16 4 该字段在文件中地址
17 1 字段长度
18 1 小数位数
19-32 14 未使用
知道了字段信息说明,就可以使用 复合变量 + 2进制文件 来操作数据库了。

Text 转换为 Access MDB
Text 文件类型在很多软件中都为一般应用程序与数据库之间架起一座桥梁。你可以使用 Text ISAM 驱动程序和 SQL 来
把 Text 文件转换成 Access MDB 数据库文件,首先,为文本文件创建一个 SCHEMA.INI 文件。然后,你可以使用下面的代码来实现转换:
Dim db As Database, tbl as TableDef
Set db = DBEngine.CreateDatabase(App.Path & "\mymdb.mdb", dbLangGeneral, dbVersion_0)
Set tbl = db.CreateTableDef("Temp")
tbl.Connect = "Text;database=c:\vbpj\data"
tbl.SourceTableName = "Customer#txt"
db.TableDefs.Append tbl
db.Execute "Select Temp.* into NewTable from Temp"
db.TableDefs.Delete https://www.doczj.com/doc/fb6533378.html,
db.Close
Set tbl = Nothing
Set db = Nothing

锁住数据库中的表
把表达式 True=False 放到表的 ValidationRule 属性就能锁上。 HardLockTable?实现了该功能。
声明
Public MyDB As Database
Dim Dummy As Integer
函数
Function HardLockTable (ByVal whichAction As String,?ByVal aTable As String) As Integer
On Error GoTo HardLockTableError
HardLockTable = True
Select Case whichAction
Case "Lock"
MyDB.TableDefs(aTable).ValidationRule = "True=False"
MyDB.TableDefs(aTable).ValidationText =?"This table locked via " & ?"ValidationRule on " & Now
Case "UnLock"
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
Case "TestThenUnLock"
If MyDB.TableDefs(aTable).ValidationRule = "True=False" Then
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
End If
End Select
HardLockTableErrorExit:
'subFlushDBEngine
'optional, see next suggestion
Exit Function
HardLockTableError:
HardLockTable = False
MsgBox E

rror$ & " error " & "in HardLockTable trying " & "to " & whichAction & " " & aTable
Resume HardLockTableErrorExit
End Function
使用例子
'上锁
Dummy = HardLockTable("Lock", "TestTable")
' 开锁
Dummy = HardLockTable("UnLock", "TestTable")

关闭所有的数据连接
如果在代码中使用了数据控件如 DAO, RDO, 或 ADO, 在退出时应该关闭所有打开的 recordset, database,和 workspace 。 虽然对象能自动注销, 但是数据连接不会马上断开, 可能会导致一些内存不能被系统重新分配。
下面的代码可以关闭所有打开的 DAO workspace, 并释放所占的内存。
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
'
Dim ws As Workspace
Dim db As Database
Dim rs As Recordset
'
For Each ws In Workspaces
For Each db In ws.Databases
For Each rs In db.Recordsets
rs.Close
Set rs = Nothing
Next
db.Close
Set db = Nothing
Next
ws.Close
Set ws = Nothing
Next
'
End Sub

如何删除FoxPro数据库的数据?
用VB对FOXPRO数据库操作,经常会遇到这样一个问题: 只能对记录进行DEL,也就是在该条记录上打一个删除标记,但不能 象在数据库中那样,用"PACK"把这条记录真正删除.当记录数较多时, 用DBGRID等控件做的程序都会出错.该怎样办呢?其实,VB中无法对DBF文件进行PACK。只能把ISAM的设置 Deleted设为On。这样相当于FoxPro的SET DELETED ON。不信你可以试一试。

VB应用小集----访问VB外来数据库
VB最引人注目的特点,也是其最令程序员关心的地方,就是它访问多种数据库的强大功能。
VB中将非MS Access数据库称为外来数据库(External Database),如dBASE、FoxPro、ODBC等。
VB中使用数据控制访问外来数据库同访问Access数据库类似,这里不再赘述,现在主要读一下
用生成对象的方法来访问外来数据库。访问外来数据库((以dBASE为例)大致分为以下几步:
第一步:建立一个Access型数据库,并在数据库中创建新表—即为附加表。通过设置
附加表的各属性值,使其与你所要访问的数据库建立链接关系。程序代码如下:
DimDbasDatabase
DimTdasNewTabledef
SetDb=OpenDatabase("MYDB.MDB")
Td.Connect="dBASE:DATABASE=c:\DATADIR"
Td.SourceTableName="AU THOR"
https://www.doczj.com/doc/fb6533378.html,="dBASEAuthorTable"
Db.tabledefsAppendTd
Db.close
第二步:设置INI文件路径。在VB的程序中使用了访问外来数据库操作,将应用程序生成EXE文件后,必须提供一个INI文件。若找不到这个INI文件,将会导致不能访问数据库,并出现“NOTFOUNDIN STOLLABKISAMS’的错误信息。设置INI文件路径后,VB的程序会在WINDOWS子目录中寻找与应用程序同名的INI文件。设置INI文件路径代码为:
SetDataAccessOption1,“Path\Filename”
第三步:编辑.INI文件可对不同种类的数据库进行设置,下面为一INI

文件代码:
[Options]
SystemDB=c: \MyPATH\SYSTEM.MDA
[ISAM]
PageTimeout=5
MaxBufferSize=128
LockRetry=20
CommitLockPetry=20
ReadAheadPages=16
[InstallableISAMs]
Paradox3.x=C:\VB\pdx110.DLL
FoxPro2.0=C:\VB\xbs110.DLL
FoxPro2.5=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
Btrieve=C:\VB\btrv110.DLL
[ParadoxISAM]
PageTimeout=600
ParadoxUsername=BaiUser
ParadoxNetPath=P:\PDXDB\
CollatingSeguence=Ascii
[dBASE]
centry=off
Data=American
Mark=47
Deleted=on
这样通过访问新数据库MYDB.MDB和表“DBASEAU THORTABK”即可访问你所要访问的外来数据库了。
使用这种方法访问外来数据库应该注意的是,附加表在所加到的数据库中只是建立了一个链接关系,表的实际所在,仍然存在于原数据库中,该表在所附加到的数据库中被删除时,只是删掉了链接关系,实际的表并没有被删除。


摘要:
本文从VB数据库体系结构的角度出发,结合一个具体实例,阐述了在VB中兼容非ACCESS格式数据库的具体方法和技巧。
关键词:VB、非ACCESS数据库、数据存取对象

一个完整的数据库管理系统(DBMS)应是能兼容市面上各种较流行数据格式的系统,它充分考虑了不同用户的实际要求。鉴于目前市面上有多种数据库格式(如Foxpro、DBase、Paradox等)流行,因而在VB数据库应用程序中兼容非Access数据库就显得尤为重要了。
作为一种流行的开发平台,VB提供了强大的数据库功能。主要有以下三种:数据控件法:使用数据存取对象(Data Access Object )法;直接调用ODBC 2.0 API接口函数法。其中调用数据存取对象的方法相对其它两种方法具有方便灵活、功能强大的突出优点。本文即从调用数据库存取对象的方法出发,实现了非Access格式数据库(以FoxPro数据库为例)的建新库、拷贝数据库结构、动态调入等操作,阐述了从编程技巧上弥补VB对这些外来数据库支持不足的可行性。

一、VB数据库的体系结构
VB数据库的核心结构是所谓的MicroSoft JET数据库引擎,它为VB与数据库的接口提供了基本的方法和手段
。JET引擎被Visual Basic、Microsoft Access和其它Microsoft产品所共享。因而在VB中Access数据库格式是一
种标准的内置格式,所有的非Access数据库都被称为外来数据库。
JET引擎的作用就像是一块“面板”,在其上可以插入多种索引顺序存取方法(即ISAM)数据驱动程序。
这就是VB对非Access数据库具有丰富支持的真正原因。VB专业版中提供了FoxPro、dBASE(或Xbase)、
Paradox、Btrieve等数据库的ISAM驱动程序,这就使得VB能支持这些数据库格式。另外,其他的许多兼容
ISAM的驱动程序也可以通过从厂商的售后服务得到。因

而从理论上说,VB能支持所有兼容ISAM的数据库格式
(前提是只需获得这些数据库的ISAM驱动接口程序)。

二、使用非Access数据库时的参数设置及配置文件的参数读取
值得注意的是,大多数的程序员都不注重数据库配置文件的使用,殊不知这是极为重要的。
如果在VB的程序中使用了数据库的操作,将应用程序生成EXE文件或打包生成安装程序后,则必须提供一个数据库配置(.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会显示一条错误信息“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接口函数在Win95系统提供的动态链接库中提供了一个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
通过此函数就能实现对各种数据库格式的读取。

三、调用数据存取对象对非Access数据库编程的方法及其实例
VB专业版中使用数据库存取对象变量(DAO)的方法最具有功能强大、编程灵活的特点。它能够在程序中
存取ODBC 2.0的管理函数;可以控制多种记录集类型:Dynaset,Snapshot及Table记录集合对象;可以存储过
程和查询动作;可以存取数据库集合对象,例如TableDefs,Fields,Indexes及QueryDefs;具有真正的事物
处理能力。这种方法对数据库处理的大多数情况都非常适用。
从VB的程序代码的角度来看,提供给VB程序员的记录集对象(RecordSet)同所使用的数据库格式及类型是
相互独立的。即对FoxPro等数据库仍然可以使用众多的数据库存取对象变量,这就为非Access数据库的访问
提供了最重要的前提和方法。
在VB中从一种数据库类型转化为另一种数据库类型几乎不需要或只需要很少的代码修改。而且,尽管dBASE、
Paradox本身的DDL(Data Definition Language,即数据定义语言)和DML(Data Manipulation Language,
即数据操纵语言)是非结构化查询的,但它们仍然可以使用VB的SQL语句和JET引擎来操纵。
因而对FoxPro等非Access数据库而言,调用数据库存取对象的方法同样也是一种最佳的选择。

(一)非Access数据库的新建及库结构的修改
VB专业版中的数据库存取对象变量可以分为两类,一类用于数据库结构的维护和管理,另一类用于数据的存取。
其中表示数据库结构时可以使用下面的对象:DataBase、TableDef、Field、Index,以及三个集合(Collection)
:TableDefs、Fields和Indexes。每一个集合都是由若干个对象组成的,这些数据对象的集合可以完全看作是一个数组
,并按数组的方法来调用。
一旦数据库对象建立后,就可以用它对数据库的结构进行修改和数据处理。
对于非Access数据库,大部分都是对应于一个目录,所以可以使用VB的MkDir语句先生成一个目录,亦即新建一个数据库。而每一个非Access数据库文件可看作是此目录下的一个数据表(Table),但实际上它们是互相独立的。
下面是新建一个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$ ’新建一个子目录
Set Db1 = OpenDatabase(Path$, True, False, "FoxPro 2.5;")
Set Td = Db1.TableDefs
https://www.doczj.com/doc/fb6533378.html, = "MyDB" ’新建一个数据表,数据表名为MyDB
F

https://www.doczj.com/doc/fb6533378.html, = "Name", F1.Type = DB_TEXT, F1.Size = 20
https://www.doczj.com/doc/fb6533378.html, = "Class", F2.Type = DB_TEXT, F2.Size = 20
https://www.doczj.com/doc/fb6533378.html, = "Grade", F3.Type = DB_INTEGER
T1.Fields.Append F1 ’向数据表中添加这些字段
T1.Fields.Append F2
T1.Fields.Append F3
https://www.doczj.com/doc/fb6533378.html, = "Name" ,Ix1.Fields = "Name", Ix1.Primary = True ’新建索引
T1.Indexes.Append Ix1 ’向数据库的Indexes集合中添加新的索引
Td.Append T1 ’向TableDefs集合中添加新表
Db1.Close ’必须先关闭数据库对象再退出
End Sub
在此段程序中值得注意的是,对非Access数据库的新建不用CreateDatabase函数,而是用OpenDatabase函数,这点与Access数据库大不一样,但也仅仅是针对非Access数据库而言才能用OpenDatabase函数来新建一个数据库对象。
在VB中,外来数据库的不同格式只在OpenDatabase函数的最后一个参数Connect中有所体现,不同格式的外来数据库其Connect参数值也不同,除此以外,在VB专业版中其编程的方法和步骤及技巧是基本相同的。
新建子目录后,不能用ChDir语句进入它,否则会出现“‘MyDB’ is not a valid path”的错误。同时,对F1、F2、F3等新建字段对象的定义也必须分别定义,否则会出现“Element not defined”(变量未定义)的错误。
通过一定的编程技巧还可以实现非Access数据库的库结构的拷贝,下面是一段相应的程序。
Function GetPos( TFname$ ) ’此自定义函数完成对带路径文件名中最后一个“\”符号的定位
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 ’找到最后一个“\”符号的位置,并记下来
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为一个对话框的控制名
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
可见,拷贝库结构的方法在于把一个已存在的数据库拷贝到一个新文件中,然后再删除新文件内的所有记录,保留其库结构,得到的就是一个新建的库结构完整的空库。

(二)非Access数据库的动态调入
在实际应用的很多情况下,经常需要在对一些事先并不知道其具体库结构的数据库进行调入、显示及打印其记录。因而实现未知格式数据库的动态调入也是评价VB数据库应用程序兼容性的一个重要标志。
在VB中,网格控件非常适合用于浏览数据库中的数据,只需把数据放入网格即可。
在使用网格时动态调入的关键在于记录(Colume)内容和字段(Row)内容(包括字段的名称、类型、值等)的读取,因而生成一个可以对应于一个或多个数据表中的全部或部分记录的Dynaset对象是非常必要的。Dynaset对象还可以是一个动态查询的结果,能进行记录的增加、删除和修改等操作。
下面是一段用网格显示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 ’定义一个变体型数据
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
'在网格的第一行内填入字段名
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的数据库应用程序运行之前,一定要在AUTOEXEC.BAT文件中加入一句SHARE.EXE /L:500。
以上所有程序均在Pentium/166机、中文Windows95下用VB4调试通过。

四、结束语
对非Access数据库的兼容是VB数据库编程中不可分割的重要部分。因而熟练掌握使用DAO方法对非Access数据库的编程是极为重要的。并且,一定编程技巧的应用也有助于弥补VB对外来数据库支持的不足。

参考文献
1 【美】Que CorPoration 《开放数据库互连—ODBC 2.0使用大全》
清华大学出版社 1995;18:255~276
2 美 Darwin Boyle等 《 Visual Basic 4 Developer's Guide 》
北京:机械工业出版社 1997.1
3 美 Stefano Maruzzi 《The Microsoft Windows 95 Developer's Guide》
北京:机械工业出版社 1997.1









相关主题
文本预览
相关文档 最新文档