
例6.4以显示和管理(这里主要指增,酬,改)指定数据库中“用户”表为例,练习利 用Connection-DataAdapter--Daftaset--Command Builder访问数据源,通过本实例达到以下目 标: (1)复习利用Connection-DataAdapter--Dataset访何数据的几条关健语句。 (2)了解DadaTable的常用属性和方法的使用. (3)了解CommandBuild灯的创建与f作用。 (4)数据虏定控件DataGrid的DataSource属性, (S)CurrencyManager对象的Position属性, 运行参考界面如图629所示, 两星承、管理(增、、改)数据 日▣☒ 用户名: Kitty 用户密明: 动 用P信息 用P名 可 Aay 1234 Kitty 123 条大中 12345 Bab 123345 更新 图629是示、管理数据的运行参考界面 要求如下: (1)加找配套素材文件夹Cper6下的窗体文件Ep4.b和模块文件Mdul.Vb,并 将E即4设为项目的启动窗体。 (2)利用Connection-DataAdapter--Datasct编写代码实现:当窗体如载时在数据绑定控 作中显示“用户”表的信息, (3)当单击入按细时,极据相应文本柜中输入的“用户名”和“用户密码,往数 据库名为“用户”的表中插入一条用户记录。 (4)当单击稀按细时,除“用户”表中的当前用户记录。 (5)当单击更新按铝时,根据相应文本框中输入的“用户名”和“用户密码”,更新 “用户”的表的当前用户记录: 解题步露: (1)如载指定煮材,将Ex4设为白动窗体,并注意模块文作中的数据连接字符串和 所定义的相关变量, (2)编写代码实现窗体加载时的数据显示:基本思想是从数据激获取要显示的数据, 然后利用数据绑定控件的DataSource设置要显示的数据,这里是DataTable对象,给d由 威值可以使用以下语句之一: d=dsTa”userInfo')"在表集合中按表名米检素 dr ds Tables(0) 在表集合中按表素引米检索 实现最示数据的参考代码如图630所示
例 6.4 以显示和管理(这里主要指增、删、改)指定数据库中“用户”表为例,练习利 用 Connection-DataAdapter–Dataset-CommandBuilder 访问数据源,通过本实例达到以下目 标: (1)复习利用 Connection-DataAdapter–Dataset 访问数据的几条关键语句。 (2)了解 DadaTable 的常用属性和方法的使用。 (3)了解 CommandBuilder 的创建与作用。 (4)数据绑定控件 DataGrid 的 DataSource 属性。 (5)CurrencyManager 对象的 Position 属性。 运行参考界面如图 6.29 所示。 图 6.29 显示、管理数据的运行参考界面 要求如下: (1)加载配套素材文件夹 Chapter6 下的窗体文件 Exp4.vb 和模块文件 Modul1.Vb,并 将 Exp4 设为项目的启动窗体。 (2)利用 Connection-DataAdapter–Dataset 编写代码实现:当窗体加载时在数据绑定控 件中显示“用户”表的信息。 (3)当单击 按钮时,根据相应文本框中输入的“用户名”和“用户密码”,往数 据库名为“用户”的表中插入一条用户记录。 (4)当单击 按钮时,删除“用户”表中的当前用户记录。 (5)当单击 按钮时,根据相应文本框中输入的“用户名”和“用户密码”,更新 “用户”的表的当前用户记录。 解题步骤: (1)加载指定素材,将 Exp4 设为启动窗体,并注意模块文件中的数据连接字符串和 所定义的相关变量。 (2)编写代码实现窗体加载时的数据显示:基本思想是从数据源获取要显示的数据, 然后利用数据绑定控件的 DataSource 设置要显示的数据,这里是 DataTable 对象 dt,给 dt 赋值可以使用以下语句之一: dt = ds.Tables("userInfo") '在表集合中按表名来检索 dt = ds.Tables(0) '在表集合中按表索引来检索 实现显示数据的参考代码如图 6.30 所示

