1、单击以编辑母版标题样式,单击以编辑母版文本样式a,第二级a,第三级,第四级,第五级,*,第9章 ADO对象和ADO编程,数据库编程技术,1,9.1 ADO的编程模型,ADO(ActiveX Data Objects)是Microsoft公司最新推出的数据访问技术。它将逐步替代DAO和RDO而成为主要的数据访问接口。,1 ADO编程模型的层次结构简介,ADO编程模型主要由连接(Connection)、命令(Command)、记录集(Recordset)、字段(Field)、参数(Parameter)、错误(Error)和属性(Property)等,七个对象集合,组成。图9-1表示了ADO对象模型
2、的层次结构。,2,1.ADO编程模型的层次结构,Connection,Recordset,Command,Errors,Properties,Properties,Fields,Parameters,Properties,Properties,Properties,3,2.连接对象(Connection),Connection对象代表了打开的与数据源的连接。,建立与数据源的连接后,可以用Connection的属性和方法来执行各种操作。如:,ConnectionString,属性:连接字符串,对连接进行初始化。,Provider,属性:指定OLE DB的提供者。,Open,方法:建立到数据源的物
3、理连接。可用,Close,方法将其切断。,Execute,方法:对连接执行的各种操作。,Cancel方法:取消Open方法或Execute方法的调用。,4,3.命令对象(Command),Command对象,定义了将对数据源执行的命令,相当于一个查询。使用Command对象查询数据库,并返回Recordset对象中的记录。命令可以在数据源中添加、删除或更改数据。,常用的属性和方法如下:,ActiveConnection,属性:设置到数据源的连接信息。,CommandText,属性:指定发送的命令文本。如SQL语句、数据表名称。,CommandType,属性:设置或返回CommandText的类
4、型。,Execute,方法:执行CommandText指定的操作。,Cancel,方法:取消Execute方法的调用。,5,Recordset对象常用的方法:,Open,:打开代表数据表、查询结果等记录集。,MoveFirst,MoveLast,MoveNext,和MovePrevious,:移动记录指针到首记录,末记录,下一个记录,上一个记录。,AddNew,:创建一条新的空记录。,Update,:保存当前记录的更改。,CancelUpdate,:,调用Update方法之前取消对当前记录的更改。,Delete,:删除当前记录。,Requery,:重新执行生成Recordset对象的查询,以更
5、新其中数据。,8,5.字段对象(Field)和字段集合(Fields),Field对象代表记录中的一列,Fields是Field对象的集合,描述记录中的字段的集合。,Fields的主要属性和方法如下:,Name,属性:字段的名称。,Value,属性:字段的值。,Count,属性:得到Fields集合中包含的Field对象的数量。,Append,方法:用于向Fields集合添加一个Field对象。,Delete,方法:用于从Fields集合中删除一个Field对象。,使用格式:,Fields.Delete FieldName,其中,Fields,是要删除字段的Fields集合,,FieldNam
6、e,是要删除的Field对象名。,9,9.2 使用ADO对象编程,使用ADO对象编程,一般有以下几个步骤:,在VB工程中引用ADO对象库;,建立与数据库的连接;,创建命令;,运行命令;,使用记录集的属性和方法操作数据库中的数据。,10,9.2.1 引用ADO对象,要在VB中使用ADO对象编程时,事先必须在工程中引用ADO对象库。,在VB6.0,中提供了ADO类型库,ADODB,引用方法:执行菜单,工程引用,命令,,在打开的引用对话框中,选中:,Microsoft ActiveX Data Objects 2.6 Library,单击确定按钮,11,9.2.2 建立与数据源的连接,建立与SQL
7、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,关闭连接,12,2用Connection对象的带参数的Open方法,Dim cnn As New
8、 ADODB.Connection,定义连接对象变量cnn,cnn.Open DSN=cjgl;uid=sa;pwd=sa;,打开连接,其它代码,cnn.Close,关闭连接,13,9.2.3 创建命令及运行命令,1创建命令,建立和数据源的连接后,可以先声明Command类型的对象变量,然后设置该对象变量的ActiveConnection属性指定该命令使用的连接对象,设置CommandText属性,设置命令文本字符串,则该命令对象就可以在以后的程序中使用了。以下为常见的代码编写格式:,Dim cmd As New ADODB.Command,声明Command对象变量,Set cmd.Acti
9、veConnection=cn,指定该命令使用的连接对象,cmd.CommandText=“Select*From 教师信息表”,其它代码,14,2运行命令,运行命令以返回Recordset集合。可以用Connection.Excute、Command.Excute、Recordset.Open这三种方法运行命令,它们的完整语法格式如下:,Connection.Excute,(CommandText,RecordsAffected,Options),Command.Excute,(RecordsAffected,Parameters,Options),Recordset.Open,Source
10、ActiveConnection,CursorType,LockType,Options,15,以下代码用Recordset的Open方法运行命令cmd。,Dim rs As New ADODB.Recordset,rs.CursorLocation=adUseClient 使用本地游标库提供的客户端游标,rs.Open cmd,adOpenStatic,adLockBatchOptimistic,16,9.2.4 用代码访问ADO对象,用代码访问ADO对象,通过操作ADO对象的方法和设置其属性,可实现对数据库的访问和控制。访问ADO对象时,一般先声明对象变量,然后建立该对象的引用,程序执行
11、完,最后应释放对象变量。如:,Dim cn As New ADODB.Connection,声明Connection对象变量,cn.Open DSN=cjgl;uid=sa;pwd=sa;,Set cn=Nothing,释放对象变量,17,使用ADO对象时,可以通过对象的Index属性或Name属性建立对对象的访问。,如访问Recordset的Fields对象的语法格式有以下几种:,Dim rst As New ADODB.Recordset,rst.Fields(Index),使用索引号访问字段,Index=0表示第一个字段(第一列),rst.Fields(FieldName),使用对象名,
12、rst.Fields.Item(Index),rst.Fields.Item(FieldName),rst.Fields!FieldName,使用对象名,18,如下面的代码中,分别用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!学号,以上几个对记录
13、集中的,字段进行操作的语句的功能是相同的,,即将“学号”字段的数据项显示到文本框Text1中。,19,9.3 ADO编程应用举例,例9-1 打开一个连接后,创建并运行命令,将教师信息表中部分,记录集,中的部分字段打印到窗体上。要求只显示男教师的姓名、性别、单位。,设计过程如下:,(1).新建工程,在窗体中添加一个命令钮(界面如图)。,设置命令钮的属性:,Name:Cmd1,Caption:显示数据,20,(2).配置ODBC数据源:,将SQL Server数据库“成绩管理”,配置ODBC数据源,名称:“cjgl,,(3).引用ADO对象:,在VB工程中,执行菜单,工程引用,,选中 Micros
14、oft 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,21,Private Sub Cmd1_Click(),Dim i As Integer,cn.Open DSN=cjgl;uid=sa;pwd=sa;,建立数据源连接,Set cmd.ActiveConnection=cn,创建命令,cmd.CommandText=Sele
15、ct*From 教师信息表,设置作为命令文本的SQL语句,cmd.CommandType=adCmdText,设置命令类型,cn.CursorLocation=adUseClient,rst.Open cmd,运行cmd命令产生记录集,22,使用记录集对象:,rst.Sort=姓名,按姓名字段排序,rst.Filter=性别=男,rst.MoveFirst,Print,姓名,&,性别,&,单位,Print,For,i=0 To rst.RecordCount-1,Print rst.Fields(姓名)&rst.Fields(性别)&rst.Fields(单位),rst.MoveNext,Ne
16、xt i,cn.Close,释放各对象变量:,Set rst=Nothing,Set cmd=Nothing,Set cn=Nothing,End Sub,图9-3 例9-1的运行结果,23,例9-2 设计教师信息表数据编辑窗体。,(1)新建工程。,(2)引用ADO对象:执行菜单:工程引用,选中Microsoft ActiveX Data Objects 2.6 Library,(3)配置数据源,与例9-1用同一个数据源:cjgl,所以不必重新配置。,(4)设计界面如图9-4。,建立标签Label1和文本框Text1控件数组,标签数组用来显示教师信息表的字段名,Text1数组用来显示或输入、修
17、改表中的数据。,用Text2显示Recordset对象返回的当前记录号及记录总数。,24,图9-4 例9-2设计界面,图9-5 例9-2运行结果,25,教师表的数据项如下:,教师编号,姓名,性别,职称,单位,01001,郑虹,男,副教授,机械学院,03004,孙丽,女,教授,信息学院,Fields(0),Fields(1),Fields(4),26,(5)编写程序,在(通用)(声明)段中定义以下窗体级变量:,Dim cnn As New ADODB.Connection,Dim rst As New ADODB.Recordset,Dim cmd As New ADODB.Command,在(
18、通用)(声明)段中定义,RefreshForm()通用Sub过程,用来显示当前记录集的数据:,Sub RefreshForm(),Dim i As Integer,If,rst.,EOF,And rst.,BOF,Then,如果记录集是空的,MsgBox 空表,,请添加记录,vbCritical,提示,Exit Sub,End If,27,For i=0 To 4,Label1(i).Caption=rst.Fields(i).Name,将字段名称显示到标签上,If rst.Fields(i)“”Then,如果当前记录的第,i个字段值不为空,Text1(i).Text=rst.Fields(i
19、),将当前记录显示到文本框中,Else,Text1(i)=,End If,Text1(i).Locked=True,锁住文本框,不允许编辑,Next i,显示当前记录的位置/记录总数:,Text2.Text=,记录:,&,rst.AbsolutePosition,&,/,&,rst.RecordCount,End Sub,28,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 教师
20、信息表,cnn,Call RefreshForm,调用RefreshForm过程,显示记录集数据,End Sub,29,窗体中添加了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 RefreshFo
21、rm,End Sub,30,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,31,窗体的右边放了4个命令钮,Name分别为:,cmdAdd,cmdSave,cmdDel,CmdEdit,cmdClose,Caption分别为:,增加、保存、删除、修改、退出,Private Sub cmdAdd_Click(),Text2.T
22、ext=新增记录,For i=0 To 4,Text1(i).Locked=False,开锁,Text1(i).Text=,清空文本框,Next i,Text1(0).SetFocus,设置焦点,rst.AddNew,End Sub,32,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 T
23、o 4,Text1(i).Locked=False,开锁,Next i,End Sub,33,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,34,图9-6 登录窗体,例9-3 在例9-2工程中,设计一个登录窗体,用ADO编程实现登录窗体的功能。,(1)设计窗体,在例9-2工程中添加窗体作为登录窗体:执行菜单 工程添加窗体,设置该窗体属性,N
24、ame:frmPassword,MaxButton:False(无最大化按钮),Caption:登录,MinButton:False(无最小化按钮),添加控件如图9-6,35,36,(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,37,Private Sub cmdOK_
25、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,38,Else,MsgBox 密码错误,请重新输入,vbCritical,错误,Text2.Text=清空密码输入框,Text2
26、SetFocus,End If,rst.Close,关闭记录集,End Sub,Private Sub cmdCancel_Click(),Unload Me,End Sub,39,例9-4 用MSFlexGrid控件显示教师信息表的所有记录。,(1)设计界面,MSFlexGrid控件属于ActiveX控件,不在标准工具箱中。,执行菜单工程部件命令,选择:,Microsoft FlexGrid Control 6.0,,将MSFlexGrid控件添加到工具箱中。,在窗体上添加一个MSFlexGrid控件,属性:,名称:MSG1,Font:五号、粗体,添加一个按钮,属性如下:,名称:CmdDi
27、splay,Caption:显示,40,图9-7 MSFlexGrid控件显示教师信息表,41,(2)设计代码,定义一个通用Sub过程,名为ShowGrid,实现将记录集的内容显示到MSFlexGrid控件中。过程的头部定义为:,Sub ShowGrid(,Rs,As ADODB.Recordset,MS,As MSFlexGrid),ShowGrid过程有,两个形参,,其中,Rs,为Recordset对象变量,,MS,为MSFlexGrid控件类型变量,因此在调用该过程时,应注意实参的类型要与形参类型匹配,即传递给形参Rs的实参应该是Recordset对象变量,传递给形参MS的实参应该是MS
28、FlexGrid控件的名称。以下是ShowGrid过程的代码。,42,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,43,Do While,No
29、t 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,44,Dim cn As New ADODB.Connection,Dim rst As New ADODB.Recordset,Private Sub CmdDisplay_Click(),Dim s As Str
30、ing,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,45,例9-5设计教师信息的查询窗体,输入要查询的姓名,或只输入姓,单击查询按钮,可在下边的
31、网格控件中显示查询的结果。,(1)设计界面,如图9-8所示,在窗体上添加一个MSFlexGrid控件,名称:MSG2,Font:五号、粗体,添加一个按钮,,名称:CmdQuery,Caption:查询,添加一个文本框,名称:Text1,添加一个标签,,名称:Label1,Caption:输入姓名,图9-8 查询窗体运行结果,46,(2)设计代码,Dim cn As New ADODB.Connection,Dim rst As New ADODB.Recordset,Dim cmd As New ADODB.Command,Private Sub CmdQuery_Click(),Dim sq
32、lstr 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,47,cmd.CommandType=adCmdText,Set rst=cmd.Execute,运行cmd命令产生记录集,此处也可用,rst.Open cmd,Call ShowGrid
33、rst,MSG2),调用通用过程显示记录集,ShowGrid过程代码与例9-4中相同,cn.Close,Set rst=Nothing,Set cmd=Nothing,Set cn=Nothing,End Sub,运行程序,在文本框中输入姓(例如:王),单击查询按钮,结果在网格控件中显示姓王的教师信息,如图9-8。,48,本章小结,ADO的编程模型,使用ADO对象编程中,介绍了引用ADO对象的方法,建立与数据源的连接的方法,创建命令及运行命令的方法,用代码访问ADO对象的方法,最后举例讲解了ADO编程的应用,如浏览窗体和编辑窗体的设计、用网格控件显示数据的方法、查询窗体的设计。,49,第9章 结束,50,






