VB数据库的链接与访问

更新时间:2024-03-17 00:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

VB数据库的链接与访问

本节详细介绍了数据库的ADO(ActiveX数据对象)控件链接与访问方式、DAO(数据访问对象)对象模型分层结构链接与访问方式、通过数据环境设计器的链接与访问方式、使用ADODB对象的链接与访问方式。

7.3.1 使用ADO控件建立数据库链接和数据访问

使用ADO data控件,可以快速简便地建立数据库链接,配合数据绑定控件,进行数据快速浏览,这是目前最常用的方法之一,同时介绍了数据记录集Recordset方法的使用。 1. ADO data控件

ADO data是一个ActiveX控件,需要从菜单栏选择“工程”/“部件”,在“控件”选项卡中选择“Microsoft ADO Data Control 6.0(OLE DB)”,单击“确定”按钮,才会在工具箱中出现Adodc控件图标,如图7-5a所示。将该控件加入窗体,它是一个具有四个箭头按钮的图形控件,如图7-5b所示。

建立Adodc控件与数据库的链接按如下操作步骤:

1) 进入Adodc属性定义:在Adodc控件上单击鼠标右键,选择“Adodc属性”菜单;

或者在图7-6a“属性”窗口里选择“自定义”项,进入“属性页”,如图7-6b所示。

2) “通用”选项卡中,选择“使用连接字符串”选项,再单击“生成”按钮,出现“数据链接属性”窗口的“提供者”选项卡,如图7-7所示。 3) 选择Microsoft Jet 3.51 OLE DB Provider,再单击“下一步”按钮,出现“连接”选项卡,单击浏览钮,选择合适路径下的数据库Student.mdb,如图7-8所示。再单击“测试连接”按钮,出现“测试连接成功”信息。最后,单击“确定”按钮,返回图7-6所示的“属性页”,在“使用连接字符串”下已经表明数据库与Adodc控件连接成功。

4) 选择“记录源”选项卡,如图7-9所示。在“命令类型”下拉框中选择“2-adCmdTable”

选项,在“表和存储过程名称”下拉框中选择数据表StudentBase;或在“命令类型”下拉框中选择“1-adCmdText”选项,在“命令文本(SQL)”处输入SQL命令(比如,select * from StudentBase),获取数据表子集。单击“确定”按钮,Adodc控件与数据库的数据表链接设置完毕。

综上所述,Adodc与数据库的链接主要定义了Adodc的三个属性:

? ConnectionString=”Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=E:\\Xjldoc\\VB6教学\\VB6实验\\Student.mdb” ? CommandType=2(adCmdTable)

? RecordSource=”StudentBase”(最终,关联到数据表或数据源集) 或者

? CommandType=1(adCmdText)

? RecordSource=”Select * form StudentBase”(最终,关联到SQL数据源)

除此之外,Adodc还有一些可以利用的属性(见表7-3)和事件(见表7-4)。

表7-3 Adodc控件的常见属性

属性 EOFAction

遇EOF时的处理:

0-停留在尾记录 1-停留在EOF处 2-允许新增

BOFAction

遇BOF时的处理:

0-停留在首记录 1-停留在BOF处

Visible Caption Orientation Enabled

当使用ADO data控件仅仅为了链接,不需要可见时,设置True。 设置ADO data的标题名称。 0- AdHorizontal(水平) 1-adVertical(垂直) 使有效(True)

表7-4 Adodc控件的事件

注释

事件

产生条件

WillMove

当执行Recordset.Open、Recordset.Move组、Recordset.BookMark、Recordset.AddNew、Recordset.Delete、Recordset.Requery、Recordset.Resync方法时(当ADO记录指针将要产生移动时发生)。

MoveComplete WillChangeField FieldChangeComplete WillChangeRecord

在WillMove事件之后(当ADO data记录指针移动后发生)。 在Value属性更改之前。 在WillChangeField事件之后。 当

Recordset.Update

Recordset.delete

、、

Recordset.CancelUpdate

RecordChangeComplete WillCahngeRecordset RecordsetChangeComplete InfoMessage

Recordset.UpdateBatch

Recordset.CancelBatch方法时。 在WillChangeReord事件之后。

在执行Recordset.Requery、Recordset.Resync、Recordset.Close、Recordset.Open、Recordset.Filter方法时。 在WillChangeRecordset事件之后。 当数据提供者返回一个结果时。

2. Data-Bound(绑定)控件

虽然ADODC控件具有存取数据库记录信息的能力,但却没有显示数据的功能,这需要用到数据绑定控件。所谓“绑定”就是控件源源不断地从Adodc1中获取对应数据记录。任何绑定控件,最关键的是两个属性:“DataSource”和“DataField”。

? DataSource:绑定数据源控件。一般为Adodc控件的对象名,使数据源记录指针所指向的当前信息与绑定控件同步。

? DataField:绑定数据源的字段。建立一个独立数据控件与绑定数据源记录指针指向的记录信息中某字段的数据联动。

? DataFormat:绑定控件显示数据的格式。尤其是日期、时间、财务数据、货币、图片等特殊格式。

