1.58k likes | 1.71k Views
补充: 第9章 Visual Basic 数据库编程. 本章要点: • 数据访问对象 • Adodc 控件 • 数据绑定控件 • 记录集对象的属性与方法 • 使用 ADO 对象模型编程. 9.1 数据访问对象. 1. DAO、ADO 和 RDO 在 VB 中,要对数据库进行访问,需要通过数据访问对象进行,数据访问对象包括: (1) DAO: Data Access Object — 数据访问对象 (2) RDO: Remote Data Object — 远程数据对象
E N D
补充:第9章 Visual Basic数据库编程 本章要点: •数据访问对象 • Adodc控件 •数据绑定控件 •记录集对象的属性与方法 •使用ADO对象模型编程
9.1 数据访问对象 • 1. DAO、ADO和RDO • 在VB中,要对数据库进行访问,需要通过数据访问对象进行,数据访问对象包括: • (1) DAO: Data Access Object —数据访问对象 • (2) RDO: Remote Data Object —远程数据对象 • (3) ADO: ActiveX Data Object —ActiveX数据对象 • ADO是DAO/RDO的后继产物,它扩展了DAO和RDO所使用的对象模型,包含较少的对象,更多的属性、事件和方法。 • 通过ADO可以访问各种各样的数据源。
DAO RDO ADO JET引擎 ODBC驱动程序 OLEDB提供者 Provider 数据源(数据库) 2. 访问数据源的途径: DAO使用它自己的内部JET引擎访问数据库。 RDO使用ODBC访问数据库。 ADO使用OLEDB访问数据库。
9.2 使用Adodc控件访问数据库 • 1. 添加Adodc控件 • Adodc用于将数据源引入到当前工程中,并定义数据源的一些属性。 • 使用Adodc控件之前必须先把它添加到当前工程中。添加方法: • 工程→部件→选择“Microsoft ADO Data Control 6.0(OLEDB)”选项,将Adodc控件添加到工具箱中。再画到窗体上。 4个移动记录的按钮: Move First Move Last Move Previous Move Next
2 . 设置属性 • 首先可以在Adodc控件的“属性页”对话框中设置其连接属性,然后在属性窗口直接设置其他属性。 • 打开属性页: • 右击Adodc控件,在快捷菜单中选择“ADODC属性”,或者单击属性窗口的“自定义”右侧的属性按钮“...” 打开。
(1) 属性页对话框——选择使用连接字符串: Connection String
(2) 选择提供者: Microsoft OLE DB Provider for SQL Server
(3) 输入连接信息: Provider=SQLOLEDB.1;Persist Security Info=False; User ID=sa;Initial Catalog=学生信息;Data Source=KY
CommandType RecordSource CommandText (5) 选择记录源
其他主要属性: • (1) Recordset: 由ADODC控件所确定的记录集对象。 • (2) BOFAction: 指示BOF属性为True时进行什么操作。 • 0-Move First: 将第一个记录做为当前记录。 • 1–BOF: 将当前记录位置定位在第一个记录之前。 记录集的BOF值保持True,此刻禁止ADODC控件上的Move Previous按钮。 • (3) EOFAction:指示EOF属性为True时进行什么操作。 • 0–MoveLast: 保持最后一个记录为当前记录。 • 1–EOF: 将当前记录定位在最后一个记录之后。记录集的EOF值保持True,此刻禁止Data控件上的MoveNext按钮。 • 2-AddNew: 移过最后一个记录时自动添加一个新记录。
(4) 连接字符串(ConnectionString) • ADO使用连接字符串属性ConnectionString指明用于连接数据源的OLEDB提供者和完成数据库连接所需要的全部信息。 • 例: 连接到Microsoft Access数据库的连接字符串 • Provider=Microsoft . Jet . OLEDB . 3.51; • Data Source=D:\MyDB\学生.mdb • 例: 连接到SQL Server数据库的连接字符串 • Driver={SQL Server};Server=ky;uid=sa; • pwd=123;Database=学生信息 • 具体格式取决于所使用的提供者。 • 可以自动生成ADO的连接字符串
(5) 命令类型(Command Type) • 指定命令的类型,包括以下选项: • AdCmdText: 将CommandText 作为命令或存储过程文本。 • AdCmdTable: 将CommandText 作为表名称。 • AdCmdStoredProc :将CommandText作为存储过程名。 • AdCmdUnknown: 默认值。命令类型未知。 注意:使用adCmdUnknown会降低系统性能,因为 ADO 必须调用提供者以确定 CommandText 属性是 SQL 语句、存储过程或表名称。
(6) 游标类型(CursorType ) • 游标: 响应一次数据请求后返回程序的记录集合。 • CursorType属性: 指示在 Recordset 对象中使用的游标类型。取值如下: • adOpenForwardOnly —(默认值)打开仅向前类型游标。 • adOpenKeyset键集游标—不能访问其他用户添加、删除的记录,可以看见其他用户修改的数据。 • adOpenDynamic 动态游标—可以看见其他用户所作的添加、修改和删除。 • adOpenStatic 静态游标—可以用来查找数据或生成记录集的静态副本。不能看见其他用户所作的添加、更改或删除。
(7) 游标位置(CursorLocation ) • CursorLocation属性: 设置或返回游标引擎的位置。 • adUseClient —使用由本地游标引擎提供的客户端游标。本地游标引擎通常提供一些功能,而这些功能可能是数据提供者或驱动程序游标不能提供的,使用该设置的好处是可以使这些功能生效。 • adUseServer—默认值。使用数据提供者或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的操作非常敏感。但是,某些功能可能无法由服务器端游标模拟,通过该设置将无法使用这些功能。
(8) 锁定类型(LockType) • 锁定:记录或表的一种状态,这种状态使得除当前正在向该记录或表中输入数据的用户之外,其余用户对该记录或表的访问都是只读的。 • LockType 属性指示编辑过程中对记录使用的锁定类型。取值如下: • adLockReadOnly:默认值。无法更改数据。 • adLockPessimistic:保守式记录锁定。采用编辑时立即锁定数据源的记录的方式。锁定时间长。 • adLockOptimistic:开放式记录锁定。编辑时不锁定,只在调用Update 方法时锁定记录。 (允许两个用户同一时刻编辑同一条记录,会导致在更新时产生锁定错误) • adLockBatchOptimistic: 开放式批锁定。用于与立即更新模式相反的批更新模式(如用grid)。
(9) 模式(Mode) • Mode属性:设置或返回数据的可用权限。取值如下: • adModeUnknown: 默认值。表明权限尚未设置或无法确定。 • adModeRead: 以只读权限打开记录集。 • adModeWrite:以只写权限打开记录集。 • adModeReadWrite: 以读/写权限打开记录集。 • adModeShareDenyRead: 防止其他用户以读权限打开连接。 • adModeShareDenyWrite: 防止其他用户以写权限打开连接。 • adModeShareExclusive: 防止其他用户打开连接。 • adModeShareDenyNone: 防止其他用户使用任何权限打开连接。
3. 方法 • Refresh: 如果数据库属性的设置值发生了改变,可以使用Refresh方法来打开或重新打开数据库。
绑定控件 Adodc 数据库 9.3 数据绑定控件 • 绑定控件: 用于显示由Adodc控件控件所确定的记录集中的数据。 • 绑定控件、 Adodc控件和数据库之间的关系如下: 要使数据绑定控件能够显示数据库记录集中的数据,需要首先设置这些控件的数据来源,常用属性: DataSource属性: 返回或设置一个数据源,通过该数据源,数据绑定控件被绑定到一个数据库。 DataField属性: 返回或设置数据绑定控件将被绑定到的字段名。
数据绑定控件举例: • 1. Text • 需要设置DataSource属性、DataField属性 • 2. DataGrid控件 • 添加: 工程→部件→ • Microsoft DataGrid Control 6.0(OLEDB) • 需要设置DataSource属性 • 3. DataList 和DataCombo控件 • 添加: 工程→部件→ • Microsoft DataList Control 6.0(OLEDB) • 需要设置RowSource属性、ListFields属性 • 当前选中项的内容保存在该控件的Text属性中
9.4 Recordset对象的属性与方法 • Adodc控件的Recordset属性实际上是一个对象,即Recordset对象。因此有其属性和方法。 • 1. 属性 • (1) AbsolutePosition • 指定Recordset对象当前记录的序号位置。 • 例: 将当前记录定位在第15条记录 • Adodc1.Recordset.AbsolutePosition = 15 • (2) Bookmark • 返回唯一标识Recordset对象中当前记录的书签,或者将Recordset对象的当前记录设置为由有效书签所标识的记录。
例: • Dim a • Private Sub Command1_Click() ' 保存书签 • a = Adodc1.Recordset.Bookmark • End Sub • Private Sub Command2_Click() ' 返回书签位置 • Adodc1.Recordset.Bookmark = a • End Sub • (3) BOF、EOF • 当前记录在最后一个记录之后时,EOF值为True • 当前记录在第一个记录之前时,BOF值为True • (4) RecordCount: 指示当前记录的总数 • 例: Print Adodc1.Recordset.RecordCount
(5) Fields: Fields属性是一个集合。集合中包含所有Field(字段)对象。 • 每个Field对象对应于Recordset中的一列。 • 使用Field对象的Value属性可设置或返回当前记录的数据。 • 例: 在窗体上显示当前记录的“姓名”字段的内容: • Print Adodc1.Recordset.Fields("姓名").Value • 例: 将当前记录的“姓名”字段改成“张三”: • Adodc1.Recordset.Fields("姓名").Value = "张三" Value属性是Fields对象的默认属性,可省略。
2. 方法 • (1)MoveFirst;MoveLast;MoveNext;MovePrevious • MoveFirst: 将当前行记录指针移到第一条记录 • MoveLast: 将当前行记录指针移到最后一条记录 • MoveNext: 将当前行记录指针移到前一条记录 • MovePrevious: 将当前行记录指针移到后一条记录 • (2) Move: 将当前记录向前或向后移动指定的条数 • 格式: Move n • n为正数时向后移动,n为负数时向前移动。 • (3) AddNew: 在记录集中添加一条新记录。
例: 给“学生基本信息”表添加一条新记录。 • Adodc1.Recordset.AddNew • Adodc1.Recordset.Fields("学号") = "12345" • Adodc1.Recordset.Fields("姓名") = "刘小波" • Adodc1.Recordset.Fields("班级") = "建98-01" • Adodc1.Recordset.Fields("性别") = "男" • Adodc1.Recordset.Fields("专业编号") = "001" • Adodc1.Recordset.Fields("出生日期") • = #1/23/1980# • Adodc1.Recordset.Update
(4) Update: 保存对Recordset对象的当前记录所做的所有更改。 • 例: Adodc1.Recordset.Update • (5) Delete: 删除当前记录。 • 例: Adodc1.Recordset.Delete • (6) Find • 在指定的记录集中查找与指定条件相符的记录,并使之成为当前记录。 如果没找到,则位置将设置在记录集的末尾或开始(依赖于搜索方向)。 • Find (criteria, SkipRows, searchDirection, start) • criteria: 字符串,包含搜索条件。 • SkipRows:可选,长整型,其默认值为零。指定从当前行或 start书签跳过的位移以开始搜索。 • searchDirection:可选,其值为adSearchForward 或 adSearchBackward。 • start:可选,变体型书签,用作搜索的开始位置。
例: Adodc1.Recordset.Find "出生日期= #1980-12-12#" 例: 查找下一个姓“张”的学生的学号和姓名 Adodc1.Recordset.Find "姓名 like '张*'" Print Adodc1.Recordset.Fields("学号"); _ Adodc1.Recordset.Fields("姓名") 注意语句中的单引号和双引号的用法。 在VB中用*号作为通配符,匹配任意字符串
【例9-1】设“学生管理”数据库中有如图所示的学生基本信息表。用文本框显示“学生基本信息”表中的班级、学号、姓名、性别。使用ADO数据控件上的箭头按钮实现记录的向前、向后移动。【例9-1】设“学生管理”数据库中有如图所示的学生基本信息表。用文本框显示“学生基本信息”表中的班级、学号、姓名、性别。使用ADO数据控件上的箭头按钮实现记录的向前、向后移动。
设计步骤如下: • (1)向窗体上添加4个TextBox控件Text1、Text2、Text3、Text4,将它们的text属性清空,再添加4个标签控件,分别将其caption属性设置为“班级”、“学号”、“姓名”、“性别”。 • (2)选择“工程→部件”菜单命令,打开“部件”对话框,选择“Microsoft ADO Data Control 6.0(OLEDB)”向工具箱中添加一个ADO数据控件,然后将其添加到窗体上。
(3)继续设置各控件的属性。 • Adodc1:ConnectionString: …… • CommandType: 2 - adCmdTable • RecordSource: 学生基本信息 • Align: 2 - vbAlignButtom • Text1: Datasource:Adodc1 • DataField:班级 • Locked:True 运行时不能修改 • Text2: Datasource:Adodc1 • DataField:学号 • Locked:True 运行时不能修改 • Text3: Datasource :Adodc1 • DataField:姓名 • Locked:True 运行时不能修改 • Text4: Datasource :Adodc1 • DataField:性别 • Locked:True 运行时不能修改
Text2 Text1 Text3 Text4 Command1~Command4 Adodc1: Visible:False • 【例9-2】将上例改成用命令按钮实现记录之间的移动,设计界面如下: • “上一个”按钮: 显示上一个记录,当显示完第一个记录后,继续单击“上一个”按钮,则该按钮变为无效,而把焦点定位到“下一个”按钮。 • “下一个”按钮: 显示下一个记录,当显示完最后一个记录后,再单击“下一个”按钮,则该按钮无效,焦点定位到“上一个”按钮。
“上一个”按钮Command1的Click事件过程如下: • Private Sub Command1_Click() • Command2.Enabled = True • If Adodc1.Recordset.BOF Then • Command1.Enabled = False • Command2.SetFocus • Else • Adodc1.Recordset.MovePrevious • End If • End Sub
“下一个”按钮Command2的Click事件过程如下: • Private Sub Command2_Click() • Command1.Enabled = True • If Adodc1.Recordset.EOF Then • Command2.Enabled = False • Command1.SetFocus • Else • Adodc1.Recordset.MoveNext • End If • End Sub • “退出”按钮Command2的Click事件过程如下: • Private Sub Command3_Click() • End • End Sub
【例9-3】设“学生管理”数据库中还包含了如下的“课程”表和“学生选课”表,使用表格控件浏览数据库中的数据。在表格中显示学生所在系、班级、学号、姓名、课程名称、成绩。【例9-3】设“学生管理”数据库中还包含了如下的“课程”表和“学生选课”表,使用表格控件浏览数据库中的数据。在表格中显示学生所在系、班级、学号、姓名、课程名称、成绩。 课 程 学生选课
设计步骤: • (1)因为要显示的信息涉及“学生基本信息”表,“课程”表和“学生选课”表,所以需要使用一个查询语句。设计查询语句如下: • Select 学生基本信息.所在系 AS 系名称, • 学生基本信息.班级,学生基本信息.学号, • 学生基本信息.姓名,课程.课程名称,学生选课.成绩 • From 学生基本信息,课程,学生选课 • Where 学生基本信息.学号=学生选课.学号 • And 学生选课.课程号=课程.课程号 提示:可以先在SQL Server 2000的查询分析器中对该语句的正确性进行验证。
(2)选择“工程→部件”菜单命令,打开“部件”对话框,选择“Microsoft ADO Data Control 6.0(OLEDB)”向工具箱中添加一个ADO数据控件,并将其添加到窗体上,使用其默认名称Adodc1。 • (3)选择“工程→部件”菜单命令,打开“部件”对话框,选择“Microsoft DataGrid Control 6.0(OLEDB)”,向工具箱中添加一个DataGrid控件,并将其添加到窗体上,使用其默认名称DataGrid1。
(4)在ADO数据控件的属性页上设置以下属性:(4)在ADO数据控件的属性页上设置以下属性: • ConnectionString:…… • CommandType:1 – adCmdText • CommandText:设置为步骤1中的查询语句。 • (5)设置DataGrid1控件的以下属性: • DataSource:ADODC1 • 注意: • 可以设置Adodc控件的Visible属性使其运行时不可见。 • 可以设置DataGrid控件的以下属性: • AllowAddNew ; • AllowDelete; • AllowUpdate • 则可以直接进行增、删、改 执行结果:
9.5 使用ADO对象访问数据 • ADO对象模型定义了一个可编程的分层对象集合,可以通过这些对象来实现与数据库的连接并对数据执行各种各样的操作 • 1. 添加ADO对象库引用 • 使用ADO对象之前,首先要向当前工程添加ADO的对象库。 • 添加方法: 工程引用打开“引用”对话框 • 选择“Microsoft ActiveX Data Object 2.0 Library”
Connection对象 Error集合 Error对象 Command对象 Parameter集合 Parameter对象 Recordset对象 Field集合 Field对象 2. ADO对象模型 Connection对象: 用来建立和数据库的连接 Error集合: 包含跟连接有关的所有错误信息 Command对象:用来执行命令,如查询或更新 Parameter: 用来为Command对象指定执行参数 Recordset对象: 用来查看和操作查询结果 Field: 包含Recordset中的每个字段信息
Text1 Text2 9.5.1 Connection对象 • (1) 用ConnectionString属性和Open方法连接数据源 • 【例9-4】使用Connection对象的ConnectionString和Open方法实现与SQL Server服务器KY上的数据库“学生管理”的连接。设计界面如下:
(1) 用ConnectionString属性和Open方法连接数据源 • Private Sub Command1_Click() • ' 创建一个Connection对象Mycon • Dim Mycon As New ADODB.Connection • ' 定义Mycon对象的ConnectionString属性 • Mycon.ConnectionString = "Driver={SQL Server};Server=ky;UID=" & Trim(Text1.Text) & ";pwd=" & Trim(Text2.Text) & ";Database=学生管理" • Mycon.Open ' 按指定的连接打开数据库 • MsgBox "连接成功" • End Sub
(1) 用ConnectionString属性和Open方法连接数据源 • 修改上例,在连接数据库出错时,用消息框显示“连接失败”。 • Private Sub Command1_Click() • On Error GoTo L1 • ' 创建一个Connection对象Mycon • Dim Mycon As New ADODB.Connection • ' 定义Mycon对象的ConnectionString属性 • Mycon.ConnectionString = "Driver={SQL Server};Server=ky;UID=" & Trim(Text1.Text) & ";pwd=" & Trim(Text2.Text) & ";Database=学生管理" • Mycon.Open ‘ 按指定的连接属性打开数据库 • MsgBox "连接成功" • Exit Sub • L1: • MsgBox "连接失败" • End Sub 连接数据库之后,接下来就可以对数据库执行各种操作。
(2) 用动态属性和Open方法连接数据源 • ADO对象有两种类型的属性: • 内置属性;动态属性 • 内置属性是在ADO中实现并立即可用于任何新创建的对象的属性,使用“对象名.属性名”语法直接访问这些内置属性。例如: Mycon.ConnectionString = …… • ADO对象的动态属性由现行的数据提供者定义,并出现在相应的ADO对象的Properties集合中。Properties集合包含了特定对象实例的所有Property对象。访问对象的动态属性格式为: • 对象名.Properties(索引) • 或 • 对象名.Properties("属性名")
Text1 Text2 Text3 Text4 Command1 • 【例9-5】用以下界面指定所要连接的SQL Server服务器名称、数据库名称、连接所需的用户名和密码,单击“连接”按钮实现与指定的SQL Server数据库的连接。 Private Sub Command1_Click() Dim Mycon As New ADODB.Connection Dim ServerName As String, DatabaseName As String Dim UserName As String, Password As String
Windows认证方式 SQL Server认证方式 • '取出界面信息 • ServerName = Trim(Text1.Text) • DatabaseName = Trim(Text2.Text) • UserName = Trim(Text3.Text) • Password = Trim(Text4.Text) • '定义连接属性 • Mycon.Provider = "SQLOLEDB" • Mycon.Properties("Data Source").Value = ServerName • Mycon.Properties("Initial Catalog").Value = _ • DatabaseName • '选择认证模式 • 'Mycon.Properties("integrated security").Value = "SSPI" • Mycon.Properties("User ID").Value = UserName • Mycon.Properties("Password").Value = Password • '打开连接 • Mycon.Open • End Sub
(3) Connection对象的Execute方法 • 使用Execute方法可以执行指定的SQL 语句、存储过程等内容。 • 语法1: 用于不返回行的命令字符串: • 对象名.Execute CommandText, RecordsAffected, Options • 语法2: 用于返回行的命令字符串: • Set recordset =对象名.Execute • (CommandText, RecordsAffected, Options) • 参数说明 • CommandText: 字符串,包含要执行的 SQL 语句、表名、存储过程调用等。 • RecordsAffected: 可选,长整型变量,提供者向其返回操作所影响的记录数目。
Options: 可选,长整型值,指示提供者应如何识别 CommandText ,可为下列值之一: • adCmdText — 将CommandText 作为命令或存储过程文本。 • adCmdTable — 将CommandText 作为SQL查询产生的表名。 • adCmdTableDirect — 将CommandText作为表名。 • AdCmdStoredProc — 将CommandText作为存储过程名。 • AdCmdUnknown — 默认值。命令类型未知。 返回的 Recordset 对象始终为只读、仅向前的游标。
【例9-6】使用Connection对象的Execute方法实现向“学生管理”数据库的“学生基本信息”表中添加一条新记录。 【例9-6】使用Connection对象的Execute方法实现向“学生管理”数据库的“学生基本信息”表中添加一条新记录。 • 设运行时分别通过窗体上的文本框Text1、Text2、Text3、Text4和Text5输入学号、姓名、性别、班级和所在系,通过单击“添加”按钮将当前在界面上指定的学生信息作为一条记录插入到“学生基本信息表”中。运行界面如图:
“添加”按钮的Click事件过程如下: • Private Sub Command1_Click() • Dim Mycon As New ADODB.Connection • Mycon.ConnectionString="Driver={SQL Server};Server=ky;UID=sa;pwd=sa;Database=学生管理" • Mycon.Open • Dim strInsert As String • ' 定义命令字符串strInsert • strInsert = "INSERT INTO 学生基本信息 VALUES ('" & Text1.Text & "','" & Text2.Text & "','" & Text3.Text & "','" & Text4.Text & "','" & Text5.Text & "')" • Mycon.BeginTrans ' 开始事务 • ' 按strInsert字符串指定的插入语句执行插入操作 • Mycon.Execute strInsert • Mycon.CommitTrans ' 提交事务 • End Sub
(4)BeginTrans、CommitTrans和RollbackTrans方法 • BeginTrans方法:启动新的事务; • CommitTrans方法:保存所有更改并结束当前事务; • RollbackTrans方法:取消当前事务中所做的任何更改并结束事务。 • 语法如下: • 对象名.BeginTrans 如: Mycon. BeginTrans • 对象名.CommitTrans 如: Mycon. CommitTrans • 对象名.RollbackTrans 如: Mycon. RollbackTrans