的
Recordset 对象,它的性能通常总是最好的。 为选择特定的 Recordset 类型,把 Data
控件的RecordsetType属性设成:
RecordSet记录集属性 BOF属性
当记录集记录指针指向第一条记录时返回True EOF属性 当记录集记录指针指向最后一条记录时返回True AbsloutePosition属性
返回当前记录集记录指针,第一条记录为0,是只读属性 Bookmark属性
String类型,返回或设置当前记录集记录指针的书签,是可读写属性。每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。 注意:程序中使用BookMark属性重定位记录指针,而不能使用Abslouteposition NoMatch属性
当我们使用Find方法查询时如果未找到则返回True。常与BookMark属性同时使用。 例如:查找[NAME]字段中第一个姓李的人
Dim
S As String With XXXX.RecordSet S = .BookMark .FindFirst "[NAME]
Like ’李*’" if .NoMatch then MsgBox "数据未找到“ .BookMark = S End
if End With
记录集方法 AddNew方法 向记录集增加一条新记录 Delete方法
从记录集中将当前记录删除。在删除后常使用MoveNext方法移动指针。 例如:
With
XXXX.RecordSet .Delete .MoveNext if .EOF then
.MoveLast End With
MoveXXXX方法 MoveFirst 将记录集指针移动到第一条记录上 MoveLast
将记录集指针移动到最后一条记录上 MovePrevious 将记录集指针移动到前一条记录上 MoveNext
将记录集指针移动到下一条记录上 FindXXXX方法 FindFirst在记录集中查询符合条件的第一条记录 FindLast
在记录集中查询符合条件的最后一条记录 FindPrevious 在记录集中查询符合条件的前一条记录 FindNext
在记录集中查询符合条件的下一条记录 好了,有了这么充分的知识了,编写两个按钮命令简直是小菜一碟,先来试一下,添一个“增加”命令按钮吧。
Private
Sub Command1_Click() Data1.Recordset.AddNew End
Sub
哇!怎么这么简单,再看一下“删除”命令按钮
Private Sub
Command2_Click() Data1.Recordset.Delete Data1.Recordset.AddNew End
Sub
就这样行了吗?运行程序吧,OK!一切正常,迫不及待地输入一条记录,点击“增加”按钮,怎么?出问题了!因为你只有在进行了AddNew方法后才可以输入数据,好吧,在窗口的初始化时就增加一条新记录吧。
Private
Sub Form_Initialize() Data1.Recordset.AddNew End
Sub 输入完了数据,我们打算退出程序,很自然的我们执行关闭窗口操作,就顺利地结束了输入工作。真的很顺利吗?打开数据库,看看数据库中的数据,我们发现刚才输入的最后一条记录没有存入数据库中。这个很好解释,每当我们调用AddNew方法时,它就将输入的记录存入数据库中,而当我们关闭窗口时,刚输入的记录并没有保存到数据库中,那么在关闭窗口之前对DATA控件进行一次刷新就可以将数据存入数据库中了。
Private
Sub Form_QueryUnload(Cancel As Inte ger, UnloadMode As
Integer) Data1.Refresh End
Sub
到了这里,我们似乎可以稍稍轻松了一点,这个窗口的功能差不多完成了。但是我不得不给你提出一个忠告:在数据库系统中,应尽量将错误在应用级上处理。这句话看起来似乎有点抽象,实际上用在这个程序中就简单多了。在表Register中,我们将出生日期定义为Date/Time类型,如果在程序运行时,在该字段对应的文本框中输入的不是Date/Time格式,在向数据库提交数据时会出现什么情况呢?数据库会向用户报告错误信息。然而这样对应用程序并不好,这样的错误应该由用户程序处理,而不是交给数据库去处理,所以在数据提交之前就应该检查该字段的输入是否合法。
Private
Sub Text3_LostFocus() If IsDate(Text3.Text) Or Text3.Text = "" Then
’检查是否输入合法数据 Exit Sub End If MsgBox
("输入错误,请输入你出生的年月日!") ,将选取不合法的数据,以便重新输入,并使控制焦点不动 Text3.SetFocus Text3.SelStart
= 0 Text3.SelLength = Len(Text3.Text) End
Sub
上面虽是应用程序处理错误的一个小例子,可是这种在应用级处理错误的思想是十分重要的。
五、寻寻觅觅 在数据库管理系统中,输入和查询就象两个孪生姐妹不可或缺,下面将介绍如何创建查询窗口。查询窗口的设计分为两部分:查询结果和查询条件。查询结果是指用户所需要的数据,它包括根据查询条件查询出来的记录,但并非表中每个字段里的数据都需要提供给用户。比如在我们这个例子中,登记表中的登记号的值是用户不感兴趣的,所以在查询结果中,我们不希望显示RegID字段的值。查询条件是用户提出的查询要求。比如在我们这个系统中,可以有姓名条件,当用户想知道某个人的具体情况,他可以输入此人的姓名,就查询出此人各方面的情况;也可以有年龄条件,当用户输入某个年龄段,就会查询出处于这个年龄段的所有人的信息。到底采用哪些查询条件,这需要开发者根据用户和系统的要求进行设计,其具体实现过程大都大同小异。为了节省篇幅,我们就仅以年龄为条件进行查询。查询窗口运行情况如图9。 在这个程序中我们使用了一个控件DBGrid,这个控件用来显示查询结果,选中VB的“工程”菜单下的“部件……”项,在控件标签中,选中“Microsoft
Data Bound Grid Control
5.0”即可,在工具箱中就会出现DBGrid控件的小图标。其使用和其它控件一样。 为了和数据库连接,DATA控件是不可少的,回忆一下,该怎样设置它的属性,OK!同输入窗口一样,在CONNECT属性中,选中“ACCESS”项。在DatabaseName属性中,输入“C:\TEMP\登记.mdb”。在RecordSource属性中,选中......嘿,嘿,这里稍微有点不同,如果按输入窗口那样的设置,查询结果中就会包含登记号字段了。在此属性中我们应该输入SQL语句: select
name as 姓名,sex as 性别,hometown as 籍贯,age as 年龄,birthday as 生日,company as
单位,address as 地址,zip as 邮编,telephone as 电话,fax as 传真 from
Register。别着急,尽管这条语句有点长,实际上却比较简单。这条语句的语法是: SELECT 字段名,字段名,……FROM 表名 WHERE
条件; 对照语法,我们可以看出输入的SQL语句的含义:从表Register中查询姓名,性别,籍费,……字段的值。只要在字段列表中不选中登记号字段,在查询结果中,就不会显示登记号的值了。如果你够细心的话就会注意到我们所写的SQL语句中在字段列表中并不仅仅输入字段名,在其后面还增加了as……项,如“name
as
姓名”,这是为name字段取一个别名“姓名”,以便在DBGrid控件中显示字段名时,就会显示“姓名”而不是“name”。 完成了DATA控件属性的设置就可以将DBGrid控件捆绑到DATA控件上,其方法同输入窗口。对了,将“DataSource”属性设置为“DATA1”即可。现在不妨运行一下程序,真令人兴奋,DBGrid显示出表中所有的信息。可是怎样显示符合条件的数据呢?再看一看上面的SQL语法,WHERE段后可以输入查询条件,比如:需要年龄在20到30岁之间的人员信息,其语句为:Select
name,... From register where age$#@62;20 and
age$#@60;30; 我们只要根据用户输入的条件构成新的SQL语句,并利用DATA控件的Refrensh方法刷新数据库,就可以完成条件查询了。 整个程序十分简单,当用户在文本框中输入年龄段后,点按“查询”命令,就会显示符合条件的查询结果。程序代码如下:
Option
Explicit Const allinfo = "select name as 姓名,sex as 性别,hometown as 籍贯,age as
年龄,birthday as 生日,company as 单位,address as 地址,zip as 邮编,telephone as 电话,fax as
传真 from 登记" ’定义不带条件的SQL查询语句
Private Sub Command1_Click() Dim t1, m, n
As String ’构造SQL语句的WHERE条件段 If IsNumeric(Text1.Text) Then m = " age
$#@62;" + Text1.Text End If If IsNumeric(Text2.Text) Then n = " age
$#@60; " + Text2.Text End If If m = "" And n = "" Then t1 =
"" Else If m = "" Then t1 = n Else If n = ""
Then t1 = m Else t1 = m + " and " + n End If End
If End If If t1 $#@60;$#@62; "" Then t1 = " where " + t1 End
If Data1.RecordSource = allinfo +
t1 ’将RecordSource属性的值设置为新的SQL语句 Data1.Refresh ‘刷新数据库,获得符合当前条件的查询结果 End
Sub
在这个程序中,你还可以加上姓名查询、籍贯查询等,其设计过程都是通过构造SQL语句来实现的。另外,还需要注意的一点是既然是查询窗口,当然允许修改,将DBGrid控件的AllowUpdate属性值设为False。OK!运行程序吧,啊!万事大吉。看一看应用程序,再看一看你编写的代码,不可思议,这么短的代码居然完成了这么强大的功能。事实就是这样,数据库编程中最重要的是对概念的清楚,与之相比,技巧好象摆在了次要位置。让我们闭上眼睛,想一想我们需要了解那些东西吧:DATA控件,RECORDSET对象、控件的捆绑、简单的SQL查询语句。熟悉了这些东西,你就可以进行数据库编程了,如果你对开发数据库系统比较感兴趣,可以再加强一下在数据库设计和SQL语句方面的知识。但数据库编程真的总是这样简单吗?如果已经熟悉了上面的内容,建议你看一下下面这一节。
六、拨云见雾 还记得我们在前面说过Visual
Basic 提供了两种与 Jet 数据库引擎接口的方法吗?Data 控件和数据访问对象。我们已经见识了DATA控件,确实给人意想不到的方便,但Data
控件只给出有限的访问现存数据库的功能。而 DAO
模型则可以全面控制数据库的完整编程接口。这两种方法事实上并不是互斥的,实际上,它们常同时使用。 DAO
模型是设计关系数据库系统结构的对象类集合。它们提供了完成管理这样一个系统所需的全部操作属性和方法,包括创建数据库,定义表、字段和索引,建立表间的关系,定位和查询数据库等工具。DAO结构的主要对象如图10所示。 Visual
Basic 中的数据库编程就是创建DAO(数据访问对象)。这些对象对应于被访问物理数据库的不同部分,如 Database、TableDef、Field 和
Index 对象,用这些对象的属性和方法来实现对数据库的操作,能够在 Visual Basic
窗体中使用绑定和非绑定控件来显示操作结果并接收用户输入。这样就简化了代码,它赋予程序员很大的灵活性。因为可以使用同样的对象、属性和方法来处理各种不同的数据库格式。同时,如果从一种数据库格式变到另一种格式(例如,将本地的
Microsoft Access 数据库转换为网络上的 SQL Server
数据库),只需变动少量的代码就可以适应这种改变。甚至可以创建这样的应用程序,在单一的查询或报表中连接来自多个不同数据库的表。 我们先介绍DAO对象,从上图中我们可以看到,DAO对象中最关键的是DBEngine对象,所有的数据库操作都要通过它来完成。
DBEngine对象 DBEngine对象相当于jet数据库引擎,不需要创建该对象。 CreateWorkspace方法:创建一个工作区对象 例如
: Dim ws As Workspace Set ws = DbEngine.CreateWorkspace
(SpName,UserID,password",SpType) 其中 SpName 工作区名称String UserID 用户名
String Password 口令String SpType 工作区类型 = dbUsejet jet工作区 =
dbUseODBCODBC工作区
Workspace对象 Workspace对象为用户定义一个会话,通过与之关联的用户名和口令建立一个安全级别。当不需要安全级别时可使用缺省的工作区DBEngine.Workspace。 方法: OpenDatebase
打开一个数据库 Close 关闭当前工作区 BeginTrans 启动一个事务 CommitTrans 提交当前事务 RollBack
回滚当前事务 例如我们需要打开一个数据库。 我们调用Workspace的OpenDatabase方法打开一个数据库。 例如: Dim
db As DataBase Set
db=OpenDatabase(dbname,exc,readonly,source) 其中: dbname
数据库文件名(对于单表数据库为路径) exc = TRUE 表示打开数据库后,该数据库不能被其它应用程序访问。 FALSE
表示共享地打开数据库 Readonly=TRUE 表示打开数据库后,只能对数据库进行读操作 =FALSE
表示打开数据库后,可对数据库进行读写操作 source数据源名,用于指定打开地数据库类型。
创建记录集 我们使用DataBase对象的OpenRecordSet方法打开一个记录集。 例如: Dim
rs As RecordSet Set rs=db.OpenRecordSet(source,type) 其中: source
指定记录集的内容,它可以是一个表名,查询名或SQL语句 type
创建记录集的类型 =dbOpenTable表型记录集 =dbOpenDynaset动态型记录集 =dbOpenSnapshot快照型记录集
访问ODBC数据库 Visual
Basic 通过 DAO 和 Jet 引擎可以识别三类数据库:Visual Basic 数据库,外部数据库,ODBC
数据库。在开发大中型数据库系统中一般都采用ODBC 数据库,如 Microsoft SQL Server等。DAO(数据访问对象)的 ODBCDirect
模式允许直接访问 ODBC 数据。另外,远程数据对象 (RDO) 库和远程数据控件 (RDC)也 允许直接访问 ODBC
数据。 要访问ODBC数据库需要两步,首先需要在WINDOWS 95 或WINDOWS
NT的控制面板中设置ODBC数据源名(DSN)。然后在OpenDatabase方法的Source参数中使用该数据源名。 例如:访问Microsoft
SQL
Server Source="ODBC;DSN=MyDSN;UID=sa;PWD=xx;DataBase=pubs" 在程序中使用DAO DAO的强大功能确实让人兴奋,只是较之DATA控件要复杂得多。在复杂的数据库处理中,这两种方法常常同时使用。要使用DAO,必须选中VB的“工程”菜单下的“部件……”项,在控件标签中选中"Microsoft
DAO 3.5 Object
Library"之后就可以在程序中定义DAO变量了。在这篇文章中我们所举的数据库例子比较简单,有兴趣的朋友不妨采用数据访问对象(DAO)来实现这个程序。
七、高屋建瓴 到了这里,似乎VB数据库编程的内容也差不多完整了,但是你完全可以再往前走一步。在目前的数据库开发过程中,客户/服务器体系结构占这个领域的主体地位,利用VB进行客户/服务器应用程序的开发是完全可行的。同时,在程序开发过程中,还可以利用面向对象技术,提高你的程序的可重用性和可维护性。总之,数据库应用程序的开发始终是技术上和理论上的热点。使用最高级的方法,最先进的技术,你会变得越来越COOL!
上一页 [1] [2] |