功能:当亩体加戴载时显示”用户“表的信息 Private Sub Expd_Load(ByVal sender As Systen.Cbject,ByVal e As Systen EventArgs) Din myStr As String ·从数据库获取数据 吗Sr="select from用户 ryAdapter Ne 0leDbDataldaoter(myStr.mCorn) myAdapter.Fill(ds,"userInfo") d=d,Tab1e(”uwr1nfo)”在表集合中按表名来检需 ·量示数据 dgUserInfo..DataSource=dt'将教据表dt显示于教据绑定拉件erInfo 'ps是一个窗体级的Crrg通四age红发量,用于膏理与窗体界定的数损源 p8=e,Bind5 ngContext,I行(d级T-ls(uerInfo)》万'指定与夫联的数据源 ‘初始化文本框申的数据 txtNare.Text=d.Rous(p.Position)(O)"显示当前行的第1个字受道 txtPwd,Text=d,Romg(g,Positice)1)”显示当前行的第2个字职值 ·功能,为了方便粮主健来检记录:给款据表4t设置一个检素用的主健P:inaryKey ·下泰静句是为后珠的增忙和更新记果映准备 d此,Prinarykey■Neu DataColun((dt.Colunre(o)】"将数据表dt的第1个字段设为主树 End Sub 图6.30窗体初始化的参考代码截图 【注意1】图6.30所示的代码中出现一个窗体级变量ps(Dim ps As CurrencyManage, 它的作用是配合暴示数据的数据绑定控件dgUserinf6,获取当前记录而设置的。与其关联的 数据潭与数据虏定控件dgUserlnfo的数据源相同(即DataThble对象d由),给ps设置关联数 据的语句是: ps=Me BindingContextItem(ds Tables("userlnfo")) 成者 ps-Me BindingContext.ltem(dt) 【注意2】由于“用户”表的“用户名”字段是主健,所以在插入和更新记录时海及主 健钓束的问愿。为了富有效率地根据一个特定的用户名在数据表对象血中进行瘦索,需要 设置由的PrimaryKey属性,其数据类型是数据列数组(即D城Column)的数据类型),如 将山的第1个字段(即Columre0)设为山的主量,其对应语句是: dt PrimaryKey New DataColumn()dtColumns(0) 为了使暴示用户名和用户密码的文本框随数据绵定挖件dgUserlnfo记录的变化而变化, 需要给dgUserInfo控件的CurrentCellChanged事件编写代码,参考代码如图6.30所示。 功能,文本任的内容随光标的移动而变化 Private Sub dgUserInfo_CurrentCellChanged(ByVal sender As System.Obje '其中p.Positian用于当前记录的位置 txtNane,.Text=dt,Roms(ps,Position)(O)·显示当前行的第1个字段值 txtPwd.Text dt.Rows (ps.Position)(1) ”显示当前行的第2个字段值 End Sub 图63引文本框的显示内容随记录变化的参考代码图 (3)给按钮入编写代到:实现往数据库名为“用户”的表中桶入一条用户记录 考地以下几点: I)判断在数据表对象山是否有与文本框txtName输入的用户名匹配的记录,由于在之
图 6.30 窗体初始化的参考代码截图 【注意 1】图 6.30 所示的代码中出现一个窗体级变量 ps(Dim ps As CurrencyManager ), 它的作用是配合显示数据的数据绑定控件 dgUserInfo,获取当前记录而设置的。与其关联的 数据源与数据绑定控件 dgUserInfo 的数据源相同(即 DataTable 对象 dt),给 ps 设置关联数 据的语句是: ps = Me.BindingContext.Item(ds.Tables("userInfo")) 或者 ps = Me.BindingContext.Item(dt) 【注意 2】由于“用户”表的“用户名”字段是主键,所以在插入和更新记录时涉及主 键约束的问题,为了富有效率地根据一个特定的用户名在数据表对象 dt 中进行搜索,需要 设置 dt 的 PrimaryKey 属性,其数据类型是数据列数组(即 DataColumn()的数据类型),如 将 dt 的第 1 个字段(即 Columns(0))设为 dt 的主键,其对应语句是: dt.PrimaryKey = New DataColumn() {dt.Columns(0)} 为了使显示用户名和用户密码的文本框随数据绑定控件 dgUserInfo 记录的变化而变化, 需要给 dgUserInfo 控件的 CurrentCellChanged 事件编写代码,参考代码如图 6.30 所示。 图 6.31 文本框的显示内容随记录变化的参考代码截图 (3)给按钮 编写代码:实现往数据库名为“用户”的表中插入一条用户记录。 考虑以下几点: 1)判断在数据表对象 dt 是否有与文本框 txtName 输入的用户名匹配的记录,由于在之

前的窗体oad事件中,给数据表对象d设置了PrimaryKey的属性,所以这里就可以利 用d出的rows Find方法在找与主键值匹配的记录(返目一个DataRow对象).即: Dim dr As DataRow dr =dt Rows Find(txtName Text) 2)若存在瓜配记录,则给出“用户名不能相同”的消息提示粗。 3)若无匹配记录,则完成接下来的动作。 往数据表d血中插入一行:按d的表结构创建一个DataRow对象dr、给d山的 每个字段赋值、将山添加到表山的行集合中。 创建一个OleCommandBuilder对象用于自动生成与数据表d止中操作(这里是 往数据表血中插入一行)相关的SQL语句。 利用OleDataAdapter对象my Adapier的Upde方法更新悬据源,即往最据库 文件“学生管理mh”中的“用户”表插入了一行新的用户记录。体现了 OleDataAdapter对象是介于D.taSet(这里的DataTable对象是构成DataSct 对象表集合的基本成员)和数据源之间的桥梁作用,即利用ODA即r 对象的F面方法将数据源中的数据填充到DataSet中,用Update方法将DataSet 的数据更新数据源。 实现的参考代码如图6.32所示。 刀能:在君表中入一茶不 Private Sub btnInsert_Click(ByWal sender As Systen.Object,ByWal e As Sys ·在数据表t的行集合中搜常指定的主键值对应的数据行 Din女As DataRow dr dt.Rows.Find(txtNane.Text) ·根据被索结果进行操作 If dr Is Nothing Then 士=dt.Msow·建数据表dt的一个新Data3c对象 dr(0)=txtNane.Text '依次给行的每个字段赋情 dr(1)=txtPwd Text dt.Ros.Add(d止】 ‘给数据表活加一行(记录) ·利用ComnandBui1dcr自动生成与表中操作(G这里是增加1行)相关语句 myBuilder New 0leDbCormendBuilder (mAdapter) myAdapter.Update(ds, "userInfo")'对数据源进行更新 【Box(“插入成功!) Else gBox(“用户名不能相同) End If p8.Position ps.Count -1 End Sub 图632实行插入记录的参考代码截图 (4)给单击按钮联编写代码:实现刷除“用户”表中的当前用户记表。考虑以下 几点: I)利用数据表对象d止的Rowsps Position)Deee方法别除当前行。其中sPosition 记录当前的位置号。 2)创建一个OleCommand Builder对象用于自动生成与数据表d中操作(这里是利除 d山的当前行)相关的50L语句: 3)利用OleDataAdapter对象y Adapter的Upde方法更新爱据源,即副除数据库
前的窗体 Load 事件中,给数据表对象 dt 设置了 PrimaryKey 的属性,所以这里就可以利 用 dt 的 rows.Find 方法查找与主键值匹配的记录(返回一个 DataRow 对象)。即: Dim dr As DataRow dr = dt.Rows.Find(txtName.Text) 2)若存在匹配记录,则给出“用户名不能相同”的消息提示框。 3)若无匹配记录,则完成接下来的动作。 ✓ 往数据表 dt 中插入一行:按 dt 的表结构创建一个 DataRow 对象 dr、给 dr 的 每个字段赋值、将 dr 添加到表 dt 的行集合中。 ✓ 创建一个 OleCommandBuilder 对象用于自动生成与数据表 dt 中操作(这里是 往数据表 dt 中插入一行)相关的 SQL 语句。 ✓ 利用 OleDataAdapter 对象 myAdapter 的 Update 方法更新数据源,即往数据库 文件“学生管理.mdb”中的“用户”表插入了一行新的用户记录。体现了 OleDataAdapter 对象是介于 DataSet(这里的 DataTable 对象 dt 是构成 DataSet 对象表集合的基本成员)和数据源之间的桥梁作用,即利用 OleDataAdapter 对象的 Fill 方法将数据源中的数据填充到 DataSet 中,用 Update 方法将 DataSet 的数据更新数据源。 实现的参考代码如图 6.32 所示。 图 6.32 实行插入记录的参考代码截图 (4)给单击按钮 编写代码:实现删除“用户”表中的当前用户记录。考虑以下 几点: 1)利用数据表对象 dt 的 Rows(ps.Position).Delete 方法删除当前行。其中 ps.Position 记录当前的位置号。 2)创建一个 OleCommandBuilder 对象用于自动生成与数据表 dt 中操作(这里是删除 dt 的当前行)相关的 SQL 语句。 3) 利用 OleDataAdapter 对象 myAdapter 的 Update 方法更新数据源,即删除数据库

