1、第6章 VB数据库编程技术,61 数据库设计基础,62 本地数据库设计(ACCESS),63 数据控件,64 ODBC,65 ADO数据控件,66 VB中SQL的实现,67 VB中使用ODBC,68 网络数据库设计,VB中的数据库编程就是创建数据访问对象,这些数据访问对象对应于被访问物理数据库的不同部分,如数据库,表字段,索引等,同时用这些对象的属性和方法来实现对数据库的操作,以便在VB窗体中使用绑定和非绑定控件来显示操作结果并接收用户输入.,6.1 数据库设计基础,早期的Visual Basic数据访问工具是简单的ASCII文件访问工具。在Visual Basic 3.0时代,许多用户强调I
2、SAM(Indexed Sequential Access Method,索引顺序存取法)数据,为此Microsoft设计了Microsoft Jet Database Engine(或简称为Jet)和DAO(Data Access Object),使得Visual Basic Access开发人员很容易地同Jet接口,其操作针对记录和字段,主要用于开发单一的数据库应用程序。随着使用者需求的不断改变,Visual Basic又包含了更快的访问远程数据和对ODBC数据源访问的优化,出现了新的数据库接口RDO(Remote Data Object),它是访问关系型ODBC数据源的最佳界面接口,其操
3、作针对行和列。ADO(ActiveX Data Objects)作为另一种可供选择的技术出现,正在逐渐代替其他数据访问接口。ADO比DAO和RDO具有更好的灵活性,更易使用,实现的功能也更全面。,6.1 VB数据库访问技术的发展,6.1 数据库设计基础,ADO(ActiveX Data Object)是OLE DB数据访问方式 的一种主要对象模型。,6.1 数据库设计基础,DAO:数据访问对象是用来显露了Microsoft Jet数据库引擎(最早是给Microsoft Access 所使用,现在已经支持其它数据库),并允许开发者通过ODBC直接连接到其他数据库一样,直接连接到 Access 表
4、。DAO 最适用于单系统应用程序或在小范围本地分布使用。其内部已经对Jet数据库的访问进行了加速优化,而且其使用起来也是很方便的。所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式。 。,6.1 数据库设计基础,ADO(ActiveX Data Object)是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO“扩展“了DAO和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。 作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点
5、放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。,6.1 数据库设计基础,ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送
6、给ODBC。,6.1 数据库设计基础,OLE DB 是 Microsoft 的一个战略性系统级编程接口,用于管理整个组织内的数据。OLE DB 是建立在 ODBC 功能之上的一个开放规范。ODBC 是为访问关系型数据库而专门开发的,OLE DB 则用于访问关系型和非关系型信息源,例如主机 ISAM/VSAM 和层次数据库,电子邮件和文件系统存储,文本、图形和地理数据以及自定义业务对象。OLE DB 包含了一个连接 ODBC 的“桥梁”,对现用的各种 ODBC 关系型数据库驱动程序提供一贯的支持。,6.1 数据库设计基础,RDO(Remote Data Objects)远程数据对象是一个到ODB
7、C的、面向对象的数据访问接口,它同易于使用的DAO style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。,1. VB中的数据访问 VB提供的数据库引擎叫Jet。 VB提供了两种与Jet数据库引擎接口的方法:Data控件(Data Control)和数据访问对象(DAO)
8、。这两种方法可以同时使用。,6.1 数据库设计基础,Data控件提供了有限的 不需编程就能访问现存 数据库的功能,DAO模型是全面控制 数据库的完整编程接口,VB通过DAO、ADO和Jet引擎可以识别三类数据库: (1)VB数据库 也称本地数据库,本地数据库文件格式与Microsoft Access相同。Jet引擎直接创建和操作这些数据库。 (2)外部数据库 访问符合“索引顺序访问文件方法(ISAM)”数据库,包括:dBase III、dBase IV、Foxpro 2.0和2.5以及Paradox 3.x和4.x。 (3)ODBC数据库 访问符合ODBC标准的客户机服务器数据库,如Micro
9、soft SQL Server。,6.1 数据库设计基础,2 . VB数据库体系结构 Jet引擎负责处理存储、检索、更新数据的结构,并提供了功能强大的面向对象的DAO编程接口。 (1) VB数据库应用程序的组成 VB数据库应用程序包含三部分,如图6.1所示。,图6.1 VB数据库应用程序的组成,6.1 数据库设计基础,用户界面和应用程序代码 用户界面是用户所看见的用于交互的界面,它包括显示数据并允许用户查看或更新数据的窗体。驱动这些窗体的是应用程序的VB代码,包括用来请求数据库服务的数据访问对象和方法,比如添加或删除记录,或执行查询等。,6.1 数据库设计基础,Jet引擎 Jet引擎实际是一组
10、动态链接库(DLL)文件。在运行时,这些文件被链接到VB程序。它把应用程序的请求翻译成.mdb(Access文件后缀)文件或其他数据库的物理操作。 Jet引擎真正读取、写入和修改数据库,并处理所有内部事务,如索引、锁定、安全性和引用完整性。 Jet引擎包含一个查询处理器,接收并执行SQL查询,实现所需的数据操作。 Jet引擎包含一个结果处理器,用来管理查询所返回的结果。,6.1 数据库设计基础,数据库 数据库是包含数据库表的一个或多个文件。 本地VB或Access数据库文件后缀为mdb文件。 (2)数据库应用程序的存放 在单系统机中数据库、数据引擎和用户界面集中存放。 在客户机/服务器系统中,
11、数据库引擎和数据库一起被放置在服务器上。数据库引擎可以同时对多个客户机的应用程序提供服务、操作数据库并对每个本地应用程序返回所请求的记录。,6.1 数据库设计基础,6.1 数据库设计基础,服务器,客户机,客户机服务器引擎,通过ODBC方式使用。在VB中,通过连接到ODBC数据源,如Microsoft SQL Server等,可直接把查询传递给服务器数据库引擎。,VB中创建和访问数据库的途径主要有3个: 可视化数据管理器 使用可视化数据管理器,不需要编程就可以创建Jet数据库。 DAO 使用VB的DAO部件通过编程的方法创建数据库。 ISAM或ODBC VB可通过ISAM或ODBC驱动程序来访问
12、外部数据库数据库 ADO访问,6.2 本地数据库设计(ACCESS),1可视化数据管理器 数据管理器(Data Manager)是VB的一个传统成员,它可以用于快速地建立数据库结构及数据库内容。 可以完成有关数据库的操作,比如数据库结构的建立、记录的添加及修改以及用ODBC连接到服务器端的数据库如SQL Server等。 启动数据管理器选择“外接程序”菜单下的“可视化数据管理器”项就可以启动数据管理器,打开“VisData”窗口。,6.2 本地数据库设计(ACCESS),2)工具栏按钮,6.2 本地数据库设计(ACCESS),数据库窗口,SQL语句窗口,显示数据库的结构,包括表名、列名、索引,
13、可输入SQL命令,对数据库中的表进行查询操作,VisData窗口,6.2 本地数据库设计(ACCESS),设置记录集的访问方式,指定数据表中数据的显示方式,进行事务处理,6.2 本地数据库设计(ACCESS),表类型记录集按钮,允许直接对数据库中的数据进行增、删、改、查等操作。,动态集类型记录集按钮,将指定的数据打开并读入到内存中,进行数据编辑操作。,快照类型记录集,只能读数据不能修改,适用于只查询的情况,6.2 本地数据库设计(ACCESS),指定数据表中数据的显示方式,在新窗体上使用DATA控件,指定数据表中数据的显示方式,在新窗体上不使用DATA控件,指定数据表中数据的显示方式,在新窗体
14、上使用DBGrid控件,进入,2具体实现 1)建立数据库 数据库student.mdb(学生数据库)中的表定义:学生成绩表(学号,课程,成绩,学期)。,6.2 本地数据库设计(ACCESS),添加数据表 建立索引建立索引可以加快检索速度。 2)录入数据 3)建立查询 VB的数据管理器提供了一个图形化的设置查询条件的窗口查询生成器,6.3.1 数据控件属性,Data控件数据控件提供有限的不需编程而能访问现存数据库的功能,允许将Visual Basic的窗体与数据库方便地进行连接。 使用数据控件获取数据库中记录的集合,先在窗体上画出控件,再通过它的三个基本属性Connect、DatabaseNam
15、e和RecordSource设置要访问的数据资源。,6.2 数据控件,1Connect属性 Connect属性指定数据控件所要连接的数据库类型,Visual Basic默认的数据库是Access的MDB文件,也可连接ODBC等类型的数据库。 Access数据库的所有表都包含在一个MDB文件中。,6.3.1 数据控件属性,2DatabaseName属性 DatabaseName属性指定具体使用的数据库文件名,包括文件所在的路径名。 数据库中的基本表名可由RecordSource属性指定。 例如,要连接一个Microsoft Access的数据库存放在C:Student.mdb. 设置Databa
16、seName=”C:Student.mdb“,该方法可以通过属性栏设置,或在过程中指定. 在过程中可以使用相对路径来描述,DatabaseName=”Student.mdb“。,6.3.1 数据控件属性,3RecordSource属性 RecordSource确定具体可访问的记录集对象Recordset。 该属性值可以是数据库中的单个表名或者是使用SQL查询语言的一个查询。 例如,指定Student.mdb数据库中的基本情况表:RecordSource=”基本情况”。 例如,访问基本情况表中所有物理系学生的数据。RecordSource=”Select From 基本情况Where专业=物理
17、”,,6.3.1 数据控件属性,4RecordsetType属性 RecordsetType属性确定记录集类型。 (1)Table: 表记录集类型,一个记录集(单个表) (2)Dynaset: 动态集类型,一个动态记录集(多个表),默认值。 (3)Snapshot:快照类型,一个记录集静态副本(不可改) 5EofAction和BofAction属性 当记录指针指向Recordset对象的开始(第一个记录前)或结束(最后一个记录后)时,BofAction和EofAction属性的设置或返回值决定了数据控件要采取的操作。操作属性的取值如表6.1所示。,6.3.1 数据控件属性,6.3.1 数据控件
18、属性,焦点将从一个记录转换到另一 个记录之前,Validate 事件发生,6.3.1 数据控件属性,与数据控件绑定:数据控件本身不能直接显示记录集中的数据,必须通过能与它绑定的控件来实现。可与数据控件绑定的控件对象有文本框、标签、图像框、图形框、列表框、组合框、复选框、网格、DB列表框、DB组合框、DB网格和OLE容器等控件。 要使绑定控件能被数据库约束,必需在设计或运行时对上述控件的两个属性进行设置: DataSource属性 该属性通过指定个有效的数据控件连接到一个数据库上。 DataField属性 该属性设置数据库有效的字段与绑定控件建立联系。,6.3.1 数据控件属性,当上述控件与数据
19、控件绑定后,Visual Basic将当前记录的字段值赋给控件。 数据控件在装入数据库时,它把记录集的第一个记录作为当前记录。当数据控件的EofAction属性值设置为2时,当记录指针移过记录集结束位,数据控件会自动向记录集加入新的空记录。,绑定控件、数据控件和数据库三者的关系如图下示。,6.3.1 数据控件属性,例6.2 设计一个窗体用以显示建立的student.mdb数据库中基本情况表的内容。 要显示基本情况表中除了备注字段外的6个字段,故需要用6个绑定控件与之对应。这里用一个图形框显示照片和5个文本框显示学号、姓名等数据。,6.3.1 数据控件属性,进入,数据控件Data1属性设置 Co
20、nnect属性指定为Access类型 DatabaseName属性连接数据库Student.mdb RecordSource属性设置为“基本情况”表。 图片框和5个文本框控件属性设置 Text1Text5的DataSource属性设置成Data1。 Text1Text5的DataField属性分别选择与其对应的字段学号、姓名、性别、专业和出生年月。 Picture1的DataField属性选择字段照片,6.3.1 数据控件属性,进入,例6.3 用数据网格控件MsFlexGrid显示Student.mdb数据库中基本情况表的内容。,6.3.1 数据控件属性,进入,数据网格控件的DataSourc
21、e属性设置为一个Data控件,运行时网格控件的列标题会用Data控件的记录集里的数据自动地设置。 MsFlexGrid控件不是Visual Basic工具箱内的默认控件,需要在开发环境中选择“工程|部件”菜单命令,并在随即出现的对话框中选择“Microsoft FlexGrid Control 6.0”选项,将其添加到工具箱中。,6.3.1 数据控件属性,本例所用控件的属性设置如下表所示。,6.3.1 数据控件属性,注意:不可卷动列属性FixedCols=0与FixedCols=1的区别,进入,6.3.2 数据控件的事件和常用方法,1Reposition事件Reposition事件作用:显示当
22、前指针的位置。,6.3.2 数据控件的事件和常用方法,Private Sub Data1_Reposition()Data1.Caption = Data1.Recordset.AbsolutePosition + 1End Sub,AbsolutePosition属性指示当前指针值(从0开始)。当单击数据控件对象上的箭头按钮时,数据控件的标题区会显示记录的序号,6.3.2 数据控件的事件和常用方法,2.Validate事件的检查方法: Validate事件响应函数有两个参数Save和Action Save参数当被绑定的数据感知控件中的数据被改变时,其值为True,否则False,可以通过Sa
23、ve参数(True或False)判断被连接的数据(被绑定的控件) 是否发生变化。 Action参数由系统传给该事件过程,是一个整数,用来指明该事件的操作,也可以设置Action参数的值,把一个操作换成另一个操作。通过Action参数判断哪一种操作触发了Validate事件。,6.3.2 数据控件的事件和常用方法,6.3.2 数据控件的事件和常用方法,保存对 Recorded 对象的当前记录所做的所有更改。,例如,不允许用户在数据浏览时清空性别数据,可使用下列代码:,6.3.2 数据控件的事件和常用方法,Private Sub Data1_Validate(Action As Integer,_
24、 Save As Integer)If Save And Len(Trim(Text3.Text) = 0 ThenAction = 0MsgBox “性别不能为空!“End If End Sub,检查被数据控件绑定的控件Text3内的数据是否被清空。如果Text3内的数据发生变化,则Save参数返回True,若性别对应的文本框Text3被置空,则通过Action=0取消对数据控件的操作,去除前导空格和末尾空格,3 数据控件的常用方法 数据控件的内置功能很多,可以在代码中用数据控件的方法访问这些属性。,6.3.2 数据控件的事件和常用方法,3 数据控件的常用方法 1)Refresh方法 可以在
25、数据控件上使用Refresh方法来打开或重新打开数据库(如果 DatabaseName、ReadOnly或Connect属性的设置值发生改变)。,6.3.2 数据控件的事件和常用方法,6.3.2 数据控件的事件和常用方法,Private Sub Form_Load( )Dim Mpath As StringMpath=App.Path 获取当前路径If Right(mpath,1)”/” Then mpath=mpath+”/”Data1.DatabaseName=mpath+”Student.mdb” 连接数据库Data1.RecordSource= 基本情况”构成记录集对象Data1.Re
26、fresh 激活数据控件 End Sub,App 对象是通过关键字 App 访问的全局对象。它指定如下信息:应用程序的标题、版本信息、可执行文件的路径及名称以及是否运行前一个应用程序的示例。 Path返回或设置当前路径,在编程时无效,运行时有效。,RIGHT(cExpression, nCharacters) Function返回从右边数的n个字符。,2)UpdateControls方法 UpdateControls方法等效于用户更改了数据后,取消更改。,6.3.2 数据控件的事件和常用方法,3)UpdateRecord方法 对绑定控件内的数据修改后,数据控件需要移动记录集的指针才能保存修改。
27、如果使用UpdateRecord方法,可强制数据控件将绑定控件内的数据写入到数据库中,而不再触发Validate事件。,记录集Recordset常用的属性和方法。 1AbsolutePosition属性 AbsolutePosition返回当前指针值,如果是第1条记录,其值为0,该属性为只读属性。 2Bof和Eof的属性 Bof判定记录指针是否在首记录之前,若Bof为True,则当前位置位于记录集的第1条记录之前。 Eof判定记录指针是否在末记录之后,若Eof为True,则当前位置位于记录集的最后1条记录之后。,6.3.3 记录集的属性和方法,3Bookmark属性 Bookmark属性的值采
28、用字符串类型,用于设置或返回当前指针的标签。在程序中可以使用Bookmark属性重定位记录集的指针。 4Nomatch属性 在记录集中进行查找时,如果找到相匹配的记录,则Recordset的NoMatch属性为False,否则为True。该属性常与Bookmark属性一起使用。 5RecordCount属性 RecordCount属性对Recordset对象中的记录计数,使用 RecordCount 属性可确定 Recordset 对象中记录的数目。,6.3.3 记录集的属性和方法,6Move方法五种Move方法是: MoveFirst 将控件移动到第1条记录。 MoveLast 将控件移动到
29、最后一条记录。 MoveNext 将控件移动到后一条记录。 MovePrevious 将控件移动到前一条记录。 Move n 向前或向后移n条记录,n为指定的数值。,6.3.3 记录集的属性和方法,例6.4 设计一个窗体用以显示建立的student.mdb数据库中基本情况表的内容。在窗体上用4个命令按钮实现对数据库的操作。,图6.10 用按钮代替数据控件对象的箭头按钮,6.3.3 记录集的属性和方法,进入,命令按钮Command1_Click事件移至第1条记录,代码如下:,6.3.3 记录集的属性和方法,命令按钮Command4_Click事件移至最后一条记录,代码如下:,Private Su
30、b Command4_Click()Data1.Recordset.MoveLast End Sub,Private Sub Command1_Click()Data1.Recordset.MoveFirst End Sub,使用Move方法需要考虑Recordset对象的边界状态。如果越界,则用MoveFirst方法定位到第1条记录或用MoveLast方法定位到最后一条记录。 使用MoveFirst方法定位到第1条记录:,6.3.3 记录集的属性和方法,Private Sub Command2_Click()Data1.Recordset.MovePreviousIf Data1.Recor
31、dset.BOFThen Data1.Recordset.MoveFirst End Sub,使用MoveLast方法定位到最后一条记录:,6.3.3 记录集的属性和方法,Private Sub Command3_Click()Data1.Recordset.MoveNextIf Data1.Recordset.EOF Then Data1.Recordset.MoveLast End Sub,进入,7Find方法 使用Find方法可在Recordset对象中查找与指定条件相符的一条记录,并使之成为当前记录。 四种Find方法是: FindFirst方法 从记录集的开始查找满足条件的第1条记录
32、。 FindLast方法 从记录集的尾部向前查找满足条件的第l条记录。 FindNext方法 从当前记录开始查找满足条件的下一条记录。 FindPrevious方法 从当前记录开始查找满足条件的上一条记录。,6.3.3 记录集的属性和方法,Find方法的语法格式:4种格式相同数据集.Find方法 条件 搜索条件表达式:是一个指定字段与常量关系的字符串表达式。在构造表达式时,除了用普通的关系运算外,还可以用Like运算符。 例如,查找专业=物理的纪录 Data1.Recordset.FindFirst “专业=物理” 查找下一条符合条件的记录,可继续使用语句: Data1.Recordset.F
33、indNext “专业=物理”。,6.3.3 记录集的属性和方法,例如,要在记录集内查找专业名称中带有“建”字的专业:Data1.Recordset.FindFirst “专业 Like *建*” 如果Find方法找不到相匹配的记录,则记录保持在查找的始发处,Recordset的NoMatch属性为True。 如果Find方法找到相匹配的记录,则记录定位到该记录,Recordset的NoMatch属性为False。,6.3.3 记录集的属性和方法,6.3.3 记录集的属性和方法,Private Sub Command1_Click()Data1.Recordset.FindFirst “cou
34、rse=English”If Data1.Recordset.NoMatch Then MsgBox “No such record found”ElseMsgBox Data1.Recordset.Fields(“course” )End If End Sub,8Seek方法 Seek方法:是根据索引字段的值,查找与指定索引规则相符的第1条记录,并使之成为当前记录。 其语法格式为:数据表对象.seek comparison,keyl,key2 比较运算符comparison;可用的比较运算符有=、=、= Seek允许接受多个参数keyl,key2, ; 在使用Seek方法定位记录时,必须打开
35、索引文件,通过Index属性设置索引文件。,6.3.3 记录集的属性和方法,例如,假设数据库Student内基本情况表的索引字段为学号,满足学号字段值大于等于110001的第1条记录可使用以下程序代码:,6.3.3 记录集的属性和方法,Data1.RecordsetType = 1 设置记录集类型为Table Data1.RecordSource = “基本情况” 打开基本情况表单 Data1.Refresh Data1.Recordset.Index = “jbqk_no“ 打开名称为jbqk_no的索引 Data1.Recordset.Seek “=“, “110001“,数据库记录的增、
36、删、改操作需要使用AddNew、Delete、Edit、Update和Refresh方法。 它们的语法格式为:数据控件.记录集.方法名 1增加记录调用AddNew方法。给各字段赋值。给字段赋值格式为:Recordset.Fields(”字段名”)=值。,6.3.4 数据库记录的增删改操作,调用Update方法,将缓冲区内的数据写入数据库。 如果使用AddNew方法添加新的记录,但是没有使用Update方法而移动到其他记录,或者关闭记录集,那么所做的输入将全部丢失,而且没有任何警告。 当调用Update方法写入记录后,记录指针自动返回到添加新记录前的位置上,而不显示新记录。因此,需要在调用Upd
37、ate方法后,使用MoveLast方法将记录指针再次移到新记录上。,6.3.4 数据库记录的增删改操作,2删除记录定位被删除的记录使之成为当前记录。调用Delete方法。移动记录指针。 在使用Delete方法时,当前记录立即删除,不加任何的警告或者提示。 删除一条记录后,被数据库所约束的绑定控件仍旧显示该记录的内容。因此,必须移动记录指针刷新绑定控件,一般采用移至下一记录的处理方法。 在移动记录指针后,应该检查Eof属性,6.3.4 数据库记录的增删改操作,3编辑记录 数据控件自动提供了修改现有记录的能力,当直接改变被数据库所约束的绑定控件的内容后,需单击数据控件对象的任一箭头按钮来改变当前记
38、录,确定所做的修改。 使用程序代码修改当前记录步骤的为:调用Edit方法。给各字段赋值。调用Update方法,确定所做的修改。 如果要放弃对数据的所有修改,可用updatecontrols方法,重读数据库的数据,没有调用Update方法,数据的修改没有写入数据库,所以这样的记录会在刷新记录集时丢失。,6.3.4 数据库记录的增删改操作,图6.11 编程建立增、删、改、查功能,例6.5 设计一个窗体用以显示建立的student.mdb数据库中基本情况表的内容。并加入“新增”、“删除”、“修改”、“放弃”和“查找”钮,通过对5个按纽的编程建立增、删、改、查功能。,6.3.4 数据库记录的增删改操作
39、,进入,Command1_Click事件的功能: 当按钮提示为“新增”时调用AddNew方法,并将提示文字改为“确认”,同时使“删除”按钮Command2、“修改”按钮Command3和“查找”按钮Command5不可用,而使“放弃”按钮Command4可用。 新增记录后,需再次单击Command1调用Update方法确认添加的记录,再将提示文字改为“新增”,并使“删除”、“修改”和“查找”按钮可用,而使“放弃”按钮不可用。 On Error Resume Next语句表示在程序运行时发生错误,忽略错误行,继续执行下一语句。,6.3.4 数据库记录的增删改操作,6.3.4 数据库记录的增删改操
40、作,Private Sub Command1_Click()On Error Resume Next。Command2.Enabled = Not Command2.EnabledCommand3.Enabled = Not Command3.EnabledCommand4.Enabled = Not Command4.EnabledCommand5.Enabled = Not Command5.Enabled,6.3.4 数据库记录的增删改操作,If Command1.Caption = “新增“ ThenCommand1.Caption = “确认”Data1.Recordset.AddN
41、ewText1.SetFocusElseCommand1.Caption = “新增“Data1.Recordset.UpdateData1.Recordset.MoveLastEnd If End Sub,命令按钮Command2_Click事件功能:调用方法删除当前记录。当记录集中的记录全部被删除后,再执行Move语句将发生错误,这时由On Error Resume Next语句处理错误。,6.3.4 数据库记录的增删改操作,Private Sub Command2_Click()On Error Resume NextData1.Recordset.Delete Data1.Record
42、set.MoveNext If Data1.Recordset.EOF Then Data1.Recordset.MoveLast End Sub,命令按钮Command3_Click事件的功能:根据按钮提示文字调用Edit方法进入编辑状态或调用Update方法将修改后的数据写入到数据库,并控制其他3个按钮的可用性,代码如下:,6.3.4 数据库记录的增删改操作,Private Sub Command3_Click()On Error Resume NextCommand1.Enabled = Not Command1.EnabledCommand2.Enabled = Not Command
43、2.EnabledCommand4.Enabled = Not Command4.EnabledCommand5.Enabled = Not Command5.Enabled,6.3.4 数据库记录的增删改操作,If Command3.Caption = “修改“ ThenCommand3.Caption = “确认“Data1.Recordset.EditText1.SetFocusElseCommand3.Caption = “修改“Data1.Recordset.UpdateEnd If End Sub,命令按钮Command4_Click事件的功能:使用UpdateControls方法
44、放弃操作,代码如下:,6.3.4 数据库记录的增删改操作,Private Sub Command4_Click()On Error Resume NextCommand1.Caption = “新增“Command3.Caption = “修改“,6.3.4 数据库记录的增删改操作,Command1.Enabled = TrueCommand2.Enabled = TrueCommand3.Enabled = TrueCommand4.Enabled =falseCommand5.Enabled = TrueData1.UpdateControls Dala1.Recordset.MoveNe
45、xt End Sub,命令按钮Command5_Click事件的功能:根据输入专业使用SQL语句查找记录,代码如下:,6.3.4 数据库记录的增删改操作,Private Sub Command5_Click() Dim mzy As Stringmzy = InputBox$(“请输入专业“, “查找窗“)Data1.RecordSource = “Select * From 基本情况_Where 专业 = “ & mzy & “ “Data1.Refresh,上面的代码给出了数据表内数据处理的基本方法,6.3.4 数据库记录的增删改操作,If Data1.Recordset.EOF Then
46、MsgBox “无此专业!“, , “提示“Data1.RecordSource = “基本情况” Data1.RefreshEnd If End Sub,对于新记录或编辑过的记录必须要保证数据的完整性,这可通过Data1_Validate事件过滤无效记录。 例如,对学号字段进行测试,如果学号为空则输入无效。在例6.5中被学号字段所约束的绑定控件是Text1,可用Text1.DataChanged属性检测Text1控件所对应的当前记录中的字段值的内容是否发生了变化,Action=6表示Update操作。 可使用数据控件对象的任一箭头按钮来改变当前记录,以确定所做添加的新记录或对已有记录的修改
47、当单击数据控件的箭头按钮时触发Validate事件,Action取值14分别对应单击其中一个箭头按钮的操作,,6.3.4 数据库记录的增删改操作,6.3.4 数据库记录的增删改操作,Private Sub Data1_Validate(Action As Integer, Save As Integer)If Text1.Text = “ “ And (Action = 6 Or Text1.DataChanged) Action=6表示Update操作ThenMsgBox “数据不完整,必须要有学号!“Data1.UpdateControls 读回原数据End If,6.3.4 数据库记录的
48、增删改操作,If Action = 1 And Action = 4 ThenCommand1.Caption = “新增“Command3.Caption = “修改“Command1.Enabled = TrueCommand2.Enabled = TrueCommand3.Enabled = TrueCommand4.Enabled = FalseEnd If End Sub,MoveFirst,MoveLast,进入,1 ODBC概述 存在问题使用数据库系统所提供的专用开发工具(如嵌入式SQL语言),开发的应用程序只能运行在特定的数据库系统环境下,适应性和可移植性比较差。使用数据库系统
49、所提供的嵌入式SQL语言,一个应用程序只能连接同类的DBMS,而无法同时访问多个不同的DBMS;在实际应用中通常是需要同时访问多个不同的DBMS。这种情况下传统的数据库应用程序开发方法就难以实现。 为了解决这些问题,Microsoft公司开发了ODBC。,6.4 ODBC,ODBC(Open DataBase Connectivity,即开放数据库互连)是Microsoft公司开发的一套开放数据库系统应用程序接口规范,目前它已成为一种工业标准,它提供了统一的数据库应用编程接口(API),为应用程序提供了一套高层调用接口规范和基于动态连接库的运行支持环境。 使用ODBC开发数据库应用时,应用程序调用的是标准的ODBC函数和SQL语句,数据库底层操作由各个数据库的驱动程序完成。因此应用程序有很好的适应性和可移植性,并且具备了同时访问多种数据库管理系统的能力,从而彻底克服了传统数据库应用程序的缺陷。,6.4 ODBC,图6.12 ODBC的体系结构,2 ODBC体系结构,6.4 ODBC,