了解Visual Basic数据库编程技术
报表设计。
在计算机应用系统中,对于大量的数据,通常使用数据库技术来存储管理要比通过文件来存储管理有更高的效率。Visual Basic具有强大的数据库操作功能,提供包含数据管理器(Data Manager)、数据控件(Data Control)以及ADO(Active Data Object)等功能强大的工具,Visual Basic能够将Windows的各种先进性与数据库有机地结合在一起,可以很好地实现数据库的存取界面,开发出实用便利的数据库应用程序。 10.1 数据库概述 10.1.1 数据库的基本概念 1. 数据库(Data Base) 大部分应用程序都需要存放大量的数据,并将其组织成易于读取的格式。这种要求常常通过数据库管理系统(Data Base Management System,DBMS)来实现。 数据库是以一定的组织方式存储在计算机的外存储器中的、相互关联的数据的集合。数据库为满足某一组织中多个用户的多种应用而建立。 数据库具有数据的共享性、数据的独立性、数据的完整性和数据冗余少等特点。 数据库管理系统(DBMS)是管理和维护数据库的软件系统,用户通过DBMS存取数据库。数据库管理系统具有数据定义、数据存取、数据库运行管理以及数据库的建立、维护和数据库通信等功能。 数据库按其结构可分为层次数据库、网状数据库和关系数据库。其中关系数据库是目前应用最广泛的一种数据库。关系数据库可采用现代数学理论和方法对数据进行处理,提供了结构化查询语言SQL。支持关系数据库的数据库管理系统称为关系型数据库管理系统。目前比较流行的大中型的关系型数据库管理系统有Oracle、Sybase、Informix、Microsoft SQL Server等,它们功能强大、性能稳定,应用十分广泛。在Windows环境下Visual FoxPro、Microsoft Access等小型桌面数据库管理系统应用比较普遍。 2. 关系数据库 关系数据库是根据表、记录和字段之间的关系进行组织和访问的一种数据库,它通过若干个表(Table)来存储数据,并且通过关系(Relation)将这些表联系在一起。 数据表是由行和列组成的数据集合,类似于工作单表。例如,一张表可能包含有关学生的一系列信息,诸如他们的姓名、学号、年龄、性别等,如表10.1所示。
所属院系 信息学院 信息学院 经管学院 经管学院 数学学院 数据表中的列称为字段(Field),行称为记录(Record)。字段对应表格中的数据项,每个数据项的名称称为字段名,如学号、姓名等都是字段名。字段的取值范围称为域,通常用字段描述表格实体在某一方面的属性。记录是字段值的集合,如姓名为“张三丰”对应的行中所有数据即是一条记录。记录中的每个字段的取值称为字段值或分量。记录中的数据随着每一行记录的不同而变化。 多个相互关联的数据表组成一个数据库(Database)。例如,一个学生成绩管理数据库(St.mdb)由学生基本情况表(xsjbqk)和学生成绩表(xscjb)组成。学生成绩表保存了学生的成绩,如表10.2所示,这个表中的记录可以通过学生的学号与学生基本情况表中的记录关联起来。
程序设计 78 82 80 77 89 10.1.2 结构化查询语言SQL 数据库管理系统提供数据操纵语言,以方便用户和程序员访问数据库中的数据,而不必详细了解数据库是如何存储数据或数据存在何处等问题。 SQL(Structure Query Language)语言,即结构化查询语言,是一种用于数据库查询和编程的非过程化高级语言。在查询数据时,只需指出“要什么”,而不需要指出如何实现的过程。由于它功能丰富、使用方式灵活、语言简洁易学,现已成为关系数据库语言的国际标准。使用SQL可以完成定义关系模式,录入数据,建立数据库,查询、更新、维护数据库,数据库重构,数据库安全控制等一系列的操作要求。 SQL语言由若干个SQL语句组成,用于操作数据及数据表数据。常用的SQL语句有:
CREATE VIEW 创建视图,即由一个或几个表定义的虚表。 (2)数据查询语句 Select语句,从现有的数据库中一个表或多个关系中检索数据,它是所有SQL语句中最常用的一个,格式为: Select <字段名列表> Form <表名〉 Where <条件> [Group By <列名> [Having <条件>]] [Order By <列名> [ASC | Desc} 其中,“字段名列表”可以是一个,也可以是多个,多个字段名之间用逗号分开,当要查询表中所有列时,则可用“*”代表。“条件”是一个逻辑表达式,SQL条件运算符除了AND,OR,NOT逻辑运算符以及=,<,<=,>,>=,<>比较运算符外,还可以使用BETWEEN(指定运算值范围)、LIKE(格式相符)和IN(指定记录)。Group 为分组,Order 为排序。 例如,使用Select语句查询信息学院学生的姓名、性别: Select姓名,性别 From xsjbqk Where (所属院系 = '信息学院' ) Select 语句可以嵌套,也可以进行多表查询。更多的使用方法请参阅其他有关书籍。
UPDATE语句 用来按照指定条件修改表中的记录。
ROLLBACK语句 撤销一个事务。 具体的数据库管理系统,除支持标准的SQL语言外,还常常对SQL进行一些扩充,以方便用户操作。在Visual Basic 中可以利用数据管理器的SQL语句窗口,直接输入各种SQL语句,以测试输入命令的正确性及执行结果。 10.1.3 数据库管理器 Visual Basic所支持的不同类型的数据库通常可以通过相关的数据库管理系统来建立。如果没有相应的数据库管理系统,可以使用Visual Basic的数据管理器来管理数据库。可视化数据管理器(Visual Data Manager),如图10.1,是Visual Basic提供的一个有关数据库操作的实用工具,用它可以方便地进行建立数据库,对数据进行增、删、修改等操作,而不需要编写任何代码。但它不适合应用于大型数据库中。Visual Basic默认的数据库是Access数据库,可以用数据管理器直接创建Access数据库等。 选择“外接程序”菜单的“可视化数据管理器”命令可启动数据管理器,进入数据库设计界面,如图10.1。也可以不进入Visual Basic环境,直接运行Visual Basic安装目录下的VisData.exe来启动可视化数据管理器。
图10.1 数据管理器 选择数据管理器的“文件”菜单中的“新建”命令或“打开”命令,可新建一个数据库或打开一个已存在的数据库,之后,数据管理器出现“数据库窗口”和“SQL语句”两个窗口,如图10.2所示。 数据管理器左面的“数据库窗口”用于列出指定数据库包含的表名及结构,在此窗口内可以对表或记录进行操作。 要建立数据库,用鼠标右键单击数据库窗口,在弹出菜单中选择“新建表”命令,则出现如图10.3所示的“表结构”对话框,根据对话框的提示可建立数据表结构。
图10.2 新建或打开一个数据库
图10.3 “表结构”对话框 数据表的结构建立好以后,就可输入记录。在可视化数据管理器内用鼠标左键双击出现在数据库窗口中的表名,打开如图10.4所示的表格输入窗口,选择对应按钮就可进行添加、编辑、删除记录等操作。
图10.4 表格输入窗口 Visual Basic具有数据库联接和数据处理功能,因此可以把它作为数据库应用程序的开发环境。用Visual Basic作为数据库的开发平台具有简单、灵活和可扩充性等特点。 Visual Basic提供了两种与数据库引擎接口的方法:数据控件和数据访问对象。数据控件只给出有限的不需要编程而能访问现存数据库的功能,允许将Visual Basic的窗体与数据库方便地进行连接。 Data控件在工具箱中,不需要特殊的步骤加入,但要利用数据控件返回数据库中记录的集合,必须通过它的属性设置。使用数据控件,不需要编写代码就可以实现以下操作: (1)与本地或远程的数据库建立连接。 (2)对连接的数据库执行SQL查询,打开指定的数据表或定义记录集。 (3)把数据字段传送到各种约束控件,并可在约束控件中显示或修改数据字段的值。 (4)根据约束字段中数据的变化,添加新记录或更新数据库。 (5)捕获访问数据时出现的错误。 (6)关闭数据库。 Data控件可以使用三种类型的Recordset对象中的任何一种来提供对存储在数据库中数据的访问。Recordset(记录集)作为一个对象,可以是数据库中的一组记录,也可以是整个数据表或者表的一部分。记录集分为三种类型:Table、Dynaset和Snapshot。表类型记录集(Table)包含表中所有记录,对数据表中的数据所进行的增加、删除、修改等操作,直接更新数据。动态集类型记录集(Dynaset)可以包含来自于一个或多个表中记录的集合,对这种类型的数据表所进行的各种操作都先在内存中进行,以提高运行速度。以快照类型记录集(Snapshot)打开的数据表或由查询返回的数据仅供读取而不能更改,主要适用于进行查询工作。 双击Data控件或单击后在窗体上拖动出控件的大小,都可以看到Data控件的外观,如图10.5所示。
图10.5 Date控件的外观 10.2.1 常用属性、方法和事件 Data控件的属性有些可用于其他控件,有些则是Data控件所特有的。表10.3列出了Date控件的一些常用属性。
说 明 指定链接的数据库的类型,默认值为Access 用于确定数据控件使用的数据库的完整路径 指定数据控件所链接的记录来源,可以是数据表名,也可以是查询名 指定数据控件存放记录集的类型,默认为Dynaset 当移动到记录开始时程序将执行的操作 当移动到记录结尾时程序将执行的操作 控制能否对记录集进行写操作。 1. Data控件和Recordset对象的方法 (1)AddNew方法:用于添加一个新记录,新记录的每个字段如果有默认值,则以默认值表示,如果没有则为空白。例如,给Data1的记录集添加新记录: Data1.Recordset.AddNew (2)Delete方法:用于删除当前记录的内容,在删除后应将当前记录移到下一个记录。例如,删除数据库中的当前记录: Data1.Recordset.Delete (3)Find方法:用于在记录集中查找符合条件的记录。如果条件符合,则记录指针将定位在找到的记录上。Find方法包括: FindFirst方法:查找符合条件的第一条记录。 FindLast方法:查找符合条件的最后一条记录。 FindPrevious方法:查找符合条件的上一条记录。 FindNext方法:查找符合条件的下一条记录。 例如,在学生基本情况表中查找政治面貌为党员的第一条记录: Data1.Recordset.FindFirst "政治面貌='党员'" 当在数据表类型记录集进行查找时,还可以使用Seek方法。如果找不到符合条件的记录,应显示相关信息以提示用户,这可通过判断NoMatch属性来实现,如: If Data1.Recordset.NoMatch Then MsgBox "找不到符合条件的记录" (4)Move方法:可以使不同的记录成为当前记录,常用于浏览数据库中的数据。Move方法包括:Move,MoveFirst,MoveLast,MovePrevious和MoveNext方法。 如果Data控件定位在记录集的最后一条记录上,这时继续向后移动记录,就会使得记录集的EOF属性值变为True,不能再使用MoveNext方法向下移动记录,否则会产生错误。从而在使用MoveNext方法移动记录时应该先检测一下记录集的EOF属性: If Data1.Recordset.EOF = False Then Data1.Recordset.MoveNext …… '处理当前记录 Else Data1.Recordset.MoveLast End If 使用MovePrevious方法移动当前记录同样会出现与MoveNext方法类似的问题。因此,在使用MovePrevious方法时也应该先检测一下记录集的BOF属性。 (5)Refresh方法:主要用来建立或重新显示与Data控件相连接的数据库记录集。如果在程序运行过程中修改了数据控件的DatabaseName,ReadOnly,Exclusive或Connect属性的设置值,就必须用该方法来刷新记录集: Data1.Refresh (6)Update方法:用于将修改的记录内容保存到数据库中。例如,在编辑完当前记录后,可用Update方法保存最新的修改: Data1.Recordset.Update (7)UpdateControls方法:可以从数据控件的记录集中再取回原先的记录内容,即恢复原先的值,取消修改。其格式为: Data1.UpdateControls 2. Data控件的事件 除具有标准控件所具有的事件之外,Data控件还具有几个与数据库访问有关的特有事件:Reposition事件和Validate事件。 (1)Reposition事件:当用户单击Data控件上某个箭头按钮,或者在应用程序中使用了某个Move或Find方法时,一个新记录成为当前记录,均会触发Reposition事件。例如,用这个事件来显示当前记录指针的位置的代码为: Private Sub Data1_Reposition() Data1.Caption = Data1.Recordset.AbsolutePosition + 1 End Sub (2)Validate事件:当某一记录成为当前记录之前,或是在Update,Delete,Unload或Close操作之前触发该事件。Validate事件的格式为: Private Sub Data1_Validate(Action As Integer, Save As Integer) 其中,Action用来指示引发这种事件的操作,Save用来指定被连接的数据是否进行了修改。例如,在Validate事件触发时确定记录内容是否修改,如果不修改则恢复: If Save = True Then mb = MsgBox("要保存修改吗?", vbYesNo) If mb = vbNo Then Save = False Data1.UpdateControls End If End If 10.2.2 用控件显示数据 在Visual Basic中数据控件本身只能进行数据库中数据的操作,不能独立进行数据的浏览,所以需要把具有数据绑定功能的控件同数据控件结合起来使用,共同完成数据的显示、查询等。Visual Basic中可与数据控件关联(或绑定)的控件有PictureBox,Label,TextBox,CheckBox,Image,ListBox和ComBox控件等。与Data控件绑定的控件也称为数据感知控件。 数据感知控件的DataSource属性用于指定数据控件名,DataField属性用于在下拉列表中选择要显示的字段名称。在设置了DataSource和DataField属性之后,当用户用该控件来在Recordset中访问记录时,就会自动显示出指定字段的内容。 【例10-1】 创建一个学生基本情况录入界面,如图10.6所示。
图10.6 学生基本情况表 首先在窗体上增加一个数据控件Data1,并将其Align属性设为2-AlignBottom,使之位于窗体的下端,DatabaseName属性设为St.mdb,RecordSource属性为“学生基本情况”数据表。然后在窗体上增加一个命令按钮数组Command1(0)~Command1(3),一个标签控件组Label1,一个文本框控件数组Text1(0)~Text1(5),并将Text1(0)~Text1(5)的DataSource属性均设为Data1,DataField属性分别为:学号、姓名、性别、出生年月、政治面貌和所在院系。 编写程序代码如下: Private Sub Data1_Reposition() Data1.Caption = "记录" & Data1.Recordset.AbsolutePosition + 1 End Sub Private Sub Data1_Validate(Action As Integer, Save As Integer) If Save = True Then mb = MsgBox("要保存吗?", vbYesNo, "保存记录") If mb = vbNo Then Save = False Data1.UpdateControls End If End If End Sub Private Sub Edit_Click(Index As Integer) Select Case Index Case 0 '添加记录 Data1.Recordset.AddNew Case 1 '删除记录 mb = MsgBox("要删除吗?", vbYesNo, "删除记录") If mb = vbYes Then Data1.Recordset.Delete Data1.Recordset.MoveLast End If Case 2 '更新记录 Data1.UpdateRecord Data1.Recordset.Bookmark = Data1.Recordset.LastModified Case 3 '退出 Unload Me End Select End Sub 在Visual Basic中,用户可用的数据访问接口有三种,即ActiveX数据对象(ADO:Active Data Object)、数据访问对象(DAO:Data Access Object)和远程数据对象(RDO:Remote Data Object)。数据访问接口是一个对象模型,它代表了数据访问的各个方面。使用Visual Basic 可以在任何应用程序中通过编程来访问及控制数据库连接、命令语句并获得访问数据。 数据访问技术在不断发展,以上三种每一种都代表了该技术的不同发展阶段。其中ADO是DAO/RDO 的后继产物,代表了Microsoft公司未来的数据访问策略,也是最简单、最灵活的数据访问接口,其主要优点是易于使用、速度快、内存支出少,支持建立Clients/Server和基于Web的应用程序的关键功能。ADO是实现Internet数据库访问的 基础。 10.3.1 ADO对象模型 在Visual Basic中,提供了Access/Jet,ODBC,Oracle以及SQL Server等OLE DB数据源,ADO访问数据是通过OLE DB来实现的,它是连接应用程序和OLE DB数据源之间的一座桥梁,提供的编程模型可以完成几乎所有的访问和更新数据源的操作。 ADO对象模型定义了一个可编程的分层的对象集合,它支持部件对象模型和OLE DB数据源。ADO对象模型(如图10.7)主要包括:Connection对象、Command对象和Recordset对象等。
图10.7 ADO 对象模型 Connection对象用于建立与数据源的连接。连接是交换数据所必需的环境,通过连接,可使应用程序访问数据源。 Command对象描述将对数据源执行的命令。在建立Command后,可以发出命令操作数据源。一般情况下,命令可以在数据源中添加、删除或更新数据,或者在表中查询 数据。 Recordset对象只代表记录集,是基于某一连接的表或是Command对象的执行结果。Recorset对象是在行中检查和修改数据最主要的方法,常用于指定行、移动行,添加、删除或更改行。 使用ADO对象模型的Connection,Command和Recordset对象编程之前,应将ADO函数库设置为引用项目。这可通过在工程菜单中的引用命令对话框,选择“Microsoft ActiveX Data Object 2.1 Library”来实现。 10.3.2 使用ADO Data控件 尽管可以在应用程序中直接使用ADO数据对象,但Visual Basic提供的ADO Data控件有作为一个图形控件的优势(具有向前、向后的按钮),以及一个易于使用的界面,从而可以用最少的代码创建数据库应用程序。 由于ADO Data控件属于ActiveX控件,每次创建工程时都应选择“部件”中的“Microsoft ADO Data Control (OLEDB)”复选框,则ADO Data控件的图标就会出现在工具箱中。双击ADO Data控件的图标,或者单击后在窗体上画出控件,都可以在窗体上添加ADO Data控件,其外观与Data控件的外观相似,默认名称为Adodc1。 1. ADO Data控件的属性 ADO Data控件的常用属性如表10.4所示。
说 明 设置到数据源的连接信息,可为OLE DB文件(.udl)、ODBC数据源(.dsn)或连接字符串。 返回或设置一个记录集的查询,用于决定从数据库中查询什么信息。 设置或返回RecordSource的类型。 设定对数据的操作范围。 用户名称,当数据库受密码保护时,需要指定该属性。 设置Recordset对象创建过程所使用的口令,当访问一个受保护的数据库时是必需的。
ADO Data控件的大多数属性可以通过“属性页”对话框设置。用鼠标右键单击ADO Data控件,在弹出的快捷菜单中选择“ADODC属性”,即可打开“属性页”对话框,如图10.8所示。
图10.8 属性页对话框 要使用ADO数据控件,首先需要连接数据源,也就是设置ConnectionString属性值。图10.8连接资源中的三个选项,分别用于OLE DB文件(.udl)、ODBC数据源(.dsn)或连接字符串。例如,选中“使用连接字符串”,单击“生成”按钮进入“数据连接属性”对话框,在“提供者”选项卡中选择“Microsoft Jet 3.51 OLE DB Provider”,如图10.9(a) 所示。 单击“下一步”按钮,在出现的“连接”选项卡中单击“…”按钮,选择所需数据库的路径和名字(如D: \Example\st.mdb),在“输入登录数据库的信息”中输入用户名称和密码,如图10.9(b)所示。单击“测试连接”按钮,当测试成功就单击“确定”按钮,则完成了OLE DB数据连接。
(a) (b) 图10.9 数据连接属性 另外,利用Windows资源管理器中的新建“Microsoft数据连接”命令,也可以创建一个.udl文件,然后打开该文件的属性对话框(图10.9)即可设置OLE DB数据连接。只不过在设置ConnectionString属性时,需要选中“使用Data Link文件”来指定相应连接资源。 连接到数据源后,就应设置记录源了,即RecordSource属性。在属性页对话框选择“记录源”选项卡,如图10.10所示。
图10.10 记录源 如果选择命令类型为2-adCmdTable,则设置一个表或存储过程名为记录源,如在“表或存储过程名称”下拉列表中选择“学生基本情况(xsjbqkb)”表,Adodc1就连接到St.mdb文件的学生基本情况表。如果选择1-adCmdText,则将命令文本中输入的SQL查询语句作为记录源。 2. ADO Data控件的方法、事件 ADO Data控件对数据的操作主要由Recordset对象的属性与方法来实现。例如,可用InputBox输入要移动的记录数,然后在记录集中移动当前记录: With Adodc1.Recordset .MoveFirst MoveNo = InputBox("请输入移动记录数:", "移动记录") If MoveNo = "" Then End .Move CLng(MoveNo) If .BOF Or .EOF Then MsgBox "移动出界" End With ADO数据控件的常用事件主要有:WillMove,WillChangeField,FieldChangeComplete,WillChangeRecord,RecordChangeComplete事件等。 【例10-2】 利用ADO Data控件重新编写学生基本情况的输入程序。 首先,在窗体上添加一个ADO Data控件Adodc1,并将其连接到数据源st.mdb,并在记录源选项卡中选择学生基本情况表,Visible属性设置为False。添加3个文本框、3个列表框,分别设置其DataSource属性为Adodc1,DataField属性为相应的字段名,并给各字段框配置合适的标签。 最后添加命令按钮Command1(0)~Command1(5),设置各命令按钮的Caption属性后,编写Click事件代码: Select Case Index Case 0 '添加记录 Adodc1.Recordset.AddNew Case 1 '删除记录 mb = MsgBox("要删除吗?", vbYesNo, "删除记录") If mb = vbYes Then Adodc1.Recordset.Delete Adodc1.Recordset.MoveLast End If Case 2 '更新记录 Adodc1.Recordset.Update Case 3 '上一条记录 Adodc1.Recordset.MovePrevious If Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst Case 4 '下一条记录 Adodc1.Recordset.MoveNext If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast Case 5 '退出 Unload Me End Select
运行程序,如图10.11所示。在性别选项中默认为男生,取消选中该复选框则表示女生。政治面貌、所属院系选项可以从下拉列表选择输入,也可直接输入。
图10.11 ADO应用界面 10.3.3 高级数据约束控件 在Visual Basic中,任何具有DataSourec属性的控件都可以绑定到一个数据控件上作为数据感知控件,除了TextBox,ComboBox控件等可与数据库关联的控件外,Visual Basic还提供了一些高级约束数据控件,如DataList, DataCombo, DataGrid,RichTextBox,FlexGrid,MonthView等。加入这些控件的方法是:使用“工程”菜单中的“部件”命令,然后选择Microsoft DataGrid Control及Microsoft DataList Control等。 1. 使用DataGrid控件 DataBrid控件是一种类似于表格的数据绑定控件,可以通过行和列来显示Recordset对象的记录和字段,用于浏览和编辑完整的数据库表和查询。DataGrid控件为部件中的“Microsoft DataGrid Control (OLEDB)”。 假设现在已经在一个窗体上添加了一个ADO Data控件,并且设置了与St数据库的关联。要使用DataGrid控件来显示“学生成绩”表中的数据,应首先在窗体上添加一个DataGrid控件,并设置DataSource属性为该ADO数据控件。然后,用鼠标右键单击DataGrid控件,选择“检索字段”命令,就会用数据源的记录集来自动填充该控件,并且自动设置该控件的列标头,如图10.12所示。
图10.12 装载学生成绩表的DataGrid控件 一般情况下,DataGrid控件的默认设置并不一定合适,可以对该控件进行手工设置。如从单击右键后弹出的快捷菜单中选择“编辑”,就可以对字段进行删除、插入、追加,以及改变字段的显示宽度等操作。通过使用“属性页”选项卡则可以更好地设置该控件的适当属性,如图10.13所示。
图10.13 DataGrid控件属性页 在运行时可以动态地更改网格中的字段,还可以通过在程序中切换DataSource来察看不同的表。当有若干个ADO Data控件,每个控件可以连接不同的数据库,或设置为不同的RecordSource属性,可以简单地将DataSource从一个ADO数据控件重新设置为另一个ADO数据控件。 例如,在窗体上添加1个列表框List1、1个ADO Data控件、1个DataGrid控件。设置ADO Data控件的ConnectionString属性为: Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=D:\Example\st.mdb ADO Data控件的RecordSource属性为该数据库下某个表,DataGrid控件的DataSource属性为Adodc1,List1列表框中添加数据库的数据表名称。 编写List1的Click事件代码: Adodc1.RecordSource = "select * from " & List1.List(List1.ListIndex) Adodc1.Refresh 程序运行后,单击左边的数据表名,右边就会显示相应记录,如图10.14所示。
图10.14 浏览数据表 在应用程序中,利用Rebind方法可以重新生成DataGrid控件属性和列,Scroll方法则可用于水平或垂直地滚动DataGrid控件。例如,单击DataGrid控件向右下方滚动: Private Sub DataGrid1_Click() DataGrid1.Scroll DataGrid1.VisibleCols-1, DataGrid1.VisibleRows-1 End Sub DataGrid控件的常用事件有RowColChange和ButtonClick事件。单击当前单元的内置按钮时触发ButtonClick事件,RowColChange事件是在当前单元改变为其他不同单元时触发。例如,当网格的行或列变化时,在窗体上显示当前单元的文字、行和列的信息: Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer) Print DataGrid1.Text; DataGrid1.Row; DataGrid1.Col End Sub 其中,LastRow用来指定前一行的位置,LastCol用来指定前一列的位置。 2. 使用DataList和DataCombo控件 DataList控件、DataCombo控件所在的部件名为“Microsoft DataList Controls (OLEDB)”。二者与列表框(ListBox)和组合框(ComboBox)相似,所不同的是这两个控件不再是用AddItem方法来填充列表项,而是由这两个控件所绑定的数据字段自动填充,而且还可以有选择地将一个选定的字段传递给第二个数据控件。
· BoundText:BoundColumn字段的文本值。 【例10-3】 输入姓名查询成绩信息,如图10.15所示。
图10.15 成绩查询界面 在窗体上添加两个ADO Data控件、一个DataCombo控件、一个DataGrid控件、及两个命令按钮和一个标签,设置控件的属性,如表10.5所示。
属 性 值 D:\…\St.mdb Select * From 学生成绩 False D:\…\St.mdb 学生 False Adodc1 Adodc2 姓名 学号 (空)
编写命令按钮的Click事件代码: Private Sub CmmList_Click(Index As Integer) Dim sqlstring As String Select Case Index Case 0 sqlstring = "select * from xscjb where " & _ "(((xscjb.学号) ='" & DataCombo1.BoundText & "'))" Case 1 sqlstring = "select * from xscjb" End Select Adodc1.RecordSource = sqlstring Adodc1.Refresh End Sub 运行程序时,通过下拉列表选择用户名称后,单击“查询”按钮就会在网格中显示出指定学生姓名的成绩,单击“全部”按钮则显示所有学生的成绩。 10.3.4 数据窗体向导 如果觉得ADO Data控件的使用比较麻烦,还可以使用数据窗体向导。数据窗体向导是ADO Data控件提供的将一组控件绑定到某个数据源的简单方法,包括了用户界面和所需要的程序代码。 使用数据窗体向导的步骤如下: (1)添加数据窗体向导。数据窗体向导是作为外接程序存在的,因此应先将其添加到系统菜单中。单击外接程序菜单中的“外接程序管理器”选项,在出现的“外接程序管理器”窗口中,选择“Visual Basic数据窗体向导”,选中“加载/卸载”复选框,如图10.16 所示。
图10.16 添加数据窗体向导
图10.17 利用向导定义窗体 (2)单击外接程序菜单中出现的“数据窗体向导”,打开数据窗体向导第一屏“介绍”。单击“下一步”按钮,在第二屏“数据库类型”中选择Access。 (3)在第三屏“数据库”中指定数据库名称,如D:\Example\St.mdb。 (4)在“Form”窗口上确定窗体名称、布局和绑定类型,如图10.17所示。 (5)在“记录源”窗口中选择记录源,如所需要显示的字段。 (6)在“控件选择”窗口内选择所需要的控件后,单击“完成”按钮,就会自动生成窗体,且这个窗体是完全可以运行的。 在使用数据窗体向导创建好一个窗体后,用户可以根据需要修改窗体的布局以及程序代码,然后再运行应用程序。 对任何一个数据库应用程序而言,制作报表始终是应用程序所必需的功能。数据报表(DataReport)设计器是Visual Basic 新增的功能,和数据环境(Data Environment)设计器配套使用可以完成大多数类型报表的设计。 10.4.1 数据环境设计器 数据环境设计器为数据库应用程序的开发提供了一个交互式的、在设计时使用的环境,能够可视化地创建和修改表、表集和报表的数据环境,为建立连接和定义命令提供了很好的图形接口。Data Environment设计器保存在.dsr文件中。 在工程菜单中,选择“更多ActiveX设计器”下级菜单中的“Data Environment”,就会打开数据环境设计器,同时添加了一个数据环境DataEnvironment1,并包含一个连接对象Connection1,如图10.18所示。
图10.18 数据环境设计器 1. 创建连接 数据环境中的Connection对象用于管理到数据库的连接,在Data Environment设计器中定义一个Connection对象的方法与ADO Data控件的ConnectingString属性的设置相同。 例如,先将DataEnvironment1名称设为Students,Connection1对象名称设为ConnSt。用鼠标右键单击ConnSt对象,在快捷菜单中选择“属性”命令,打开“数据连接属性”对话框。在“提供者”选项卡中选择“Microsoft Jet 3.51 OLE DB Provider”,在“连接”选项卡中选择数据库名称,如“D:\Example\St.mdb”。单击“测试连接”按钮,如果测试连接成功则建立了连接。 2. 定义命令 Command对象定义了有关数据库数据的详细信息,它可以建立在数据表、视图、SQL查询基础上,也可在命令对象之间建立一定的关系,从而获得一系列相关的数据集合。命令对象必须与连接对象结合在一起使用。 选中Connection对象(如ConnSt),单击工具条上的 ,或选择用鼠标右键单击ConnSt,选择弹出菜单中的“添加命令”,为数据环境添加一个命令对象Command1。选择Command1对象,打开其属性对话框,如图10.19所示。
图10.19 Command对象属性对话框 将Command1对象的名称改为CommBase,在“数据库对象”下拉列表中选择“表”,在“对象名称”下拉列表框中选择“学生基本情况”。单击“确定”按钮后,在数据环境设置器中就可看到Students的结构,如图10.20所示。 如果在数据源中选择SQL查询作为数据源,则在SQL语句框中选择合法的SQL查询,也可以单击“SQL生成器”启动查询设计器来建立一个SQL查询。
图10.20 数据环境Students的结构 3. 使用数据环境 在数据环境设计器中创建好了一个数据环境对象以后,就可以利用该数据环境对象访问数据库了。例如,可以把CommBase从Data Environment设计器窗口直接拖到一个打开的窗体中,则CommBase中定义的所有字段都会自动添加到窗体上。并且各控件的相关属性也会自动设置,如“学号”标签的Name属性为“lblFieldLabel”,显示“学号”字段的文本框Name属性为“txt学号”,DataSource属性为“Students”等。 运行应用程序,在窗体上就会显示出第一条记录的数据。控件的属性可以重新设置,也可以只将某个字段从数据环境设计器窗口拖到窗体中。要想应用程序比较完整,还需在窗体上添加一些命令按钮,并编写相应代码。 例如,在窗体上创建一个命令按钮Command1,用于移动学生基本情况表中的记录: Private Sub Command1_Click() With Students.rsCommBase .MoveNext If .EOF Then .MoveFirst End With End Sub 其中,rsCommBase为CommBase对象的记录集。Recordset对象作为Command对象的属性,创建一个Command对象后,记录集的名称就自动定为“rs+Command对象名”。 另外,也可用代码来编辑和创建自己的Data Environment对象。例如,定义CommStID为Data Environment对象: Dim CommStID As Students 10.4.2 报表设计器 在工程菜单中选择“添加Data Report”,即可在工程中添加一个DataReport对象,并同时打开数据报表设计器,如图10.21所示。
图10.21 报表设计器 从图中可以看出,数据报表设计器由DataReport对象、Section对象和Data Report控件三部分组成。 1. DataReport对象 DataReport对象与Visual Basic窗体类似,同时具有一个可视的设计器和一个代码模块。可以使用设计器创建报表的布局,也可以向设计器的代码模块添加代码,可以采用编程方式调整设计器中包含的控件或部分格式。 2. Section对象
· 报表注脚:报表结束时出现的文本,如摘要信息、一个地址或联系人姓名等。 3. Data Report控件 在一个工程中添加了一个数据报表设计器以后,Visual Basic将自动创建一个名为“数据报表”的工具箱,工具箱中列出的6个控件功能,如表10.6所示。
描 述 用于在报表上放置标签、标识字段或Section 显示所有在运行过程中应用程序通过代码或命令提供的数据 用于在报表上放置图形,该控件不能被绑定到数据字段 用于在报表上绘制直线,可用于进一步区分Section 用于在报表上放置矩形、三角形、圆形或椭圆 是一个特殊的文本,用于在报表生成时计算数值,如在分组数据的合计等
尽管这6个控件与窗体的标准控件类似,但在创建窗体时不能使用这些控件,同样也不能将窗体设计器中的控件用在报表设计器中。 10.4.3 设计报表 数据报表设计器的主要功能就是将数据从数据库表中提取出来,经过组织后生成一张报表。下面通过学生成绩报表的设计说明数据报表设计器的使用方法。 1. 指定数据源 在工程中添加一个数据环境Students,打开数据环境设计器,创建连接对象ConnSt与命令对象CommStID,并通过CommStID属性页指定数据源为学生数据表。 用鼠标右键单击CmmStID对象,在弹出的菜单中选择“添加子命令”,在数据环境中添加子命令对象CommStCJ,并指定“学生成绩”表为数据源。然后在属性页的“关联”选项卡中选中“与父命令对象相关联”复选框,将“父命令”设置为CommStID,并在关联定义部分的父字段、子字段/参数列表中都选择“学号”字段,如图10.22所示。
图10.22 “关联”选项卡 将关系添加到命令对象后,单击“确定”按钮关闭对话框,数据环境设计器将这两个命令对象按分层的方式显示。 2. 添加DataReport 打开数据报表设计器,将DataReport对象的Name属性设置为DataReportSt,DataSource属性为数据环境对象Students(这时数据环境设置器必须是打开的),设置DataMember属性为CommStID对象。 用鼠标右键单击DataReportSt对象,选择快捷菜单中的“检索结构”命令,出现“用新的数据层次代替现在报表布局吗?”确认对话框,单击“是”按钮,系统将根据数据源定义数据报表中应该有的各个标题栏。例如,如果有分组的话,自动在数据报表设计器中加上分组标头和注脚。 3. 设计报表界面 可以使用报表设计器中的工具栏来设计报表中的数据项。不过更快捷的方法是直接将数据环境中的各数据字段拖放到DataReportSt对象的相应区域中。 (1)在页标头下,添加一个RptLabel控件,将Caption属性设置为“学生成绩单”。添加控件可以使用传统的方法,也可以通过单击鼠标右键的方法,在快捷菜单中选择“插入控件”。 (2)从数据环境设计器中,将CommStID对象的姓名、学号拖放到分组标头,则自动出现标签和文本框。文本框的DataMember和DataField属性自动为姓名、学号的Command和Field对象。 (3)从数据环境设计器中,依次将高等数学、英语、大学计算机基础、程序设计字段拖放到细节区域内。 (4)调整各对象的大小、位置。设置RptStudent属性的GridX和GridY都为5,将分组标头、细节中的标签和文本框对齐,分别设置各标签及文本框的字体大小等。为了美观,还可以在分组标头中添加一条直线,并适当调整各Section对象的宽度,如图10.23(a)所示。 通过Show方法或改变启动对象,可以显示设计好的数据报表,如图10.23(b)所示。 4. 分组与合计 为了能够按院系进行成绩统计,可先建立一个查询表,然后进行分组计算、设计报表。在数据环境设计器的CnnSt连接对象中添加一个命令对象CmmCjd,在属性页的通用选项卡中选择“SQL语句”,单击“SQL生成器”,则出现如图10.24所示的查询设计窗口。
图10.23(a) 设置报表界面
图10.23(b) 设置报表界面
图10.24 查询设计窗口
打开“数据视图”窗口,将学生成绩、学生基本情况表拖放到查询设计窗口,通过单击学生成绩的“学号”并拖放到学生基本情况的“学号”来建立关联。选择要显示的字段,包括学生成绩的所有字段、及学生基本情况的姓名、所属系部。单击鼠标右键,选择“运行”命令,在查询设计窗口中显示SQL语句和满足条件的记录。 关闭查询设计窗口,返回数据环境设计器。重新打开CmmCjd的属性页,在“分组”选项卡中选中“分组命令对象”复选框,在“命令中的字段”列表框中选择“所属系部”,单击“>”按钮,如图10.25所示。 打开“合计”选项卡,单击“添加”按钮,将添加的合计名称改为“高数平均”,在“功能”下拉列表中选择“平均”,“字段”下拉列表中选择“高等数学”。依次添加英语平均、计算机平均、程序设计平均,如图10.26所示。 单击“确定”按钮,返回数据环境设置器。这时数据环境设计器中原来的CmmCjd命令对象被一个名为“CmmCjd分组使用CmmCjd_分组”所替代,该命令对象分为两部分,一部分是命令对象中的摘要字段,而另一部分是细节字段。
图10.25 “分组”选项卡
图10.26 “合计”选项卡 添加报表DataReportCj,报表对象的DataMember属性为CmmCjd_分组,并进行“检索结构”。适当调整报表界面,并运行程序,其效果如图10.27所示。
图10.27 进行分组求平均成绩后的界面 除了可以直接显示数据库中的数据和合计字段的值以外,还可以用数据报表设计器为报表在每一页上添加日期、时间、页数等信息。 5. 报表打印 可以使用两种方法打印一个数据报表,一种方法是在预览数据报表时单击“打印”按钮,另一种方法则是在程序中调用PrintReport方法打印报表。 在程序中使用代码打印数据报表时,既可以在显示打印对话框后打印报表,也可以不显示打印对话框而直接打印报表。使用PrintReport方法的格式为: 对象.PrintReport(是否显示打印对话框,页面范围,起始页,终止页) 例如,在窗体上添加一个命令按钮Print,并在其Click事件中输入: RptStudent.PrintReport True 在运行时单击此按钮,就会出现打印对话框。在打印对话框中用户可以选择打印机、打印到文件、要打印的页面范围和指定要打印的份数等。 如果不需用户干预打印,则PrintReport方法也提供不显示打印对话框的打印,并可选择要打印的页面范围,如: RptStudent.PrintReport False, rptRangeFromTo, 1, 3 数据报表设计器能够使用ExportReport方法将报表作为一个大文档的一部分在Internet上发布,使用一个指定的ExportFormat对象导出报表的文本到一个文件,任何报表都可以作为文本文件或HTML文件导出。 10.4.4 学生成绩管理系统的设计 管理信息系统(MIS,Management Information System)是一个由人、计算机、数据和文档等组成的能进行信息收集、传递、存储、加工、维护和使用的信息系统。它的开发是一个复杂的系统工程,包括需求分析、软件设计、编程、测试及维护多个阶段,这里的学生成绩管理系统仅是一个简单的实例。
· 打印:可以将查询的结果数据通过报表输出,也可打印输出。 数据库采用Access数据库,使用可视化数据管理器(VisData)或在Access环境中创建数据库Students.mdb文件。包括学生基本情况数据表、学生成绩数据表、学生数据表,以及通过某些查询建立的表。 进入系统后应先启动展示屏幕,以显示系统名称、图标、作者和版本等,并打开数据库文件,然后进入系统的主界面,通过主界面的菜单进入其他模块。为了方便用户使用,可将主界面中的常用菜单项设计为工具栏,如输入学生基本情况、输入学生成绩单、启动查询、显示图表等。 各功能模块的界面设计及代码编写,可参考前面有关内容,这里就不再重复。另外,读者可以为输入模块添加用户身份的验证,还可运用多媒体技术进行背景音乐的播放等。 |
|