文件“学生管理m此”中的“用户”表的一条用户记录。 实现的参考代码如图633所示。 “切能,除当前行 Private Sub btnDelete_Click(ByVal sender As Systen Cbject,ByVal e As Systen Ev If MegBox(“时殊当前记录吗?“,周8 BoxStyle,.0 KCancel)=IsgBoxResult..0馆Tm d,wp.Potion).Delete()从行集合中殊光标所在行 “利同Can1dr自动生成与表中谏作(这里陈1行)相关9语句 myBuilder New 0leDeCornandBullder(nAdapter) myAdepter.Update(ds. ”userInfo)"更新数据源 Bo(删除成功!) End If pg.Positio0=0'设置当前光标为第1行 End Sub 图6.33实行到除当前记录的参考代码能图 (5)给按钮更新编写代码:实现更改“用户”表中的当前用户记素。考虑以下几点 1)根据更新的用户名,判断在数暴表对象是否有与之匹配的记录, 2)若存在匹配记录,则给出“用户名不能相同”的消息提示框。 3)若无匹配记录,则完成接下来的动作。 得到t的当前行并修政当输行内容。 利用dt的eetChanges方法实对d的更新。 创建一个OleCommandBuilder对象用于自动生成与数据表d山中操作(这果是 修改当前行)相关的SQL语句。 利用OleDataAdapter对象myAdapter的Update方法更新数据源,即更新数据 岸文件“学生管理mdb”中的“用户”表一条用户记录。 实现的参考代码如图6.34所示。 能,新行 Private Sub btnlpdate_Click(ByVal sender As Systen Object,ByVal e As Systen Event “先判新当前的用户名是否己被使用 If dt.Rous.Find(txtNare.Text)Is Nothing Then If IsgBox(修改当时i记梁吗?",MsgBoxStyle.0第Cancel)=IsgBoxResult,G馆Then Dlmd在s DataRow 女三dt.Ros(ps.Positian)'得到当前行 ‘更新当前行数据 女(0)txtNane.Text dr(1)txtPurd.Text dt.GetChanges ( ·实怖对数据表t的更斯 利用C0mnu1der自动生减与表中辣作(这里是更新当前行)相关9刘L悟句 ryBuilder New 0leDbCarnanBuilder(nyAdspter) yAdapter.Update(ds, ”userInfo门"更新数据潭 里Box(史新成功! End If Elae Is®0x(“用户名不能相同门 End If End Sub 图6.34实行更新当前记录的参考代码成图
文件“学生管理.mdb”中的“用户”表的一条用户记录。 实现的参考代码如图 6.33 所示。 图 6.33 实行删除当前记录的参考代码截图 (5)给按钮 编写代码:实现更改“用户”表中的当前用户记录。考虑以下几点: 1)根据更新的用户名,判断在数据表对象dt是否有与之匹配的记录。 2)若存在匹配记录,则给出“用户名不能相同”的消息提示框。 3)若无匹配记录,则完成接下来的动作。 ✓ 得到 dt 的当前行并修改当前行内容。 ✓ 利用 dt 的 getChanges 方法实施对 dt 的更新。 ✓ 创建一个 OleCommandBuilder 对象用于自动生成与数据表 dt 中操作(这里是 修改当前行)相关的 SQL 语句。 ✓ 利用 OleDataAdapter 对象 myAdapter 的 Update 方法更新数据源,即更新数据 库文件“学生管理.mdb”中的“用户”表一条用户记录。 实现的参考代码如图 6.34 所示。 图 6.34 实行更新当前记录的参考代码截图