1、第10章 Visual Basic数据库程序设计,课程描述ADO是目前比较流行的数据库访问技术。它是使用更加简单灵活的对象模型,适用于各种程序设计语言。本章将结合Visual Basic介绍ADO数据访问技术。,本章知识点,ADO数据模型 常用数据库访问控件 Visual Basic数据库应用工程管理,10.1 ADO数据模型,ADO数据模型 常用ADO对象的使用,10.1.1 ADO数据模型,1连接 2命令 3参数 4记录集 5字段 6错误 7属性 8集合 9事件,10.1.2 常用ADO对象的使用,1Connection对象 2Command对象 3Recordset对象 4Field对象
2、在Visual Basic中,选择菜单“工程”/“引用”,打开“引用”对话框,在引用列表中勾选“Microsoft Activex Data Objects 2.6 Library”(不同环境下ADO的版本号可能不同),1Connection对象,Connection对象代表与数据源的连接。 创建Connection对象的方法如下:Dim cnn As New ADODB.Connection,属性,(1)ConnectionString属性 (2)ConnectionTimeout属性 (3)Mode属性 (4)State属性 (5)Open方法 (6)Close方法,(1)Connecti
3、onString属性,ConnectionString是连接字符串,指定用于建立连接数据源的信息。可以使用ODBC数据源来表示连接字符串,代码如下: Dim cnn As New ADODB.Connection cnn.ConnectionString = “DSN=mydata; “ 可以通过直接设置数据源提供者(Provider)和数据库文件的方法表示连接字符串,代码如下: Dim cnn As New ADODB.Connection cnn.ConnectionString = “Provider=SQLOLEDB.1;Password=sa;Persist Security Inf
4、o=True; User ID=sa;Initial Catalog=database_name; Data Source=127.0.0.1“参数Provider表示数据源提供者,“SQLOLEDB.1”代表数据源类型为SQL Server; User ID表示访问数据库的用户名; Password表示用户密码; Initial Catelog表示数据库名; Data Source表示数据库服务器名称或IP地址,127.0.0.1表示本地计算机。,(2)ConnectionTimeout属性,ConnectionTimeout属性指示在终止尝试和产生错误之前执行命令需等待的时间,默认值为30
5、s。,(3)Mode属性,Mode属性指定Connection对象修改数据的权限。,(4)State属性,State属性返回Connection对象的状态。,(5)Open方法,Open方法用于打开到数据源的连接。Open方法的语法结构如下:connection.Open ConnectionString, UserID, Password, OptionsConnectionString是连接字符串, UserID是访问数据库的用户名, Password是密码, Options是连接选项。 如果ConnectionString中包含了用户名和密码等信息,则相应的参数可以省略。 如果设置了Co
6、nnection对象的ConectionString属性,Open方法就不需要设置参数了。,(6)Close方法,Close方法用于关闭到数据源的连接。访问数据库完成后,为了节省资源,通常需要将数据库连接关闭。,【例10.1】,下面的程序演示了使用Connection对象连接到数据库的方法。Private Sub Form_Load()创建Connection对象cnn,关键New用于创建新对象Dim cnn As New ADODB.Connection设置连接字符串cnn.ConnectionString = “Provider=SQLOLEDB.1;User ID=sa;“ _+ “Pa
7、ssword=sa;Initial Catalog=HrSystem;Data Source=127.0.0.1“ 打开到数据库的连接cnn.Open判断连接的状态If cnn.State = adStateOpen Then如果连接成功,则显示OKMsgBox “打开数据库“End If关闭连接cnn.Close判断连接的状态If cnn.State = adStateClosed Then如果连接成功,则显示OKMsgBox “关闭数据库“End If End Sub,2Command对象,Command对象定义了将对数据源执行的命令。Command对象的层次结构如下图。,常用属性和方法,
8、(1)ActiveConnection属性通过设置ActiveConnection属性使打开的连接与Command对象关联。 (2)CommandText属性定义命令(例如SQL语句)的可执行文本。 (3)Execute方法执行在CommandText属性中指定的查询、SQL语句或存储过程。,【例10.2】,下面的程序演示了Command对象的使用方法。Private Sub Form_Load()创建Connection对象cnn,关键New用于创建新对象Dim cnn As New ADODB.Connection创建Command对象cmdDim cmd As New ADODB.Com
9、mand设置连接字符串ConnectionString属性cnn.ConnectionString = “Provider=SQLOLEDB.1;User ID=sa;“ _+ “Password=sa;Initial Catalog=HrSystem;Data Source=127.0.0.1“打开到数据库的连接cnn.Open设置cmd的ActiveConnection属性,指定与其关联的数据库连接Set cmd.ActiveConnection = cnn设置要执行的命令文本cmd.CommandText = “UPDATE DepInfo SET Dep_Name=人力资源部 WHER
10、E Dep_Name=人事部“执行命令cmd.ExecuteMsgBox “执行成功“关闭cnn对象cnn.Close End Sub,3Recordset对象,Recordset对象表示来自基本表或命令执行结果的记录全集。 使用ADO时,通过Recordset对象可对几乎所有数据进行操作。 所有Recordset对象均使用记录(行)和字段(列)进行构造。,常用属性和方法,(1)ActiveConnection属性 通过设置ActiveConnection属性使打开的连接与Command对象关联。 (2)AbsolutePosition属性 指定Recordset对象当前记录的序号位置。 (3
11、)BOF、EOF属性 BOF指示当前记录位置位于Recordset对象的第一个记录之前。EOF指示当前记录位置位于Recordset对象的最后一个记录之后。 这两个属性经常被用来判断记录指针是否越界。BOF或EOF为真时,不能从结果集中读取数据,否则会产生错误。,常用属性和方法,(4)MaxRecord属性 指定通过查询返回Recordset的记录的最大数目。例如只需要返回前10条记录时,可以将MaxRecord属性设置为10。 (5)RecordCount 属性 返回Recordset对象中记录的当前数目。 (6)Move方法 在记录集中移动指针。 (7)MoveFirst、MoveLast
12、、MoveNext和MovePrevious 方法 在指定的Recordset对象中移动到第一个、最后一个、下一个或前一个记录并使该记录成为当前记录。,常用属性和方法,(8)Open方法 使用Open方法可打开代表基本表、查询结果或者以前保存的Recordset中记录的游标。 Open方法的语法如下: recordset.Open Source, ActiveConnection, CursorType, LockType, OptionsSource是记录源,它可以是一条SQL语句、一个表或一个存储过程等。 ActiveConnection指定相应的Connection对象。 CursorT
13、ype指定打开Recordset时使用的游标类型,它的值如表10.3所示。 LockType指定打开Recordset时应该使用的锁定类型。 Options指定Source参数的类型。,【例10.3】,下面的程序演示了Recordset对象的使用方法。 Private Sub Form_Load()创建Connection对象cnn,关键New用于创建新对象Dim cnn As New ADODB.Connection创建Recordset对象rs1Dim rs1 As New ADODB.Recordset设置查询记录集的SQL语句,从表DepInfo中读取记录Dim varSource A
14、s StringvarSource = “SELECT * FROM DepInfo“设置连接字符串ConnectionString属性cnn.ConnectionString = “Provider=SQLOLEDB.1;User ID=sa;“ _+ “Password=sa;Initial Catalog=HrSystem;Data Source=127.0.0.1“,【例10.3】,打开到数据库的连接cnn.Open设置rs1的ActiveConnection属性,指定与其关联的数据库连接Set rs1.ActiveConnection = cnn设置游标类型rs1.CursorTyp
15、e = adOpenStatic打开记录集,将从表DepInfo中读取的结果集保存到记录集rs1中rs1.Open varSource显示记录集中记录的数量MsgBox “当前记录集中共有记录 “ + Trim(rs1.RecordCount) + “ 个“将指针移动到记录集的最后rs1.Move rs1.RecordCount判断EOF属性的值If rs1.EOF = True ThenMsgBox “已经达到记录集的结尾“End If关闭记录集rs1.Close关闭cnn对象cnn.Close End Sub,4Field对象,(1)ActualSize 属性 指示字段的值的实际长度。 (
16、2)DefinedSize 属性 指示Field对象所定义的大小。 (3)Name 属性 指示对象的名称。 (4)Value 属性 指示对象的值。 表是由多个字段组成的,所以在很多时候需要使用Fields集合来表示Recordset对象的所有Field对象。,【例10.4】,下面的程序演示了使用Fields集合的使用方法。Private Sub Form_Load()创建Connection对象cnn,关键New用于创建新对象Dim cnn As New ADODB.Connection创建Recordset对象rs1Dim rs1 As New ADODB.Recordset设置查询记录集的
17、SQL语句Dim varSource As StringvarSource = “SELECT * FROM DepInfo ORDER BY Dep_Id“ 设置连接字符串ConnectionString属性cnn.ConnectionString = “Provider=SQLOLEDB.1;User ID=sa;“ _+ “Password=sa;Initial Catalog=HrSystem;Data Source=127.0.0.1“打开到数据库的连接cnn.Open,【例10.4】,设置rs1的ActiveConnection属性,指定与其关联的数据库连接Set rs1.Acti
18、veConnection = cnn设置游标类型rs1.CursorType = adOpenStatic打开记录集,将从表DepInfo中读取的结果集保存到记录集rs1中rs1.Open varSource显示表HOTELMAN.RoomType的字段数MsgBox “表DepInfo共有 “ + Trim(rs1.Fields.Count) + “ 个字段“使用循环语句,依次读取各字段的属性值i = 0Do While i rs1.Fields.Count显示字段的属性MsgBox “第“ + Trim(i + 1) + “个字段的名称为:“ + Trim(rs1.Fields(i).Na
19、me) _+ Chr(13) + “字段定义长度为:“ + Trim(rs1.Fields(i).DefinedSize) _+ Chr(13) + “字段实际长度为:“ + Trim(rs1.Fields(i).ActualSize),【例10.4】,如果当前记录存在则显示当前字段的值,否则显示无当前值If rs1.EOF = False ThenMsgBox “此字段的当前值为:“ + Trim(rs1.Fields(i).Value)ElseMsgBox “此字段没有当前值“End If读取下一个字段i = i + 1Loop关闭记录集rs1.Close关闭cnn对象cnn.Close
20、End Sub,10.2 常用数据库访问控件,ADO Data控件。 DataList控件 DataCombo控件。 DataGrid控件。,10.2.1 ADO Data控件,(1)选择“工程”菜单中的“部件”命令,打开“部件”属性对话框。 (2)在控件列表中,查找并选择Microsoft ADO Data Controls 6.0(OLEDB)。如果在列表中没有此选项,请下载并安装Visual Basic 6.0的升级补丁(VS6SP5)。 (3)单击“确定”按钮,可以看到ADO Data控件的图标出现在“工具箱”中。,ADO Data控件的常用属性,BOF,如果当前记录位于Records
21、et对象的第一个记录之前,则BOF等于true,否则BOF等于false。 ConnectionString,指定连接字符串,用于建立到数据源的连接。 ConnectionTimeout,指定连接数据库的等待时间,如果超过此时间还没有连接到数据库,则产生一个错误。 EOF,如果当前记录位于Recordset对象的第一个记录之后,则EOF等于true,否则EOF等于false。通常用BOF和EOF属性判断记录集的当前游标位置是否存在有效数据。 MaxRecords,返回Recordset对象中记录的数量。,ADO Data控件的常用属性,Mode,指定对数据源的访问权限。AdModeUnknow
22、n是默认值,表明权限尚未设置或无法确定;AdModeRead表明权限为只读;AdModeWrite表明权限为只写;AdModeReadWrite表明权限为读/写;AdModeShareDenyRead防止其他用户使用读权限打开连接;AdModeShareDenyWrite防止其他用户使用写权限打开连接;AdModeShareExclusive防止其他用户打开连接;AdModeShareDenyNone防止其他用户使用任何权限打开连接 Password,设置连接到数据源时指定用户的口令。 Recordset,通过SELECT语句返回的查询结果保存在Recordset属性中。 RecordSour
23、ce,设置一个数据记录源,可以是表、视图或SELECT语句等。查询结果保存在Recordset属性中。 UserName,设置连接到数据源的用户。,【例10.5】,下面是一个ADO Data控件的示例程序。,【例10.5】,(1)创建新工程 (2)设置主窗体属性,【例10.5】,(3)设置ADO Data控件的属性右键单击ADO Data控件,选择菜单中的“ADODC属性”命令,打开“属性页”窗口在“连接资源”选项中选择“使用连接字符串”,然后单击“生成”按钮,打开“数据链接属性”窗口,【例10.5】,选择“Microsoft OLE DB Provider for SQL Server”,单
24、击“下一步”按钮,打开“连接”页面,选择数据库服务器,输入用户名和密码,然后选择数据库HrSystem。单击“测试连接”按钮,如果配置正确,将弹出如图10.11所示的对话框。,【例10.5】,在“属性页”窗口中单击“记录源”选项卡,选择命令类型为8 adCmdUnknown,然后在命令文本中输入以下内容: SELECT * FROM DepInfo ORDER BY Dep_Id 如图10.12所示。设置完成后,单击“确定”按钮。,【例10.5】,(4)设置标签和文本框的属性,10.2.2 DataList控件和DataCombo控件,选择“工程”菜单中的“部件”命令,打开“部件”属性对话框。
25、在控件列表中,查找并选择Microsoft DataList Controls 6.0(OLEDB)。如果在列表中没有此选项,请下载并安装Visual Basic 6.0的升级补丁。 单击“确定”按钮,可以看到DataList控件和DataCombo控件的图标出现在“工具箱”中。,常用属性,BoundColumn,返回或设置绑定数据源中的一个源字段名称,此字段的值会随着DataList控件或DataCombo控件中当前值的变化而变化。 BoundText,返回或设置由BoundColumn属性指定的字段的值。可以把它看成是DataList控件或DataCombo控件当前记录对应的BoundCo
26、lumn属性指定字段的值。 DataField,返回或设置绑定的字段名。 DataSource,返回或设置绑定数据源,通常为ADO Data控件。 ListField,返回或设置Recordset对象中的字段名,这个对象由RowSource属性指定,用于填充DataCombo控件或DataList控件的列表部分。 RowSource,设置一个指定ADO Data控件的值,DataList控件和DataCombo控件的列表由这个ADO Data控件填充。 SelectedItem,返回一个值,包含DataCombo控件或DataList控件中选中记录的值。,【例10.6】,下面是DataComb
27、o控件和DataList控件一起使用的示例程序。,【例10.6】,(1)创建新工程 创建工程存储的目录,运行Visual Basic 6.0主程序,并选择新建“标准EXE”工程。 (2)将ADO Data控件添加到工程中 (3)将DataCombo控件和DataList控件添加到工程中,【例10.6】,(4)设置主窗体属性,【例10.6】,(5)设置第1个ADO Data控件的属性,【例10.6】,(6)设置第2个ADO Data控件的属性,【例10.6】,(7)设置DataCombo控件的属性,【例10.6】,(8)设置DataList控件的属性,【例10.6】,(9)为DataCombo1
28、_Click事件添加代码 Private Sub DataCombo1_Click(Area As Integer)Dim strQuery As String 声明变量,用来保存SQL语句字符串如果没有选择部分信息,则退出If DataCombo1.Text = “ ThenExit SubEnd IfDataCombo1.BoundText是当前选择部门编号,以此编号设置SQL语句,读取此部门中的所有员工信息strQuery = “Select * FROM EmpInfo WHERE Dep_Id = “ _+ DataCombo1.BoundText设置Adodc2的数据源,并刷新显示
29、With Adodc2.RecordSource = strQuery.RefreshEnd With End Sub,【例10.6】,(10)为Form_Load事件添加代码 Private Sub Form_Load()DataCombo1.Text = Adodc1.Recordset.Fields(1)DataCombo1_Click (0) End Sub,10.2.3 DataGrid控件,选择“工程”菜单中的“部件”命令,打开“部件”属性对话框。在控件列表中,查找并选择Microsoft DataGrid Controls 6.0(OLEDB)。如果在列表中没有此选项,请下载并安
30、装Visual Basic 6.0的升级补丁。 单击“确定”按钮,可以看到DataGrid控件的图标出现在“工具箱”中。,常用属性,AllowAddNew,当AllowAddNew等于True时,允许向与DataGrid控件连接的Recordset对象中添加新记录,否则不允许添加新记录。 AllowDelete,当AllowDelete等于True时,允许从与DataGrid控件连接的Recordset对象中删除记录,否则不允许删除记录。 AllowUpdate,当AllowUpdate等于True时,允许修改与DataGrid控件连接的Recordset对象中的记录,否则不允许修改记录。 C
31、olumnHeaders,当ColumnHeaders等于True时,在DataGrid控件中显示列标头,否则不显示列标头。 Columns,返回DataGrid表格中Column对象的集合。可以使用Columns设置表格中列的属性。 DataSource,指定DataGrid控件绑定的数据源。 HeadFont,设置DataGrid控件列标头中使用的字体。 HeadLines,设置显示在DataGrid控件列标头中的文本行数。,常用事件,AfterColEdit,在完成网格单元编辑之后触发该事件。 AfterDelete,当用户在DataGrid控件中删除一条选定的记录后触发该事件。 Aft
32、erInsert,在用户往DataGrid控件中插入一条新记录后触发该事件。 AfterUpdate,修改过的数据已经从DataGrid控件中被写到数据库后触发该事件。 BeforeColEdit,仅在键入字符、进入编辑模式之前触发该事件该事件。 BeforeDelete,在DataGrid控件中选定的记录被删除之前触发该事件。 BeforeInsert,在向一个DataGrid控件中插入一条记录之前触发该事件。 BeforeUpdate,在DataGrid控件中的数据被写到数据库之前触发该事件。 ButtonClick,在单击当前单元的内置按钮时触发该事件。 ColEdit,在键入字符,使单
33、元第一次进入编辑模式时触发该事件。 ColResize,当用户调整DataGrid控件的一个列的大小时触发该事件。 Error,数据访问错误时触发该事件。 HeadClick,在用户单击一个DataGrid控件指定列的标题时触发该事件。 OnAddNew,在用户操作调用AddNew操作时触发该事件。 RowResize,当调整一个DataGrid控件中的行尺寸时触发该事件。 SelChange,当选定不同范围行或列时触发该事件。,【例10.7】,下面是一个DataGrid控件的示例程序。,【例10.7】,(1)创建新工程 创建工程存储的目录。运行Visual Basic 6.0主程序,并选择新
34、建“标准EXE”工程。 (2)将ADO Data控件添加到工程中 (3)将DataGird控件添加到工程中,【例10.7】,(4)设置主窗体属性,【例10.7】,(5)添加ADO Data控件并设置属性,【例10.7】,(6)添加DataGrid控件并设置属性,【例10.7】,(7)添加“退出程序”按钮并编写代码Private Sub Command2_Click()End End Sub,【例10.7】,(8)添加FrmShowData窗体并设置属性,【例10.7】,(9)在FrmShowData窗体中添加控件,【例10.7】,(10)为FrmDataGrid的Command1_Click事
35、件添加代码 Private Sub Command1_Click()判断是否选择了表中的一行If Adodc1.Recordset.EOF = True Or Adodc1.Recordset.BOF = True ThenMsgBox “请选择要显示的行“Exit SubEnd If 读取数据FrmShowData.Text1 = Adodc1.Recordset.Fields(0)If Adodc1.Recordset.Fields(1) “ ThenFrmShowData.Text2 = Adodc1.Recordset.Fields(1)ElseFrmShowData.Text2 =
36、“End If,【例10.7】,If Adodc1.Recordset.Fields(2) “ ThenFrmShowData.Text3 = Adodc1.Recordset.Fields(2)ElseFrmShowData.Text3 = “End IfIf Adodc1.Recordset.Fields(3) “ ThenFrmShowData.Text4 = Adodc1.Recordset.Fields(3)ElseFrmShowData.Text4 = “End If打开显示数据窗口FrmShowData.Show 1 End Sub,10.3 Visual Basic数据库 应用
37、工程管理,1Visual Basic工程管理 2窗体、模块和类模块的功能划分 3Const模块内容演示 4DbFunc模块内容介绍,10.3.1 Visual Basic工程管理,一个Visual Basic工程可以包括以下内容: 管理所有部件的工程文件(.vbp)。 每个窗体的文件(.frm)。 每个窗体的二进制数据文件(.frx),它含有窗体上控件的属性数据。对含有二进制属性(例如图片或图标)的任何 .frm 文件都是不可编辑的,这些文件是自动产生的。 每个类模块的文件(.cls),该文件是可选项。 每个标准模块的文件(.bas),该文件是可选项。 一个或多个包含ActiveX控件的文件(
38、.ocx),该文件是可选项。 单个资源文件(.res),该文件是可选项。,10.3.2 窗体、模块和类模块的 功能划分,窗体是Visual Basic程序中必不可少的资源。它可以实现工程的外观显示,添加程序代码,实现需要的功能。窗体文件通常直接存放在应用程序的目录下。 模块可以用来管理全局常量、全局变量和用户自定义函数等。读者可以根据需要设计自己的模块内容。 本书实例中约定,数据库的每个表都对应一个类模块。类的成员变量对应表中的每个列,类的成员函数则是对表的各种操作。本书约定在应用程序目录下创建Classes目录,用来存放类模块文件。,模块划分的实例,10.3.3 Const模块内容演示,版本
39、号 Public Const VerNum As String = “版本 1.0“ 生成日期 Public Const GenDate As String = “日期 2009-03-08“ 定义数据库连接字符串 Public Const Conn As String = “Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;“ _+ “User ID=sa;Initial Catalog=Hr;Data Source=127.0.0.1“一次执行connect操作可以访问数据库的次数 Public Const CONNECT
40、_LOOP_MAX = 10,10.3.4 DbFunc模块内容介绍,1声明变量 2自定义的数据库函数,1声明变量,= 标记数据库是否连接 = Private IsConnect As Boolean = 标记执行Connect()函数后,访问数据库的次数 = Private Connect_Num As Integer Private cnn As ADODB.Connection 连接数据库的Connection对象 Private rs As ADODB.Recordset 保存结果集的Recordset对象,2自定义的数据库函数,(1)连接数据库函数Connect() (2)断开连接数据库函数Disconnect() (3)执行数据库操作语句的函数SQLExt (4)执行数据库查询语句的函数QueryExt,