Version 3.0
在 VB 中访问数据库:数据库查询和数据库显示第 十二章
2
回顾
在 Windows中建立 ODBC数据源
ADO及使用
ADO连接对象
– 属性
– 方法
– 事件
3
目标
理解和使用 RecordSet 对象的属性和方法
使用 ADO RecordSet 对象进行数据查询
使用 RecordSet 对象对数据库进行操作
使用 MSFlexGrid控件显示查询结果数据
4
复习,ADO和连接对象
Connection对象的用途是什么?
如何使用 ADO Connection与 ACCESS和
SQL Server进行数据库连接?
5
RecordSet 对象
RecordSet对象允许进行以下操作
– 指定可以对那些行进行操作
– 定位行
– 指定可能要进行定位的行序
– 添加、删除和更改行
声明和定义 RecordSet对象
Dim rs As ADODB.Recordset
6
使用 Record对象的 Open方法参数描述:
Source——表名或 SQL 语句
ActiveConnection——连接对象
CursorType——游标类型
LockType——记录的锁定类型
Options——指示提供者如何计算 Source 参数
Recordset.Open[Source],[ActiveConnection],[Cursor
Type],[LockType],[Options]
7
Fields和 Field对象
Field表示“域”,也就是记录集的列信息
Fields是一个集合对象,表示当前记录集的域或者字段集合
Field对象表示当前记录集中的单个域
一个或多个 Field组成 Fields。
8
Fields集合的属性和方法属性名称 属性说明
Count 表示集合中元素的个数,也就是当前记录集有多少列,
例如:
R = rctClient.Fields.Count
R将是记录集 rctClient的列数
Item 有一个索引参数的属性,返回一个 Field,例如:
N = rctClient.Fields.Item(1).Name
N将得到记录集 rctClient第二列的名称,注意第一列下标为零方法名称 方法说明
Delete 删除一列,例如:
rctClient.Fields.Delete(1)
将删除记录集 rctClient的所有第二列的数据。
Refresh 更新列信息
9
Field的属性属性名称 属性说明
Name 得到记录特定列的名称,例如:
N = rctClient.Fields.Item(0).Name
rctClient.Fields.Item(1)是一个 Field对象,N将得到记录集
rctClient第一列的名称。
Value 当前行、当前列数据的值,例如,当记录集定位在某一行时:
V = rctClient.Fields.Item(“ABC”).Value
V将得到该行 ABC列的值。
10
RecordSet对象的属性属性名称 属性说明
BOF,EOF 分别标识记录集当前的位置是否在第一个记录之前或者在最后一个记录最后,在跟踪记录集的行信息时特别有用。
Filter 指定一个筛选条件,以屏蔽某些记录,筛选后将定位到筛选的行,筛选条件可以是查询语句 WHERE关键词后的子句,例如:
rctClient.Filter =“strName =?123?”
将快速定位到 Name列行值为 123的行。
MaxRecords 指定和限制通过查询返回 Recordset的记录的最大数目。
RecordCount 返 Recordset对象中记录的数目。注意,该属性在某些时候不能返回记录集的精确的行数。
11
RecordSet 对象 的方法方法名称 方法说明
MoveFirst
MoveLast
MoveNext
MovePrevious
在记录集上移动记录集指针,以定位到不同的数据行,
MoveFirst表示移动到第一行,MoveLast移动到最后一行,
MoveNext移动到当前行的下一行,MovePrevious移动到当前行的前一行。
记录集的初始位置在第一行。
AddNew 为记录集增加一行数据,注意,打开的记录集必须是可更新
Update 在更改记录集某行信息之后,保存对 Recordset对象的当前记录所做的所有更改。
CancelUpdate 取消在调用 Update方法前对当前记录或新记录所做的任何更改。
Delete 删除当前记录行
Save 以文件名为参数,把当前的记录集保存为文件,例如:
rctClient.Save,C:\ABC.TXT”
把当前记录集中的所有数据保存为物理文件,C:\ABC.TXT”。
UpdateBatch 将正在更新的一批记录更新到数据库。
Open 打开记录集,获取数据,前面已经介绍。
12
记录集操作 -定位记录集的行
rst.MovePrevious
If rst.BOF=True Then
MsgBox "已经是记录集的开头 "
rst.MoveFirst
End If
rst.MoveNext
If rst.EOF=True Then
MsgBox "已经是记录集的结尾 "
rst.MoveLast
End If
定位记录集的行
13
记录集操作 -添加记录
rstemp.AddNew
rstemp.Fields(“Customer_ID”) = txtCust_ID.Text
rstemp.Fields(“ContactName”) = txtCont_Name.Text
rstemp.Update
添加记录
14
记录集操作 -更新记录
Rspub.MoveFirst
Rspub.Fields(“ContactName”) = txtCont_Name.Text
Rspub.Fields(“City”) = txtCity.Text
rspub.Update
更新记录
15
记录集操作 -删除记录
If MsgBox("要删除此记录吗?",vbYesNo) = vbYes Then
rsemp.Delete
rsemp.MoveFirst
End if
删除记录
16
记录集操作 -查找记录
rscust.Find "Age> 40",0,adSearchForward,
adBookmarkCurrent
查找记录 -注意,Find 方法仅能用于可滚动的记录集。
17
示例讲解:概述示例概述
A,雇员管理系统的供应商列表
B,使用 NorthWind示范数据库
C,表 Suppliers 的结构
(参看学生用书 表 12.10)
18
示例讲解,实现过程说明实现过程说明
A,数据查询有条件模糊查询
B,使用 MSFlexGrid 控件显示多行数据
C,分窗口实现数据的增删改操作
19
示例讲解:界面设计
请演示制作好的界面设计
– 查询窗体界面
– 查询结果窗体界面
– 增加供应商窗体界面
– 修改供应商窗体界面
20
示例讲解,数据查询函数
Public Function QueryData(ByVal strSQL As String)
As Boolean
On Error Resume Next
Set g_TblRct = New ADODB.Recordset
Call g_TblRct.Open(strSQL,g_DBCon,
adOpenDynamic,adLockOptimistic,-1)
If Err.Number > 0 Then
Err.Clear
QueryData = False
Else
QueryData = True
End If
End Function
21
示例讲解,组合查询条件
Dim strQuerySql As String
strQuerySql = Empty
If Trim(txtName.Text) <> Empty Then
'模糊查询,使用 LIKE子句
strQuerySql = "(CompanyName LIKE '%" &
Trim(txtName.Text) & "%')"
End If
If Trim(txtAddress.Text) <> Empty Then
If strQuerySql <> Empty Then
'多条件情况下,使用 AND进行条件连接
strQuerySql = strQuerySql & " AND (Address
LIKE '%" & Trim(txtAddress.Text) & "%')"
Else
strQuerySql = "(Address LIKE '%" &
Trim(txtAddress.Text) & "%')"
End If
End If
22
示例讲解,用 MSFlexGrid显示
On Error Resume Next
g_TblRct.MoveFirst
If Err.Number > 0 Then Exit Sub
Do While Not g_TblRct.EOF
grdTBL.AddItem (Empty)
grdTBL.Row = grdTBL.Rows - 1
grdTBL.Col = 0
grdTBL.Text =
CStr(g_TblRct.Fields("SupplierID").Value)
grdTBL.CellAlignment =
flexAlignCenterCenter
grdTBL.RowData(grdTBL.Row) =
g_TblRct.Fields("SupplierID").Value
g_TblRct.MoveNext
Loop
23
示例讲解,添加数据
g_TblRct.AddNew
g_TblRct.Fields("CompanyName").Value =
txtName.Text
g_TblRct.Fields("ContactName").Value =
txtContactName.Text
g_TblRct.Fields("ContactTitle").Value =
txtContactTitle.Text
。。。
g_TblRct.Update
24
示例讲解,修改数据
g_TblRct.Fields("CompanyName").Value = txtName.Text
g_TblRct.Fields("ContactName").Value =
txtContactName.Text
g_TblRct.Fields("ContactTitle").Value =
txtContactTitle.Text
g_TblRct.Fields("Address").Value = txtAddress.Text
g_TblRct.Fields("City").Value = "BeiJing"
g_TblRct.Fields("Region").Value = "HaiDian"
g_TblRct.Fields("PostalCode").Value =
txtPostCode.Text
g_TblRct.Fields("Country").Value = "China"
g_TblRct.Fields("Phone").Value = txtPhone.Text
g_TblRct.Fields("Fax").Value = txtPhone.Text
g_TblRct.Update
25
示例讲解,删除数据
g_TblRct.MoveFirst
g_TblRct.Filter = "SupplierID = " &
CStr(lngSelectID)
g_TblRct.Delete
If g_TblRct.EOF Then
g_TblRct.MoveFirst
Else
g_TblRct.MoveNext
End If
Call g_TblRct.UpdateBatch(adAffectAllChapters)
26
总结 2-1
使用 ADO的 RecordSet对象
– RecordSet对象及作用
– 在程序中定义和声明 RecordSet对象
– 使用 RecordSet获取查询结果集
– Open方法及参数说明
RecordSet及相关对象的属性和方法
– Fields和 Field对象及使用
– Fields对象的主要属性和方法
– RecordSet对象的主要属性和方法
27
总结 2-2
使用 RecordSet的属性和方法操作数据
– 定位记录的行
– 添加,修改,删除,查找记录
使用 RecordSet的示例
– 界面设计
– 连接到数据库
– 使用 RecordSet进行数据查询
– 使用 MsFlexGrid显示数据
– 添加、修改和删除数据
在 VB 中访问数据库:数据库查询和数据库显示第 十二章
2
回顾
在 Windows中建立 ODBC数据源
ADO及使用
ADO连接对象
– 属性
– 方法
– 事件
3
目标
理解和使用 RecordSet 对象的属性和方法
使用 ADO RecordSet 对象进行数据查询
使用 RecordSet 对象对数据库进行操作
使用 MSFlexGrid控件显示查询结果数据
4
复习,ADO和连接对象
Connection对象的用途是什么?
如何使用 ADO Connection与 ACCESS和
SQL Server进行数据库连接?
5
RecordSet 对象
RecordSet对象允许进行以下操作
– 指定可以对那些行进行操作
– 定位行
– 指定可能要进行定位的行序
– 添加、删除和更改行
声明和定义 RecordSet对象
Dim rs As ADODB.Recordset
6
使用 Record对象的 Open方法参数描述:
Source——表名或 SQL 语句
ActiveConnection——连接对象
CursorType——游标类型
LockType——记录的锁定类型
Options——指示提供者如何计算 Source 参数
Recordset.Open[Source],[ActiveConnection],[Cursor
Type],[LockType],[Options]
7
Fields和 Field对象
Field表示“域”,也就是记录集的列信息
Fields是一个集合对象,表示当前记录集的域或者字段集合
Field对象表示当前记录集中的单个域
一个或多个 Field组成 Fields。
8
Fields集合的属性和方法属性名称 属性说明
Count 表示集合中元素的个数,也就是当前记录集有多少列,
例如:
R = rctClient.Fields.Count
R将是记录集 rctClient的列数
Item 有一个索引参数的属性,返回一个 Field,例如:
N = rctClient.Fields.Item(1).Name
N将得到记录集 rctClient第二列的名称,注意第一列下标为零方法名称 方法说明
Delete 删除一列,例如:
rctClient.Fields.Delete(1)
将删除记录集 rctClient的所有第二列的数据。
Refresh 更新列信息
9
Field的属性属性名称 属性说明
Name 得到记录特定列的名称,例如:
N = rctClient.Fields.Item(0).Name
rctClient.Fields.Item(1)是一个 Field对象,N将得到记录集
rctClient第一列的名称。
Value 当前行、当前列数据的值,例如,当记录集定位在某一行时:
V = rctClient.Fields.Item(“ABC”).Value
V将得到该行 ABC列的值。
10
RecordSet对象的属性属性名称 属性说明
BOF,EOF 分别标识记录集当前的位置是否在第一个记录之前或者在最后一个记录最后,在跟踪记录集的行信息时特别有用。
Filter 指定一个筛选条件,以屏蔽某些记录,筛选后将定位到筛选的行,筛选条件可以是查询语句 WHERE关键词后的子句,例如:
rctClient.Filter =“strName =?123?”
将快速定位到 Name列行值为 123的行。
MaxRecords 指定和限制通过查询返回 Recordset的记录的最大数目。
RecordCount 返 Recordset对象中记录的数目。注意,该属性在某些时候不能返回记录集的精确的行数。
11
RecordSet 对象 的方法方法名称 方法说明
MoveFirst
MoveLast
MoveNext
MovePrevious
在记录集上移动记录集指针,以定位到不同的数据行,
MoveFirst表示移动到第一行,MoveLast移动到最后一行,
MoveNext移动到当前行的下一行,MovePrevious移动到当前行的前一行。
记录集的初始位置在第一行。
AddNew 为记录集增加一行数据,注意,打开的记录集必须是可更新
Update 在更改记录集某行信息之后,保存对 Recordset对象的当前记录所做的所有更改。
CancelUpdate 取消在调用 Update方法前对当前记录或新记录所做的任何更改。
Delete 删除当前记录行
Save 以文件名为参数,把当前的记录集保存为文件,例如:
rctClient.Save,C:\ABC.TXT”
把当前记录集中的所有数据保存为物理文件,C:\ABC.TXT”。
UpdateBatch 将正在更新的一批记录更新到数据库。
Open 打开记录集,获取数据,前面已经介绍。
12
记录集操作 -定位记录集的行
rst.MovePrevious
If rst.BOF=True Then
MsgBox "已经是记录集的开头 "
rst.MoveFirst
End If
rst.MoveNext
If rst.EOF=True Then
MsgBox "已经是记录集的结尾 "
rst.MoveLast
End If
定位记录集的行
13
记录集操作 -添加记录
rstemp.AddNew
rstemp.Fields(“Customer_ID”) = txtCust_ID.Text
rstemp.Fields(“ContactName”) = txtCont_Name.Text
rstemp.Update
添加记录
14
记录集操作 -更新记录
Rspub.MoveFirst
Rspub.Fields(“ContactName”) = txtCont_Name.Text
Rspub.Fields(“City”) = txtCity.Text
rspub.Update
更新记录
15
记录集操作 -删除记录
If MsgBox("要删除此记录吗?",vbYesNo) = vbYes Then
rsemp.Delete
rsemp.MoveFirst
End if
删除记录
16
记录集操作 -查找记录
rscust.Find "Age> 40",0,adSearchForward,
adBookmarkCurrent
查找记录 -注意,Find 方法仅能用于可滚动的记录集。
17
示例讲解:概述示例概述
A,雇员管理系统的供应商列表
B,使用 NorthWind示范数据库
C,表 Suppliers 的结构
(参看学生用书 表 12.10)
18
示例讲解,实现过程说明实现过程说明
A,数据查询有条件模糊查询
B,使用 MSFlexGrid 控件显示多行数据
C,分窗口实现数据的增删改操作
19
示例讲解:界面设计
请演示制作好的界面设计
– 查询窗体界面
– 查询结果窗体界面
– 增加供应商窗体界面
– 修改供应商窗体界面
20
示例讲解,数据查询函数
Public Function QueryData(ByVal strSQL As String)
As Boolean
On Error Resume Next
Set g_TblRct = New ADODB.Recordset
Call g_TblRct.Open(strSQL,g_DBCon,
adOpenDynamic,adLockOptimistic,-1)
If Err.Number > 0 Then
Err.Clear
QueryData = False
Else
QueryData = True
End If
End Function
21
示例讲解,组合查询条件
Dim strQuerySql As String
strQuerySql = Empty
If Trim(txtName.Text) <> Empty Then
'模糊查询,使用 LIKE子句
strQuerySql = "(CompanyName LIKE '%" &
Trim(txtName.Text) & "%')"
End If
If Trim(txtAddress.Text) <> Empty Then
If strQuerySql <> Empty Then
'多条件情况下,使用 AND进行条件连接
strQuerySql = strQuerySql & " AND (Address
LIKE '%" & Trim(txtAddress.Text) & "%')"
Else
strQuerySql = "(Address LIKE '%" &
Trim(txtAddress.Text) & "%')"
End If
End If
22
示例讲解,用 MSFlexGrid显示
On Error Resume Next
g_TblRct.MoveFirst
If Err.Number > 0 Then Exit Sub
Do While Not g_TblRct.EOF
grdTBL.AddItem (Empty)
grdTBL.Row = grdTBL.Rows - 1
grdTBL.Col = 0
grdTBL.Text =
CStr(g_TblRct.Fields("SupplierID").Value)
grdTBL.CellAlignment =
flexAlignCenterCenter
grdTBL.RowData(grdTBL.Row) =
g_TblRct.Fields("SupplierID").Value
g_TblRct.MoveNext
Loop
23
示例讲解,添加数据
g_TblRct.AddNew
g_TblRct.Fields("CompanyName").Value =
txtName.Text
g_TblRct.Fields("ContactName").Value =
txtContactName.Text
g_TblRct.Fields("ContactTitle").Value =
txtContactTitle.Text
。。。
g_TblRct.Update
24
示例讲解,修改数据
g_TblRct.Fields("CompanyName").Value = txtName.Text
g_TblRct.Fields("ContactName").Value =
txtContactName.Text
g_TblRct.Fields("ContactTitle").Value =
txtContactTitle.Text
g_TblRct.Fields("Address").Value = txtAddress.Text
g_TblRct.Fields("City").Value = "BeiJing"
g_TblRct.Fields("Region").Value = "HaiDian"
g_TblRct.Fields("PostalCode").Value =
txtPostCode.Text
g_TblRct.Fields("Country").Value = "China"
g_TblRct.Fields("Phone").Value = txtPhone.Text
g_TblRct.Fields("Fax").Value = txtPhone.Text
g_TblRct.Update
25
示例讲解,删除数据
g_TblRct.MoveFirst
g_TblRct.Filter = "SupplierID = " &
CStr(lngSelectID)
g_TblRct.Delete
If g_TblRct.EOF Then
g_TblRct.MoveFirst
Else
g_TblRct.MoveNext
End If
Call g_TblRct.UpdateBatch(adAffectAllChapters)
26
总结 2-1
使用 ADO的 RecordSet对象
– RecordSet对象及作用
– 在程序中定义和声明 RecordSet对象
– 使用 RecordSet获取查询结果集
– Open方法及参数说明
RecordSet及相关对象的属性和方法
– Fields和 Field对象及使用
– Fields对象的主要属性和方法
– RecordSet对象的主要属性和方法
27
总结 2-2
使用 RecordSet的属性和方法操作数据
– 定位记录的行
– 添加,修改,删除,查找记录
使用 RecordSet的示例
– 界面设计
– 连接到数据库
– 使用 RecordSet进行数据查询
– 使用 MsFlexGrid显示数据
– 添加、修改和删除数据