数据库访问控件ADO
9.1 ADO控件
Visual Basic中可用的数据访问接口有三种:ActiveX数据对象(ActiveX Data Objects,ADO)、远程数据对象(RDO)和数据访问对象(DAO)。这三种接口的每一种都分别代表了数据访问技术的不同发展阶段。最新的是ADO,它是比RDO和DAO更加简单,然而更加灵活的对象模型。目前,通常使用ADO作为数据访问接口。
图9-1 ADO数据存取控件
ActiveX 数据对象拥有与其对应的可视化控件ADO Data控件(ADODC)。可视化的ADODC具有“向前”和“向后”等按钮,因此易于使用。ADO数据控件并非VB的标准控件,使用之前先要将ADODC加入工具箱
图9-2 添加新部件
右键单击工具箱空白处,选择“部件(O)…”命令。系统弹出“部件”窗口,从“控件”选项卡中找到“Microsoft ADO Data Control 6.0 (OLEDB)”,选中并单击“确定”按钮。于是,工具箱中将出现ADO控件图标
。
第 1 页
图9-3 添加ADO控件
9.2 使用ADO控件创建一个简单的前端数据库应用程序
实例CH9-1 浏览联系人
使用ADODC创建浏览联系人的界面,后台数据库使用ACCESS 2003“联系人示例数据库”Contact.mdb。
第1步: 窗体上放置一个 ADO Data 控件,命名为ADODC1。 第2步: 在设计界面选定ADODC1,然后按F4键显示“属性”窗口。 第3步: 在“属性”窗口中,单击“ConnectionString”显示属性设置对话框。
第 2 页
选中“使用连接字符串”,单击按钮,
选择“Microsoft Jet 4.0 OLE DB Provider”,单击
,在“连接”选项
卡中选择数据库文件名。如果数据库文件与当前的应用程序在同一个路径下,则可以省略路径名。
第 3 页
单击,如果数据库文件路径和格式正确,系统提示“测试连接成功。”
第4步: 在“属性”窗口中,将“CommandType”(命令类型)属性设置为“2 - AdCmdTable” 第5步: 在“属性”窗口中,打开“RecordSource”(记录源)属性设置对话框,“表或存
储过程名称”选择“联系人”表
第6步: 在窗体上放置三个“文本框”控件,用来显示数据库信息。在“属性”窗口中,
将三个文本框的“数据源”属性设为 ADO Data 控件的名称 (ADODC1)。这样就可将这个文本框和ADO Data控件绑定在一起。三个文本框控件的“DataField”(数据字段)属性分别设置为“姓氏”、“名字”和“办公电话”。由于三个文本框分别与数据库中的字段绑定在一起,为了防止用户意外修改记录,通常将文本框的Locked属性设为True。
第7步: 运行该应用程序。用户可以在 ADO Data 控件使用四个箭头按钮浏览所有记录。
需要说明的是,“RecordSource”(记录源)属性也可以使用“命令文本”,即SQL语句。为此,只要将以上“第4步”和“第5步”应换成如下过程即可。 第4步: 第5步:
在“属性”窗口中,将“CommandType”(命令类型)属性设置为“2 - AdCmdText”。 在“属性”窗口中,打开“RecordSource”(记录源)属性设置对话框,“命令
第 4 页
文本(SQL)”中填入如下SQL语句“select * from联系人”
9.3 操作数据表中的记录
实例CH9-2 添加系统用户
使用ADODC控件向数据库文件mydb.mdb中的sysuser表添加新记录。 第1步:
界面设计如下,
第2步: 第3步:
ADODC控件命名为ADODC1,参照实例CH9-1中的第3步至第5步连接到数四个文本框的Locked属性设置为True,然后绑定数据源,即DataSource属性
据库mydb.mdb并以sysuser表作为数据源(使用SQL语句或表均可)。
设为ADODC1,DataField属性分别设为字段名sysuser的secondname、firstname、pid和power。 第4步:
“添加新用户”按钮代码如下,
第 5 页
Private Sub cmdAddUser_Click() Dim s As String Dim fOK As Boolean fOK = True '标记操作过程是否有错误发生 Adodc1.Recordset.AddNew s = InputBox(\"请输入姓氏\") Adodc1.Recordset.Fields(\"secondname\") = s s = InputBox(\"请输入名字\") Adodc1.Recordset.Fields(\"firstname\") = s s = InputBox(\"请输入用户名\") Adodc1.Recordset.Fields(\"pid\") = s s = InputBox(\"请输入用户的权限\" + vbLf + \"1 - 超级用户  2 - 普通用户 3 - 来宾用户\") If Val(s) = 1 Then     Adodc1.Recordset.Fields(\"power\") = \"超级用户 \" ElseIf Val(s) = 2 Then     Adodc1.Recordset.Fields(\"power\") = \"普通用户 \" ElseIf Val(s) = 3 Then     Adodc1.Recordset.Fields(\"power\") = \"来宾用户 \" Else     MsgBox \"无效的用户权限,操作将被取消\"     Adodc1.Recordset.Cancel '撤销新增记录     fOK = False End If  If bOK Then     Adodc1.Recordset.Update '更新记录 End If  End Sub
实例CH9-3 删除系统用户
使用ADODC控件删除数据库文件mydb.mdb的sysuser表中已经存在的用户。 第1步:
在实例CH9-2的基础上添加一个“删除老用户”按钮,界面设计如下,
第 6 页
第2步: “删除老用户”按钮的代码如下,
Private Sub cmdDelUser_Click() Adodc1.Recordset.Delete  '删除当前记录 Adodc1.Recordset.Requery '刷新数据 End Sub
实例CH9-4 设置用户密码
使用ADODC控件修改数据库文件mydb.mdb的sysuser表中用户的信息。 第1步:
在实例CH9-3的基础上添加一个“设置密码”的按钮,界面设计如下,
第2步:
“设置密码”按钮的代码如下,
Private Sub cmdSetPwd_Click() Dim s As String s = InputBox(\"请输入新密码\") If s = InputBox(\"请再输入一次新密码\") Then     Adodc1.Recordset.Fields(\"pwd\") = s     MsgBox \"密码修改成功\" Else    MsgBox \"两次输入的密码不一致\" End If End Sub
7.4 执行查询
实例CH9-5 查询联系人
使用ADODC查询联系人,数据库使用ACCESS 2003“联系人示例数据库”Contact.mdb。 第1步:
在实例CH9-1中新增“按姓氏查询”和“按名字查询”两个按钮,分别命名为
第 7 页
cmdFindSecondName和cmdFindFirstName界面设计如下,
第2步:
这两个按钮的单击事件填写如下代码,
Private Sub cmdFindSecondName_Click() Dim s As String s = Trim(InputBox(\"请输入联系人的姓氏\")) If Len(s) > 0 Then     Adodc1.Recordset.Find \"姓氏='\" + s + \"'\"   '按姓氏精确查询 End If End Sub Private Sub cmdFindFirstName_Click() Dim s As String s = Trim(InputBox(\"请输入联系人的名字\")) If Len(s) > 0 Then     Adodc1.Recordset.Find \"名字 like *\" + s + \"*\"    '按名字模糊查询 End If End Sub
9.5 综合实例
实例CH9-6 查询客户订单
数据库使用ACCESS2003的示例数据库“罗斯文数据库(Northwind.mdb)”,界面设计如下,
第 8 页
该数据库结构如下图所示:
核心代码如下:
Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Adodc1.Caption = \"第\" & Adodc1.Recordset.AbsolutePosition & _     \"条记录  共\" & Adodc1.Recordset.RecordCount & \"条记录\" End Sub
Private Sub Combo1_Click()
Adodc1.RecordSource = \"SELECT 产品.产品名称, 订单明细.单价, 订单明细.数量, 订单明细.折扣, \" + _     \" [订单明细]![单价]*[订单明细]![数量]*(1-[订单明细]![折扣]) AS 金额, 客户.公司名称\" + _     \" FROM 客户 INNER JOIN (订单 INNER JOIN\" + _
\" (产品 INNER JOIN 订单明细 ON 产品.产品ID = 订单明细.产品ID)\" + _     \" ON 订单.订单ID = 订单明细.订单ID) ON 客户.客户ID = 订单.客户ID\" + _     \" WHERE 客户.公司名称 = '\" + Combo1.Text + \"'\" Adodc1.Recordset.Requery Adodc1.Refresh End Sub
Private Sub Form_Load()
Adodc1.RecordSource = \"select * from 客户\" Adodc1.Recordset.Requery Adodc1.Refresh Combo1.Clear
Adodc1.Recordset.MoveFirst
Do While Not Adodc1.Recordset.EOF
第 9 页
Combo1.AddItem Adodc1.Recordset.Fields(\"公司名称\")     Adodc1.Recordset.MoveNext Loop
Combo1.ListIndex = 0
Adodc1.RecordSource = \"SELECT 产品.产品名称, 订单明细.单价, 订单明细.数量, 订单明细.折扣, \" + _     \" [订单明细]![单价]*[订单明细]![数量]*(1-[订单明细]![折扣]) AS 金额, 客户.公司名称\" + _     \" FROM 客户 INNER JOIN (订单 INNER JOIN\" + _
\" (产品 INNER JOIN 订单明细 ON 产品.产品ID = 订单明细.产品ID)\" + _     \" ON 订单.订单ID = 订单明细.订单ID) ON 客户.客户ID = 订单.客户ID\" + _     \" WHERE 客户.公司名称 = '\" + Combo1.Text + \"'\" Adodc1.Recordset.Requery Adodc1.Refresh End Sub
第 10 页