Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1799066
  • 博文数量: 600
  • 博客积分: 10581
  • 博客等级: 上将
  • 技术积分: 6205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:13
文章分类
文章存档

2016年(2)

2015年(9)

2014年(8)

2013年(5)

2012年(8)

2011年(36)

2010年(34)

2009年(451)

2008年(47)

分类:

2009-10-11 11:14:50

VB数据库记录查询四法
 
    在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 tbl.Name
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 Error$ & " 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"
        Td.Name="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中进行数据库记录的查询操作,必需根据打开数据库的方式来确定。以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 tbl.Name
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 Error$ & " 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"
        Td.Name="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”即可访问你所要访问的外来数据库了。
    使用这种方法访问外来数据库应该注意的是,附加表在所加到的数据库中只是建立了一个链接关系,表的实际所在,仍然存在于原数据库中,该表在所附加到的数据库中被删除时,只是删掉了链接关系,实际的表并没有被删除。

 

阅读(1669) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~