除了基本控件TextBox,Label,CheckBox,ComboBox,ListBox,PictureBox等可以作为绑定控件外,VB还提供了ActiveX的绑定控件,如DataGrid,DataCombo,DataList,Microsoft Char等OLE DB控件,其他还有DateTimePicker,Hierarchical FlexGrid,MonthView等也是很精彩的绑定控件。甚至用户可以创建自己的数据绑定ActiveX控件。

下面对图7-10运行实例中的主要绑定控件类型进行说明。 1) Label、TextBox、CheckBox绑定控件

【例7-2】用Label、TextBox、CheckBox控件分别绑定数据库中StudentBase数据表的学生学号、姓名、性别、年龄、出生日期字段信息。

布局如图7-10所示,直接将Label、TextBox、CheckBox控件加入窗体。对相应的绑定控件,如标签、文本框、复选框控件,设置它们的DataSource、DataField等属性。如表7-5所示。必要时,可以进一步设置其DataFormat,以适合数据格式(例如:txtBirthDay)。

表7-5 例7-2中Label、TextBox、checkBox绑定控件的设置

控件名 DataSource DataField DataFormat 解释

LblStudentID TxtName chkSex txtAge txtBirthDay

Adodc1 Adodc1 Adodc1 Adodc1 Adodc1

StudentID Name Sex Age BirthDay

日期:dddd年m月d日

学号 姓名 性别 年龄 出生日期

2) DataGrid绑定控件

在部件中,新增“Microsoft DataGrid Control 6.0 (OLE DB)”ActiveX控件DataGrid。从工具箱中添加入窗体。最简单、最快速地使用只需设置其DataSource=Adodc1即可。

如果要仔细对DataGrid进行修饰,可以先选中它,单击右键,在快捷菜单中选“检索字段”,再选“编辑”,可以逐个设置其网格大小、删除、新增网格列。选择“属性”可以设置DataGrid属性,例如,“通用”页中可以输入标题显示名称,表格总体属性(见图7-11a);“列”页中可以设置列标题的名称(见图7-11b)。

其它还有键盘、布局、颜色、字体、拆分、格式等页的属性设置。最后的DataGrid属性设置结果,如图7-10中的“学生基本情况表”所示。选择或浏览指定某学生,下面的绑定控件就能同步显示该学生的绑定字段信息,不必编写复杂的代码。图7-10中的其它功能,稍后再介绍。

3)DataCombo和DataList绑定控件

DataCombo和DataList属于ActiveX控件,如同使用其它ActiveX控件一样,需要添加“部件”,选取“Microsoft DataList Control 6.0 (OLE DB)”。这时,在工具箱里会出现DataCombo和DataList绑定控件图标。

【例7-3】用Datalist控件显示学生姓名,用DataCombo控件显示学生学号。单击选择学生的姓名或学号,关联显示出该学生的全部课程和考试情况。

步骤如下:

? 建立工程文件ch07_03.vbp

? 设计交互界面,如图7-12所示。 在图7-12的例子中,单击左下角的DataList控件,选择学生姓名,可以在右下角的DataGrid2中显示该学生的全部课程和考试情况;同样,单击DataCombo控件,选择学生学号,可以关联出该学号学生的全部课程和考试情况,并显示在DataGrid2中。

? 设置控件主要属性

表7-6 例7-3中Adodc控件与DataList和DataCombo绑定控件的属性设置

控件名 Adodc1 Adodc2 DataGrid1 DataGrid2 DataList1

主要属性

RecordSource=StudentBase RecordSource=StudentMark DataSource=Adodc1 DataSource=Adodc2 RowSource=Adodc1 ListFiled=Name BoundColum=StudentID

学生基本情况表 学生课程分数表

“学生基本情况表”显示表格 “学生课程分数表”显示表格 绑定Adodc1

显示StudentBase中的Name字段

当选中列表框中选项时,对应获取的文本内容BoundText会自动获取StudentID字段的相关信息(异字段绑定)

DataCombo1

RowSource=Adodc1 ListField=StudentID BoundColum=StudentID

绑定Adodc1

显示StudentBase中的StudentID字段

当选中下拉框中选项时,对应获取的文本内容BoundText会自动获取StudentID字段的相关信息(同字段绑定)

解释

Adodc1控件链接数据表StudentBase。DataGrid1控件绑定Adodc1仅作显示用,如前

例所示。Adodc2链接数据表StudentMark。DataGrid2控件绑定Adodc2,显示学生的分数和相关课程。再将DataList1控件与Adodc1的Name字段绑定,显示学生姓名列表。单击选择学生姓名后,关联绑定Adodc1的StudentID字段,获取该信息后,用SQL语句重新更新Adodc2

的RecordSource,并刷新DataGrid2的内容,使其仅显示该同学的全部选修课程成绩。同样,DataCombo1与Adodc1的StudentID绑定,下拉选择某学生的学号后,直接关联绑定StudentID字段本身,用SQL语句重新更新Adodc2的RecordSource,并刷新DataGrid2的内容,使其仅显示该同学的全部选修课程成绩。

? 编写事件主要代码

绑定控件DataList1和DataCombo1的Click事件代码基本相同,如下: Private Sub DataList1_Click()

Adodc2.RecordSource=\ * from StudentMark where StudentMark!StudentID='\ DataList1.BoundText & \?SQL语句改变数据源 Adodc2.Refresh ?刷新显示数据源 End Sub

