490 likes | 669 Views
数据库编程技术. 第 9 章 ADO 对象和 ADO 编程. 9.1 ADO 的编程模型. ADO(ActiveX Data Objects) 是 Microsoft 公司最新推出的数据访问技术。它将逐步替代 DAO 和 RDO 而成为主要的数据访问接口。 1 ADO 编程模型的层次结构简介
E N D
数据库编程技术 第9章 ADO对象和ADO编程
9.1 ADO的编程模型 • ADO(ActiveX Data Objects)是Microsoft公司最新推出的数据访问技术。它将逐步替代DAO和RDO而成为主要的数据访问接口。 • 1 ADO编程模型的层次结构简介 • ADO编程模型主要由连接(Connection)、命令(Command)、记录集(Recordset)、字段(Field)、参数(Parameter)、错误(Error)和属性(Property)等七个对象集合组成。图9-1表示了ADO对象模型的层次结构。
Connection Recordset Fields Properties Properties Command Parameters Properties Properties Errors Properties • 1. ADO编程模型的层次结构
2. 连接对象( Connection) • Connection对象代表了打开的与数据源的连接。 • 建立与数据源的连接后,可以用Connection的属性和方法来执行各种操作。如: • ConnectionString属性:连接字符串,对连接进行初始化。 • Provider属性:指定OLE DB的提供者。 • Open方法:建立到数据源的物理连接。可用Close方法将其切断。 • Execute方法:对连接执行的各种操作。 • Cancel方法:取消Open方法或Execute方法的调用。
3.命令对象(Command) • Command对象定义了将对数据源执行的命令,相当于一个查询。使用Command对象查询数据库,并返回Recordset对象中的记录。命令可以在数据源中添加、删除或更改数据。 • 常用的属性和方法如下: • ActiveConnection属性:设置到数据源的连接信息。 • CommandText属性:指定发送的命令文本。如SQL语句、数据表名称。 • CommandType属性:设置或返回CommandText的类型。 • Execute方法:执行CommandText指定的操作。 • Cancel方法:取消Execute方法的调用。
4.记录集对象(Recordset) • 描述来自数据表或命令执行结果的记录集合。 Recordset对象是在行中检查和修改数据最主要的方法。常用于指定可以检查的记录,移动记录,添加、更改或删除记录等。 • Recordset对象常用的属性: • Source:返回或设置Recordset对象的生成方式:Command对象、SQL语句或查询名 • RecordCount:返回记录集中的记录总数。 • AbsolutePosition: 记录指针位置(从1开始).
BOF、EOF:标志当前记录指针是否首记录之前或末记录之后。BOF、EOF:标志当前记录指针是否首记录之前或末记录之后。 • Bookmark:返回或设置Recordset对象中当前记录的书签。 • CursorType:返回或设置Recordset对象中 使用的游标类型。 • Filter:设置Recordset对象中的数据筛选条件。 • Sort:设置排序字段。
Recordset对象常用的方法: • Open:打开代表数据表、查询结果等记录集。 • MoveFirst, MoveLast, MoveNext,和MovePrevious:移动记录指针到首记录,末记录,下一个记录,上一个记录。 • AddNew:创建一条新的空记录。 • Update:保存当前记录的更改。 • CancelUpdate:调用Update方法之前取消对当前记录的更改。 • Delete:删除当前记录。 • Requery:重新执行生成Recordset对象的查询,以更新其中数据。
5. 字段对象(Field)和字段集合(Fields) • Field对象代表记录中的一列,Fields是Field对象的集合,描述记录中的字段的集合。 • Fields的主要属性和方法如下: • Name属性:字段的名称。 • Value属性:字段的值。 • Count属性:得到Fields集合中包含的Field对象的数量。 • Append方法:用于向Fields集合添加一个Field对象。 • Delete方法:用于从Fields集合中删除一个Field对象。 • 使用格式:Fields.Delete FieldName • 其中Fields是要删除字段的Fields集合,FieldName是要删除的Field对象名。
9.2 使用ADO对象编程 • 使用ADO对象编程,一般有以下几个步骤: • 在VB工程中引用ADO对象库; • 建立与数据库的连接; • 创建命令; • 运行命令; • 使用记录集的属性和方法操作数据库中的数据。
9.2.1 引用ADO对象 • 要在VB中使用ADO对象编程时,事先必须在工程中引用ADO对象库。 • 在VB6.0中提供了ADO类型库——ADODB • 引用方法:执行菜单[工程]\[引用]命令, • 在打开的引用对话框中,选中: • "Microsoft ActiveX Data Objects 2.6 Library" • 单击[确定]按钮
9.2.2 建立与数据源的连接 • 建立与SQL Server数据库连接的方法很多,这里主要介绍最常用的方法,即用DSN建立连接。 • 以前边已配置好的数据源cjgl为例,建立数据源的代码格式有以下二种。 • 1.用Connection对象的ConnectionString属性 • Dim cn As New ADODB.Connection ' 定义连接对象变量cn • cn. Connectionstring = "DSN= cjgl ; uid=sa ; pwd = sa" • cn. ConnectionTimeout=10 • cn.Open ' 打开连接 • … … ' 其它操作数据库的代码 • cn.Close ' 关闭连接
2.用Connection对象的带参数的Open方法 • Dim cnn As New ADODB.Connection ' 定义连接对象变量cnn • cnn.Open "DSN=cjgl; uid=sa; pwd=sa; " ' 打开连接 • … … ' 其它代码 • cnn.Close ' 关闭连接
9.2.3 创建命令及运行命令 • 1.创建命令 • 建立和数据源的连接后,可以先声明Command类型的对象变量,然后设置该对象变量的ActiveConnection属性指定该命令使用的连接对象,设置CommandText属性,设置命令文本字符串,则该命令对象就可以在以后的程序中使用了。以下为常见的代码编写格式: • Dim cmd As New ADODB.Command ' 声明Command对象变量 • Set cmd . ActiveConnection= cn ' 指定该命令使用的连接对象 • cmd . CommandText = “Select * From 教师信息表” • …… ' 其它代码
2.运行命令 • 运行命令以返回Recordset集合。可以用Connection.Excute、Command.Excute、Recordset.Open这三种方法运行命令,它们的完整语法格式如下: • Connection.Excute( CommandText , RecordsAffected , Options ) • Command.Excute( RecordsAffected, Parameters, Options ) • Recordset.Open Source, ActiveConnection, CursorType, LockType, Options
以下代码用Recordset的Open方法运行命令cmd。 • Dim rs As New ADODB. Recordset • rs. CursorLocation = adUseClient '使用本地游标库提供的客户端游标 • rs.Open cmd,cn,adOpenStatic, adLockBatchOptimistic • ……
9.2.4 用代码访问ADO对象 • 用代码访问ADO对象,通过操作ADO对象的方法和设置其属性,可实现对数据库的访问和控制。访问ADO对象时,一般先声明对象变量,然后建立该对象的引用,程序执行完,最后应释放对象变量。如: • Dim cn As New ADODB.Connection '声明Connection对象变量 • cn.Open "DSN=cjgl; uid=sa; pwd=sa; " • …… • Set cn = Nothing ' 释放对象变量
使用ADO对象时,可以通过对象的Index属性或Name属性建立对对象的访问。使用ADO对象时,可以通过对象的Index属性或Name属性建立对对象的访问。 • 如访问Recordset的Fields对象的语法格式有以下几种: • Dim rst As New ADODB.Recordset • rst.Fields (Index) '使用索引号访问字段,Index=0表示第一个字段(第一列) • rst. Fields ("FieldName") '使用对象名 • rst. Fields.Item (Index) • rst. Fields.Item ("FieldName") • rst. Fields ! [FieldName] '使用对象名
如下面的代码中,分别用Fields对象的Index属性或Name属性来引用字段:如下面的代码中,分别用Fields对象的Index属性或Name属性来引用字段: • Dim rst As New ADODB.Recordset • Text1.Text =rst.Fields(0) • Text1.Text =rst .Fields(“学号”) • Text1.Text =rst.Fields.Item(0) • Text1.Text =rst .Fields.Item(“学号”) • Text1.Text =rst .Fields![学号] • 以上几个对记录集中的字段进行操作的语句的功能是相同的,即将“学号”字段的数据项显示到文本框Text1中。
9.3 ADO编程应用举例 • 例9-1 打开一个连接后,创建并运行命令,将教师信息表中部分记录集中的部分字段打印到窗体上。要求只显示男教师的姓名、性别、单位。 • 设计过程如下: • (1). 新建工程,在窗体中添加一个命令钮(界面如图)。 • 设置命令钮的属性: • Name :Cmd1 , • Caption : "显示数据"
(2). 配置ODBC数据源: • 将SQL Server数据库 “成绩管理”,配置ODBC数据源,名称: “cjgl", • (3). 引用ADO对象: • 在VB工程中,执行菜单[工程]\[引用],选中 "Microsoft ActiveX Data Objects 2.6 Library" • (4). 编写代码: • ‘在窗体的(通用)(声明)段,声明以下对象变量: • Dim cn As New ADODB.Connection • Dim cmd As New ADODB.Command • Dim rst As New ADODB.Recordset
Private Sub Cmd1_Click() • Dim i As Integer • cn.Open "DSN=cjgl; uid=sa; pwd=sa; " ' 建立数据源连接 • Set cmd.ActiveConnection=cn '创建命令 • cmd.CommandText = "Select * From 教师信息表" '设置作为命令文本的SQL语句 • cmd.CommandType = adCmdText '设置命令类型 • cn.CursorLocation = adUseClient • rst.Open cmd ' 运行cmd命令产生记录集
图9-3 例9-1的运行结果 • '使用记录集对象: • rst.Sort = "姓名" ' 按姓名字段排序 • rst.Filter = " 性别= '男' " • rst.MoveFirst • Print "姓名 " & "性别 " & " 单位" • Print • For i = 0 To rst.RecordCount - 1 • Print rst.Fields("姓名") & " " & rst.Fields("性别") & " " & rst.Fields("单位") • rst.MoveNext • Next i • cn.Close • '释放各对象变量: • Set rst = Nothing • Set cmd = Nothing • Set cn = Nothing • End Sub
例9-2 设计教师信息表数据编辑窗体。 • (1)新建工程。 • (2)引用ADO对象:执行菜单:[工程]\[引用],选中"Microsoft ActiveX Data Objects 2.6 Library" • (3)配置数据源 • 与例9-1用同一个数据源:cjgl , 所以不必重新配置。 • (4)设计界面如图9-4。 • 建立标签Label1和文本框Text1控件数组,标签数组用来显示教师信息表的字段名,Text1数组用来显示或输入、修改表中的数据。 • 用Text2显示Recordset对象返回的当前记录号及记录总数。
图9-5 例9-2运行结果 图9-4 例9-2设计界面
教师表的数据项如下: Fields(0) Fields(1) Fields(4)
(5)编写程序 • ‘在(通用)(声明)段中定义以下窗体级变量: • Dim cnn As New ADODB.Connection • Dim rst As New ADODB.Recordset • Dim cmd As New ADODB.Command • ‘在(通用)(声明)段中定义RefreshForm()通用Sub过程,用来显示当前记录集的数据: • Sub RefreshForm() • Dim i As Integer • If rst.EOF And rst.BOF Then ' 如果记录集是空的 • MsgBox " 空表,请添加记录", vbCritical, "提示" • Exit Sub • End If
For i = 0 To 4 • Label1(i).Caption = rst.Fields(i).Name ' 将字段名称显示到标签上 • If rst.Fields(i) <> “ ” Then ‘ 如果当前记录的第i个字段值不为空 • Text1(i).Text = rst.Fields(i) ‘ 将当前记录显示到文本框中 • Else • Text1(i) = "" • End If • Text1(i).Locked = True '锁住文本框,不允许编辑 • Next i • '显示当前记录的位置/记录总数: • Text2.Text = "记录:" & rst.AbsolutePosition & "/" & rst.RecordCount • End Sub
Private Sub Form_Load() • Dim s As String • s = "DSN=cjgl;uid=sa;pwd=sa" • cnn.Open s ' 打开连接 • cnn.CursorLocation = adUseClient • rst.Open "Select * From 教师信息表 ", cnn, adOpenDynamic, adLockOptimistic • Call RefreshForm ' 调用RefreshForm过程,显示记录集数据 • End Sub
窗体中添加了4个命令钮,Name分别为: • cmdFirst, cmdPrevious ,cmdNext, cmdLast • Caption分别为:|<、< 、> 、>|。编程如下: • Private Sub cmdFirst_Click() • rst.MoveFirst • Call RefreshForm • End Sub • Private Sub cmdPrevious_Click() • rst. MovePrevious • If rst.BOF Then rst.MoveFirst • Call RefreshForm • End Sub
Private Sub cmdNext_Click() • rst. MoveNext • If rst.EOF Then rst.MoveLast • Call RefreshForm • End Sub • Private Sub cmdLast_Click() • rst.MoveLast • Call RefreshForm • End Sub
窗体的右边放了4个命令钮,Name分别为: • cmdAdd, cmdSave ,cmdDel , CmdEdit, cmdClose • Caption分别为:增加、保存、删除、修改、退出 • Private Sub cmdAdd_Click() • Dim I as integer • Text2.Text = "新增记录" • For i = 0 To 4 • Text1(i).Locked = False '开锁 • Text1(i).Text = "" ' 清空文本框 • Next i • Text1(0).SetFocus ' 设置焦点 • rst.AddNew • End Sub
Private Sub cmdSave_Click() • Dim i As Integer • For i = 0 To 4 • rst.Fields(i) = Text1(i) '写入数据库 • Next i • rst.Update '更新数据库 • Call RefreshForm • End Sub • Private Sub CmdEdit_Click() ‘ 单击[修改]按钮 • For i = 0 To 4 • Text1(i).Locked = False '开锁 • Next i • End Sub
Private Sub cmdDel_Click() • rst.Delete • rst.MoveNext • If rst.EOF Then rst.MoveLast • Call RefreshForm • End Sub • Private Sub cmdClose_Click() • Unload Me • End Sub
图9-6 登录窗体 例9-3 在例9-2工程中,设计一个登录窗体,用ADO编程实现登录窗体的功能。 • (1)设计窗体 • 在例9-2工程中添加窗体作为登录窗体:执行菜单 [工程]\[添加窗体] • 设置该窗体属性 • Name:frmPassword • MaxButton:False (无最大化按钮) • Caption:登录 • MinButton: False (无最小化按钮) • 添加控件如图9-6
(3)设计代码 • Dim cn As New ADODB.Connection • Dim rst As New ADODB.Recordset • Private Sub Form_Load() • Dim s As String • s = "DSN=cjgl;uid=sa;pwd=sa" • cn.Open s ' 打开连接 • cn.CursorLocation = adUseClient • End Sub
Private Sub cmdOK_Click() • rst.Open "Select * From 密码表 where 用户名='" & Text1.Text & "'", cn ' 打开记录集 • If rst.BOF And rst.EOF Then • MsgBox "无效用户名,请重新输入。", vbCritical, "错误" • Text1 = "" • Text1.SetFocus • ElseIf Text2 = rst.Fields("密码") Then ' 检测密码 • MsgBox "登录成功!", vbInformation • Form1.Show • Me.Hide
Else • MsgBox "密码错误,请重新输入", vbCritical, "错误" • Text2.Text = " " ' 清空密码输入框 • Text2.SetFocus • End If • rst.Close ' 关闭记录集 • End Sub • Private Sub cmdCancel_Click() • Unload Me • End Sub
例9-4 用MSFlexGrid控件显示教师信息表的所有记录。 • (1)设计界面 • MSFlexGrid控件属于ActiveX控件,不在标准工具箱中。 • 执行菜单[工程]\[部件]命令,选择:"Microsoft FlexGrid Control 6.0",将MSFlexGrid控件添加到工具箱中。 • 在窗体上添加一个MSFlexGrid控件,属性: • 名称:MSG1, Font:五号、粗体 • 添加一个按钮,属性如下: • 名称:CmdDisplay , Caption :显示
(2)设计代码 • 定义一个通用Sub过程,名为ShowGrid,实现将记录集的内容显示到MSFlexGrid控件中。过程的头部定义为: • Sub ShowGrid(Rs As ADODB.Recordset, MS As MSFlexGrid) • ShowGrid过程有两个形参,其中Rs为Recordset对象变量,MS为MSFlexGrid控件类型变量,因此在调用该过程时,应注意实参的类型要与形参类型匹配,即传递给形参Rs的实参应该是Recordset对象变量,传递给形参MS的实参应该是MSFlexGrid控件的名称。以下是ShowGrid过程的代码。
Sub ShowGrid(Rs As ADODB.Recordset, MS As MSFlexGrid) • Dim j As Integer • RowNum = 1 • MS.Rows = RowNum ' 设置MS控件的行数 • MS.Cols = Rs.Fields.Count ' 用记录集的字段数设置MSFlexGrid控件的列数 • For j = 0 To Rs.Fields.Count - 1 • MS.TextMatrix(0, j) = Rs.Fields(j).Name ‘ 将记录集的各字段名显示到网格控件的第1行 • Next j
Do While Not Rs.EOF ' 当没有到记录集尾时 • RowNum = RowNum + 1 • MS.Rows = RowNum ' 设置网格控件的行数 • For j = 0 To Rs.Fields.Count –1 • MS.TextMatrix(RowNum - 1, j) = Rs.Fields(j) ' 将当前行记录的各字段值显示到控件中 • Next j • Rs.MoveNext ' 记录指针移到下一条记录上 • Loop • End Sub
Private Sub CmdDisplay_Click() • Dim cn As New ADODB.Connection • Dim rst As New ADODB.Recordset • Dim s As String • s = "DSN=cjgl;uid=sa;pwd=sa" • cn.Open s ' 打开连接 • cn.CursorLocation = adUseClient • rst.Open "Select * From 教师信息表 ", cn ' 打开教师信息表产生记录集 • Call ShowGrid (rst, MSG1) ' 调用ShowGrid过程,将rst记录集数据显示到MSG1控件中 • cn.Close ' 关闭数据库连接 • Set rst = Nothing ' 释放各对象变量 • Set cmd = Nothing • Set cn = Nothing • End Sub
图9-8 查询窗体运行结果 例9-5设计教师信息的查询窗体 • 输入要查询的姓名,或只输入姓,单击[查询]按钮,可在下边的网格控件中显示查询的结果。 • (1)设计界面 • 如图9-8所示,在窗体上添加一个MSFlexGrid控件,名称:MSG2, Font:五号、粗体 • 添加一个按钮, • 名称:CmdQuery , Caption :查询 • 添加一个文本框,名称:Text1 • 添加一个标签, • 名称:Label1, Caption :输入姓名
(2)设计代码 • Dim cn As New ADODB.Connection • Dim rst As New ADODB.Recordset • Dim cmd As New ADODB.Command • Private Sub CmdQuery_Click() • Dim sqlstr As String • Dim s As String • s = "DSN=cjgl;uid=sa;pwd=sa" • cn.Open s ' 打开连接 • cn.CursorLocation = adUseClient • sqlstr = "select * from 教师信息表 where 姓名 Like ' " & Text1 & " %' " • Set cmd.ActiveConnection = cn ' 创建命令 • cmd.CommandText = sqlstr
cmd.CommandType = adCmdText • Set rst = cmd.Execute • Call ShowGrid(rst, MSg2) • cn.Close • Set rst = Nothing • Set cmd = Nothing • Set cn = Nothing • End Sub
本章小结 • ADO的编程模型,使用ADO对象编程中,介绍了引用ADO对象的方法,建立与数据源的连接的方法,创建命令及运行命令的方法,用代码访问ADO对象的方法,最后举例讲解了ADO编程的应用,如浏览窗体和编辑窗体的设计、用网格控件显示数据的方法、查询窗体的设计。