其余设置,注意Adodc2的Orientation=1-adVertical(垂直浏览条),DataGrid的字段都有自己的列标题,DataGrid2还有自己的表标题名称“学生课程分数”。通过“检索字段”和“编辑”可以进一步细微设置网格的属性内容。

3. ADO中与数据库组织结构相关的对象

ADO中各对象间关系如图7-13所示。 1) Field对象

Field对象与数据表的字段对应,其属性见表7-7。

表7-7 Field对象的主要属性 属性 Name Value

解释

字段的名称 字段的数据内容

2) Fields对象

Field对象的全体元素集合构成Fields集合对象,其示意见表7-8。

表7-8 Fields对象的编号

编号 Name属性 Value属性

Fields(0) StudentID 981005

Fields(1) Name 王海平

Fields(2) Sex 1

Fields(3) Age 19

Fields(4) Birthday 1978-8-19

3) Recordset对象

Recordset对象与数据表对应,称作“数据记录集合”对象,是全体记录内容的集合对象。Recordset对象上层通过Adodc1控件绑定数据库Student.mdb中数据表StudentBase,下层通过Fields集合对象可以访问到具体的Field对象个体。Recordset对象的引用操作,见表7-9。

表7-9 Recordset对象的引用操作

引用

取值

类型

Adodc1.Recordset.Fields(0).Name Adodc1.Recordset.Fields(0).Value Adodc1.Recordset.Fields(1) Adodc1.Recordset.Fields(3)

StudentID 981005 王海平 19

字符串 字符串 字符串 数值

Recordset对象还有许多属性和方法,利用这些属性和方法,可以完成数据库中的大多数操作。

在例7-2的实例中,下面有“新增学生”、“注销学生”、“排序更新”等命令操作。在这些命令按钮的事件中,运用了ADO的Recordset对象的属性和方法,在程序运行时,动态完成数据记录的增加、删除和更新。使用Recordset的AddNew、Delete和Refresh等方法,实现新增学生、注销学生,更新DataGrid的数据显示。在“新增学生”按钮下的Click事件代码如下:

Private Sub cmdAddNew_Click() ?“新增学生”按钮的Click事件 Adodc1.Recordset.AddNew End Sub

此时,在DataGrid1的底部出现一空行,可以输入相关信息,最后字段内容输入完毕,该记录就保存在数据表StudentBase中了。此时,再单击“排序更新”按钮,该事件的Click事件代码如下:

Private Sub cmdRefresh_Click() ?“排序更新”按钮的Click事件

Adodc1.CommandType = adCmdText ?改变数据源的命令方式(SQL) Adodc1.RecordSource=\ * from StudentBase order by StudentID\ Adodc1.Refresh ?刷新显示DataGrid的数据源 End Sub

现在DataGrid1更新数据源,按StudentID关键字重新排序,并更新显示内容。如果你单击某记录,使其成为当前记录,再单击“注销学生”按钮,该学生的记录将被删除,该事件的Click事件代码如下:

Private Sub cmdDelete_Click() ?“注销学生”按钮的Click事件 Adodc1.Recordset.Delete End Sub

单击“排序更新”按钮,DataGrid1按StudentID关键字重新排序,并更新显示内容。如果你将排序更新的代码放在“注销学生”按钮的Click事件后,程序就会自动删除并更新内容显示。

常用的Recordset方法和属性如表7-10所示。

表7-10 Recordset的常用方法和属性

方法 方法/属性 解释

MoveFirst MoveLast MoveNext MovePrevious Move n AddNw Delete Edit Update Find Filter Sort BookMark EOF BOF

方法 方法 方法 方法 方法 方法 方法 方法 方法 方法 属性 属性 属性 属性 属性

将记录指针移到首记录。 将记录指针移到尾记录。

将记录指针移到当前记录的下一条记录。 将记录指针移到当前记录的上一条记录。 将记录指针移到当前记录的下n条记录。 增加一条新的空记录。 删除当前记录。 当前记录进入编辑状态。

将当前记录缓冲区里的数据写入数据表。 查找符合条件的第一条记录。 过滤满足条件的所有记录。 根据指定的字段排序。 设置记录书签,以便快速返回。 记录指针试图到尾记录后(True)。 记录指针试图到首记录前(True)。

RecordCount Fields(index).Value Fields(“字段名”) Fields(index).Name Close

属性 属性 属性 属性 方法

记录集中记录总数。

由字段序号index指定字段的值。 由字段名指定的字段值(同上)。 由字段序号index指定字段名。 关闭记录集。

【例7-4】查找一位名叫“李慈凯”的学生。

利用Recordset的Find方法,可以定位于该学生:

Adodc1.Recordset.Find(“Name=?李慈凯?”)

【例7-5】显示所有男学生的记录集合。

利用Recordset的Filter属性,可以设置男学生的记录集合:

Adodc1.Recordset.Filter=”Sex=?True?”

【例7-6】对所有学生按年龄排序。

利用Recordset的Sort属性,可以设置按年龄排序:

Adodc1.Recordset.Sort=”Age”

【例7-7】在StudentBase数据表中找一位年龄最小的学生,并显示其姓名、学号。 利用Recordset的BookMark属性,记录最小年龄学生的记录位置:

Adodc1.Recordset.MoveFirst ?记录指针移到首

min_age = Adodc1.Recordset.Fields(\ ?将第一位学生的年龄假设为最小年龄 While Not Adodc1.Recordset.EOF ?只要记录集未超尾记录 If Adodc1.Recordset.Fields(\ then ?判断较小年龄

bm=adodc1.Recordset.BookMark ?记录较小年龄书签位置 min_age= Adodc1.Recordset.Fields(\?记录较小年龄 End if

Adodc1.Recordset.MoveNext ?移动记录指针至下一条 Wend

adodc1.Recordset.BookMark=bm ?指向最小年龄学生记录书签

txtName.Text = Adodc1.Recordset. Fields(\?显示最小年龄学生的姓名 txtStudentID.Text = Adodc1.Recordset. Fields(\ ?显示最小年龄学生的学号

在例7-2的实例中,如果要统计StudentBase数据表中所有学生的平均年龄,可以通过其ADO的Recordset记录集对象进行编写代码。在“平均年龄”按钮的Click事件中,编写代码如下:

Adodc1.Recordset.MoveFirst ?记录指针移到首 s = 0 ?年龄累计器

While Not Adodc1.Recordset.EOF ?只要记录集未超尾记录 s = s + Adodc1.Recordset.Fields(\ ?累加年龄总和 Adodc1.Recordset.MoveNext ?移动记录指针至下一条 Wend

Text1.Text = s / Adodc1.Recordset.RecordCount ?计算平均年龄 MsgBox \平均年龄计算完毕!\

【例7-8】编写一个可以按学号、姓名、年龄、出生日期方式查找学生个人资料的应用程序,运行窗口如图7-14所示。

步骤如下:

? 建立工程文件ch07_08.vbp

? 设计交互界面,如图7-14所示。

? 设置控件对象属性,见表7-11。

表7-11 例7-8控件属性设置

控件名 Adodc1 optChoose(i) txtInput cmdFind lblStudentID lblName chkSex lblAge lblBirthday

主要属性

RecordSource=StudentBase

Caption:按学号i=0;按姓名i=1;按年龄i=2;按出生日期i=3

解释

链接数据库中数据表StudentBase 数组控件,选择“查找方式” 输入“查找关键字” “查找”命令按钮 学号绑定Adodc1 姓名绑定Adodc1 性别绑定Adodc1 年龄绑定Adodc1 出生日期绑定Adodc1

Caption=查找 DataField=StudentID DataField=Name DataField=Sex DataField=Age DataField=Birthday

在“输入信息”处输入查找关键字(例:李慈凯),选择查找方式:按学号、按姓名、按年龄、按出生日期,单击“查找”按钮,在“个人资料”栏显示相关信息,否则,给出“没有输入查找关键字!”的信息。首先将Adodc1控件与数据库Student.mdb的数据表StudentBase链接,同时将“个人资料”的学号、姓名、性别、年龄、出生日期与相应字段绑定。如果需要也可以将Adodc1的Visible属性设置为False,仅作链接而已。

? 主要控件对象的代码

Public Mode_String ?全局变量:查找条件合成串

Private Sub optChoose_Click(Index As Integer) ?查找方式选择的Click事件 Select Case Index

Case 0: ?按学号(字符型)查找 Mode_String = \

Case 1: ?按姓名(字符型)查找 Mode_String = \‘\’\

Case 2: ?按年龄(数值型)查找 Mode_String = \

Case 3: ?按出生日期(日期型)查找 Mode_String = \ End Select

cmdFind.Enabled = True ?“查找”按钮有效。选择新方式后,结合关键字生成条件串 End Sub

Private Sub txtInput_LostFocus()

cmdFind.Enabled = False ?“查找”按钮无效。新输入关键字,重新选择查找方式 End Sub

Private Sub cmdFind_Click() ?“查找”命令Click事件

If Len(Trim(txtInput.Text)) = 0 Then ?没有输入关键字 MsgBox \没有输入查找关键字!\ Exit Sub End If

Adodc1.Recordset.MoveFirst ?记录指针复位

Adodc1.Recordset.Find (Mode_String) ?调用Find方法,条件合成字符串 If Adodc1.Recordset.EOF Then MsgBox \没有找到此人!\ End If End Sub

7.3.2 使用DAO对象模型建立数据库链接和数据访问

数据访问对象DAO可以用来创建数据库,定义数据表、字段和索引等,它具有一整套程序代码设计的全部对象属性和方法。对象的层次结构严格,使用灵活,资源开销较小,但代码量稍大,维护修改不易。 1. DAO对象模型的结构

DAO的分层结构如图7-15所示。 该图体现了对象之间的层次关系,一个对象可以包含下层的同类对象集合,同时自己又是上一层对象的成员之一。清晰的层次关系,会使我们在编程中嵌套引用语法正确。

DAO的顶层是DBEging对象,它是唯一不被其他对象所包含的的数据访问对象。它拥有一个名叫Workspaces的集合(集合的名字总是它所包含的对象名字的复数),该对象集合包含了若干个Workspace对象。每个workspace对象又有一个Databases集合,该对象集合包含了若干个Database对象。每个Database对象又可以包含若干个Recordset对象、或若干个TableDef对象等。每个Recordset对象和TableDef对象又包含若干个Field对象等。

2. DAO变量的定义

如果要进行DAO方式的程序编码,首先要引用DAO库。具体操作步骤为:选择菜单栏“工程”/“引用”,在引用窗口的“可用引用”列表框内选择“Microsoft DAO 3.51 Object Library”选项,再单击“确定”按钮。这样,在代码设计中就可以引用所有的DAO对象了。

Dim dbWS As Workspace '定义工作区对象变量dbWS Dim dbDB As Database '定义数据库对象变量dbDB Dim dbTB As TableDef '定义数据表对象变量dbTB Dim dbRS As Recordset '定义记录集对象变量dbRS Dim dbFDNo As Field '定义字段对象变量dbFDNo等

Dim dbFDName As Field '分别有编号、姓名、电话、年龄字段 Dim dbFDTel As Field Dim dbFDAge As Field

Dim dbIDNo As Index '定义索引字段对象变量dbIDNo

3. 创建数据库、数据表、字段和索引

在程序设计中动态地创建数据库、数据表、字段、索引是DAO方式独有的特点。通过编码和人机交互方式,建立各种数据源。根据前节DAO的定义,创建代码如下:

Private Sub cmdBuild_Click() '创建工作区

Set dbWS = DBEngine.Workspaces(0)

If Dir(\实验\\StuLink.mdb\

answer=MsgBox(\实验\\StuLink.mdb已经存在!要删除吗?\ _

,vbYesNo+vbDefaultButton2,\询问信息窗\

If answer = vbYes Then

Kill \实验\\StuLink.mdb\ Else

Exit Sub End If End If

'创建数据库

Set dbDB=dbWS.CreateDatabase(\实验\\StuLink.mdb\ '创建数据表

Set dbTB = dbDB.CreateTableDef(\ '定义字段内容(字段名、类型、长度)

Set dbFDNo = dbTB.CreateField(\

Set dbFDName = dbTB.CreateField(\ Set dbFDTel = dbTB.CreateField(\ Set dbFDAge = dbTB.CreateField(\ dbFDNo.Size = 10 '补充定义 dbFDName.Size = 12

'根据上述定义,组建数据库、数据表结构 dbTB.Fields.Append dbFDNo dbTB.Fields.Append dbFDName dbTB.Fields.Append dbFDTel dbTB.Fields.Append dbFDAge dbDB.TableDefs.Append dbTB '创建索引

Set dbIDNo = dbTB.CreateIndex(\ dbIDNo.Primary = True

Set dbFDNo = dbIDNo.CreateField(\ dbIDNo.Fields.Append dbFDNo dbTB.Indexes.Append dbIDNo '关闭数据库 dbDB.Close

MsgBox \数据库创建完毕!\ End Sub

4. 打开数据库、记录集、索引,引用字段

不管用什么方法建立的数据库、数据表、字段、索引可以用DAO方式打开,记录集的字段引用方式基本同控件中Recordset的方法相同,代码如下:

Private Sub cmdOpen_Click()

Set dbWS = DBEngine.Workspaces(0) If Dir(\实验\\StuLink.mdb\

MsgBox \实验\\StuLink.mdb不存在!请先创建数据库。\ Exit Sub End If

'打开数据库

Set dbDB = dbWS.OpenDatabase(\实验\\StuLink.mdb\ Set dbRS = dbDB.OpenRecordset(\ dbRS.Index = \

DisplayRefresh ?自定义函数:刷新屏幕Text1(i)数组控件的显示 For i = 0 To 3

cmdMove(i).Enabled = True ?激活移动按钮控件组 Next i

MsgBox \

End Sub

5. 一个运行实例

【例7-9】编写一个学生电话簿数据库程序,运行窗口如图7-16所示。 步骤如下:

? 建立工程文件ch07_09.vbp

? 设计交互界面,如图7-16所示。 ? 控件设计及属性设置

如前两节所述,文本框是一个Text1(i)的数组控件,分别表示编号、姓名、电话、年龄。翻动按钮组是cmdMove(i)控件组。首先单击“创建数据库“按钮,创建一个没有内容的数据库StuLink.mdb、数据表Link。再单击“打开记录集”,屏幕刷新左边文本组信息和总人数。单击翻动钮浏览前后记录。单击“清屏输入”,清空当前显示的内容,输入欲新增的记录内容后,单击“增加更新”,新记录就添加入记录集里了。直接在文本框里修改信息,再单击“修改更新”钮,修改内容写进记录集中。单击“删除更新”钮,当前记录被删除。

? 编写事件主要代码

“增加更新”按钮中的代码如下:

Private Sub cmdADD_Click()

dbRS.AddNew ?进入新增状态 For i = 0 To 3

dbRS.Fields(i) = Text1(i).Text ?记录集字段获取内容 Next i

dbRS.Update ?正式更新记录集数据 DisplayRefresh ?刷新屏幕数据和总人数 MsgBox \新增完毕!\ End Sub

cmdEdit_Click()与cmdAdd_Click()相似,只要将dbRS.AddNew换成dbRS.Edit即可。

“删除更新”按钮中的代码如下:

Private Sub cmdDel_Click() dbRS.Delete

Call cmdMove_Click(2) '调用后移一条记录的事件 MsgBox \删除完毕!\ End Sub

翻动按钮组中的代码如下:

Private Sub cmdMove_Click(Index As Integer) Select Case Index

Case 0 dbRS.MoveFirst ?移到首记录 Case 1 dbRS.MovePrevious ?前移一条记录

If dbRS.BOF = True Then dbRS.MoveFirst:MsgBox \已到第一人!\ Case 2

dbRS.MoveNext ?后移一条记录

If dbRS.EOF = True Then dbRS.MoveLast:MsgBox \已到最后一人!\ Case 3

dbRS.MoveLast ?移到尾记录 End Select DisplayRefresh End Sub

在“通用”处自定义一个刷新Text1(i)组的函数,代码如下:

Private Sub DisplayRefresh() For i = 0 To 3

Text1(i).Text = dbRS.Fields(i).Value Next i

Text2.Text = dbRS.RecordCount ?重新统计人数 End Sub

7.3.3 使用数据环境设计器建立数据库链接和数据访问

1. 设计时的DataEnvironment,Connection,Command操作

1) 进入“数据环境设计器”建立DataEnvironment对象 在菜单栏里选择“工程”/“更多ActiveX设计器”/“Data Environment”进入“数据环境设计器”窗口,系统默认创建DataEnvironment1及Connection1对象,如图7-17a所示。如果需要的话,可以修改这些对象的名称,比如envStudent及conStudent。

2) 设置Connection属性

右键单击Connectinon1,选择“属性”,进入如前图7-7所示的“提供者”窗口,选择“Microsoft Jet 3.51 OLE DB Provider”,单击“下一步”,进入前图7-8所示的“连接”窗口,选择合适的数据库,例如:E:\\VB6实验\\Student.mdb。单击“确定”连接设置完毕。注意到“属性”窗口里的ConnctionSource属性类似于ADO Data控件里的ConnectionString属性。

一旦建立好Connection对象,就可以打开“数据视图”窗口,纵观整个数据库的内部情况。具体操作:选择菜单栏“视图”/“数据视图窗口”,出现如图7-17b的窗口。选择Connection1,展开其下的数据表,在数据表上单击右键,选择“打开”,可以浏览、编辑整个数据表的数据。数据视图窗口提供了设计时良好的可视化数据库环境。

3) 添加命令Command对象

Connection建立了数据库与OLE DB提供者的链接,现在还要建立数据源的关系。 选择Connection1,在工具栏中点击“添加命令”按钮,或右键单击Connection1,在快捷菜单中选择“添加命令”,产生Command1对象。右键单击Command1,在快捷菜单中选择“属

性”,出现图7-18所示的窗口,可以更改Command1的名称。在“数据库对象”处选择表,在“对象名称”处选择数据表“StudentBase”,单 击“确定”按钮,设置完毕。同样方法,添加Command2对象,如图7-19所示,选择“SQL语句”,并写入命令“Select StudentID,CourseName,Mark from StudentMark order by StudentID”。在“关联”页上将 Command2与其父命令对象Command1通过StudentID关联,单击“添加”按钮,再单击“确定”按钮退出设定,如图7-20所示。分别展开Command1和Command2下的字段,如图7-17a所示。注意到“属性”窗口里的CommandText属性及CoomandType属性类似于ADO Data控件里的属性。

4) 将Command对象绑定在数据控件上

【例7-10】编写一个“学生基本情况表”的主显示表格,下边绑定学号、姓名。右边数据表显示与当前记录学生关联的学习成绩,运行窗口如图7-21所示。

步骤如下:

? 建立工程文件ch07_10.vbp

? 设计交互界面,如图7-21所示。 左表是“学生基本情况表StudentBase”,下面是学号、姓名文本框,分别以DataGrid1,Text1,Text2与Command1对象绑定,右表是“学生成绩表StudentMark”,随着左表学生的上下移动,或用鼠标单击选定学生,右表关联显示当前学生的所选全部课程的成绩。成绩表DataGrid2与Coomand2对象绑定。各控件绑定的属性设置,如表7-12所示。其余控件设置及DataGrid的列设置如同前述。

表7-12 “数据环境设计器”中绑定控件的属性设置 控件名 属性 设置值

DataGrid1

DataSource DataMember DataSource DataMember DataField DataSource DataMember DataField

DataEnvironment1 Command1 DataEnvironment1 Command1 StudentID DataEnvironment1 Command1 Name

Text1

Text2

DataGrid2 DataSource DataEnvironment1

DataMember Command2

右下角的“平均年龄”计算则引入了rsCommand1数据记录集的概念,它的使用方法基本同前所述的ADO Data 控件中的Recordset和DAO中的Recordset相同,见下一节。数据环境设计器中设置的Command对象,在运行时不能改变其内部属性,只能更换预先设定好的另一个Command对象。

2. 运行时的rsCommand操作

尽管数据环境设计器提供了可视化的设计平台,方便简单,但灵活性不够,因此,系统还同样给出了利用记录集rsCommand的类似Recordset的编码设计方式。计算平均年龄就是利用Command1上数据记录集的搜索计算出累计的总年龄,从而计算出平均年龄的,具体代码如下:

Private Sub cmdAverAge_Click() ?计算平均年龄事件

bm = DataEnvironment1.rsCommand1.Bookmark ?记忆原位置书签 DataEnvironment1.rsCommand1.MoveFirst ?记录复位 s = 0 ?累计器清零

While Not DataEnvironment1.rsCommand1.EOF = True ?未完继续 s = s + DataEnvironment1.rsCommand1.Fields(\ ?累计年龄 DataEnvironment1.rsCommand1.MoveNext ?移动记录指针 Wend

Text3.Text = s / DataEnvironment1.rsCommand1.RecordCount ?显示平均年龄 DataEnvironment1.rsCommand1.Bookmark = bm ?恢复原位置书签 End Sub

7.3.4 ADODB对象的链接和数据访问 ADODB中对象之间的关系如图7-22所示。

其中最主要的对象是Connection、Command和Recordset这三个对象。Connection对象主要负责与数据源建立链接;Command对象主要用于设置访问数据源所需的命令;Recordset对象主要用来存放从结果记录集中取回的记录集合。

在使用ADODB对象之前,必须先引用VB菜单的“工程/引用”来引用“Microsoft ActiveX Data Objects 2.0 Library”,然后ADODB对象群中的Connection、Command和Recordset等对象才能成为程序可以引用的对象。

1. ADODB中的Connection对象

Connection对象代表了一个已打开的数据源链接。它是Command对象和Recordset对象的上层对象。如果是客户端/服务器数据库系统,该对象可以等价于到服务器的实际网络链接。使用Connection对象的集合、方法和属性进行下列操作:

? 对ConnectionString,ConnectionTimeout和Mode属性对链接进行配置; ? 选用OLE DB的Provider程序;

? 使用Open方法建立到数据源的物理链接,使用Close方法将其切断; ? 使用Execute方法执行对链接的命令;

? 使用BeginTrans、CommitTrans和RollbackTrans方法以及Attributes属性管理打开的链接上的事务。 建立数据库的链接有两种方法。 例如,有如下代码:

Dim cnn As New ADODB.Connection 方法一:使用Open方法

strdb=”Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data “ & _ “Source=E:\\Xjldoc\\VB6教学\\VB6实验\\Student.mdb”

cnn.Open strdb ?建立数据库链接 方法二:使用ConnectionString属性

cnn.ConnectionString=”Provider=Microsoft.Jet.OLEDB.3.51;Persist Security “ & _

“Info=False;Data Source=E:\\Xjldoc\\VB6教学\\VB6实验\\Student.mdb”

cnn.Open ?建立数据库链接

2. ADODB中的Command对象

Command对象定义了将对数据源执行的指定命令。使用Command对象查询数据库并返回Recordset对象中的记录,以便执行大量操作或处理数据库结构。可以使用Command对象的集合、方法、属性进行下列操作:

? 使用CommandText属性定义命令(例如,SQL语句)的可执行文本;

? 通过Parameter对象和Parameters集合定义参数化查询或存储过程参数; ? 可使用Execute方法执行命令,并在适当的时候返回Recordset对象; ? 执行前应使用CommandType属性指定命令类型以优化性能;

? 使用CommandTimeout属性设置Provider等待命令执行的秒数;

? 通过设置ActiveConnection属性使打开的链接与Command对象关联; ? 设置Name属性将Command标识为与Connection对象关联的方法; ? 将Command对象传给Recordset的Source属性以便获取数据。

获取Recordset对象既可以通过Command对象的Execute方法执行和Connection链接的查询字符串命令,也可以通过Recordset的Open方法。

要执行Command,只需通过它所关联的Connection对象的Name属性,将其简单调用即可。必须将Command的ActiveConnction属性设置为Connection对象。如果Command带有参数,则将这些参数的值作为参数传给方法。

例如,有如下代码:

Dim cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset ┇

cnn.Open “……”

cmd.CommandType=adCmdText ?Command类型是文本命令方式 cmd.ActiveConnection=cnn ?激活链接

cmd.CommandText=”Select * from StudentBase” ?命令内容 Set rst=cmd.Execute ?rst获得Recordset记录集

3. ADODB中的Recordset对象

Recordset对象表示的是来自基本表(adCmdTable)或命令执行(adCmdText)结果的记录全集。任何时候,Recordset对象所指的当前记录均为集合内的单个记录。通过ADODB的Recordset对象几乎可以操作所有数据。所有Recordset对象均使用记录(行)和字段(列)进行构造。可以使用Recordset对象的集合、方法、属性进行如前所述的类似操作。

? 使用EOF和BOF属性判定当前记录指针是否超越记录集的有效范围; ? 使用Move方法移动记录指针;

? 使用AbsolutePosition、absolutePage和Filter属性来重新确定当前记录的位置;

? 可以使用立即更新记录和批更新记录。 获取Recordset对象的方法有三种: ? Command对象的Execute方法; ? Recordset的Open方法;

? Connection对象的Execute方法。

4. ADODB编码实例

【例7-11】通过ADODB,在程序运行时进行数据库动态链接,将“学生基本情况表”与“学生成绩表”分别和StudentBase与StudentMark链接。

步骤如下:

? 建立工程文件ch07_11.vbp

? 设计交互界面,如图7-23所示。 左边Frame是“基本情况”数据区,与StudentBase关联,分别显示学号、姓名、性别和年龄。右边Frame是“成绩”数据区,与StudentMark关联,分别显示学号、课程和成绩。

运行时,单击“ADODB链接StudengtBase”按钮,系统建立Connection对象,再建立Command对象,执行Command命令后,获得Recordset对象。进一步可以对记录集里的数据进行浏览、处理。继续单击“ADODB链接StudentMark”按钮,再执行另一条Command命令,建立另一数据源的链接。通过翻动按钮,可以浏览记录集中的记录。

? 窗体中主要控件设置如表7-13所示。

表7-13 ADODB应用程序的控件属性设置

控件名 txtBase(i) chkSex lblMark(i) cmdMoveBase(i) CmdMoveMark(i) cmdBase cmdMark

用于显示性别

用于显示StudentMark的信息(右边) StudentBase数据表的翻动按钮组 StudentMark数据表的翻动按钮组 建立StudentBase数据表的链接 建立StudentMark数据表的链接

注 解

用于显示StudentBase的信息(左边)

? 事件的主要代码

?ADODB对象的定义

Dim cnn As ADODB.Connection Dim cmd As ADODB.Command

Dim rstBase As ADODB.Recordset Dim rstMark As ADODB.Recordset

Private Sub cmdBase_Click() ?“ADODB链接StudentBase” ‘设置新Connection对象cnn,

?打开数据库OLE DB的提供者和物理数据库Student.mdb Set cnn = New ADODB.Connection

strcnn = \Security Info=False;Data Source=E:\\Xjldoc\\VB6教学\\VB6实验\\Student.mdb\ cnn.Open strcnn

?设置新Command对象cmd,激活cnn链接 ?定义命令类型、命令文本内容 Set cmd = New ADODB.Command Set cmd.ActiveConnection = cnn

cmd.CommandType = adCmdText ?或cmd.CommandType=adCmdTable

cmd.CommandText=\?或cmd.CommandText=\ cmd.CommandTimeout = 15 ?设置命令执行延迟

?设置新Recordset对象,

?执行cmd命令,返回rstBase的Recordset的记录集 Set rstBase = New ADODB.Recordset Set rstBase = cmd.Execute()

?建立数据控件绑定

Set txtBase(0).DataSource = rstBase

txtBase(0).DataField = rstBase.Fields(0).Name Set txtBase(1).DataSource = rstBase

txtBase(1).DataField = rstBase.Fields(1).Name Set chkSex.DataSource = rstBase

chkSex.DataField = rstBase.Fields(2).Name Set txtBase(2).DataSource = rstBase

txtBase(2).DataField = rstBase.Fields(3).Name rstBase.MoveFirst ?记录集指针复位 End Sub

Private Sub cmdMark_Click() ?“ADODB链接StudentMark” ?设置新Recordset对象

Set rstMark = New ADODB.Recordset

‘使用Recordset的Open方法打开StudentMArk数据表 rstMark.Open \

?显示数据源的Source来源

MsgBox rstBase.Source & vbCr & rstMark.Source ?绑定数据控件 For i = 0 To 2

Set lblMark(i).DataSource = rstMark

lblMark(i).DataField = rstMark.Fields(i).Name Next i End Sub

Private Sub cmdMoveBase_Click(Index As Integer) ?“基本情况表”翻动按钮组 Select Case Index Case 0

rstBase.MoveFirst Case 1

rstBase.MovePrevious

If rstBase.BOF = True Then rstBase.MoveFirst

MsgBox \已到首记录!\ End If Case 2

rstBase.MoveNext

If rstBase.EOF = True Then

rstBase.MoveLast

MsgBox \已到尾记录!\ End If Case 3

rstBase.MoveLast End Select End Sub

Private Sub cmdMoveMark_Click(Index As Integer) ?“学生成绩表”翻动按钮组 Select Case Index Case 0

rstMark.MoveFirst Case 1

rstMark.MovePrevious

If rstMark.BOF = True Then rstMark.MoveFirst

MsgBox \已到首记录!\ End If Case 2

rstMark.MoveNext

If rstMark.EOF = True Then rstMark.MoveLast

MsgBox \已到尾记录!\ End If Case 3

rstMark.MoveLast End Select End Sub

如果在上例中,使用第三种方法获取rstBase的Recordset记录集,语句如下:

set rstBase=cnn.Execute(“select * from StudentBase”,,adCmdText)

rstBase.MoveLast

MsgBox \已到尾记录!\ End If Case 3

rstBase.MoveLast End Select End Sub

Private Sub cmdMoveMark_Click(Index As Integer) ?“学生成绩表”翻动按钮组 Select Case Index Case 0

rstMark.MoveFirst Case 1

rstMark.MovePrevious

If rstMark.BOF = True Then rstMark.MoveFirst

MsgBox \已到首记录!\ End If Case 2

rstMark.MoveNext

If rstMark.EOF = True Then rstMark.MoveLast

MsgBox \已到尾记录!\ End If Case 3

rstMark.MoveLast End Select End Sub

如果在上例中,使用第三种方法获取rstBase的Recordset记录集,语句如下:

set rstBase=cnn.Execute(“select * from StudentBase”,,adCmdText)

本文来源:https://www.bwwdw.com/article/b6i8.html

Top