480 likes | 635 Views
VB.NET 程序设计. 任务三 访问 Access 数据库. 学习目标. 1 、了解数据库、表、字段、记录等基本概念 2 、了解使用 Access 系统创建 Access 数据库 3 、掌握访问 Access 数据库的方法. 数据库术语. 数据库( Database ): 存储于文件中的有组织的信息集合 数据表( Table ): 由行和列组成的信息集合 字段( Field ): 存储于数据库中的信息的类别 记录 (Record) : 有关一个特定客户或企业的所有信息叫一条记录. ADO.NET.
E N D
VB.NET程序设计 任务三 访问Access数据库
学习目标 • 1、了解数据库、表、字段、记录等基本概念 • 2、了解使用Access系统创建Access数据库 • 3、掌握访问Access数据库的方法
数据库术语 • 数据库(Database):存储于文件中的有组织的信息集合 • 数据表(Table):由行和列组成的信息集合 • 字段(Field):存储于数据库中的信息的类别 • 记录(Record):有关一个特定客户或企业的所有信息叫一条记录
ADO.NET 1、VB.NET并非是用来创建新数据库的,而是用于显示、分析和操作数据库中的信息。 2、 ADO.NET是VB.NET提供的一种新的访问数据库的数据模型(或叫数据访问工具),通过这种数据模型可以访问更多格式的数据库(如Access、FoxPro、Paradox、Oracle、SQL Server等);也不管这些数据库放在什么位置都能访问(本地或是网上)。 3、组成ADO.NET的是一些类,这些类位于System.Data命名空间中,他们提供了连接数据库、读取数据库和更新数据库等操作。
预备知识——结构化查询语言SQL • SQL是一种标准化的数据库查询语言,虽说是一种查询语言,但它可完成对数据库的各种操作,包括数据的查询、增加、修改、删除以及其他操作。 • SQL主要语句: Select语句、Insert语句、Update语句、Delete语句。
预备知识——结构化查询语言SQL • Select语句的语法格式: Select 字段名 From 数据表名 [ Where 条件 ] 举例: • Select * From 学生信息 • Select * From 学生信息 Where 姓名=“李丽” • Select 姓名 From 学生信息 Where 姓名=“李丽” • select * from student1 where 学号<=3 • select * from student1 where 学号 Between 5 And 10
预备知识——结构化查询语言SQL Select语句举例: • select * from student1 where 姓名 like “刘*” • select * from 书名 where 书籍类别 In (“数据库”,”Internet”) • select * from 书名 where 书籍类别 In (“数据库”) And PubID=1 • select * from student1 where 姓名 like “刘*” order by 学号 ASC • 注:使用ORDER BY子句排序,升序的关键字为ASC,降序为DESC 。
预备知识——结构化查询语言SQL update 、 insert 、 delete 语句举例: • insert into StuInfo(name,age) values( “张山” ,19) • update StuInfo set name=“张三“,age=18 where id=005 • delete * from StuInfo where id = 18
使用Access创建数据库 操作步骤: • 1、启动Access办公软件 • 2、→文件/新建 • 3、双击“使用设计器创建表” • 4、设置主键:右击某个字段名,选“主键” • 5、添加数据:双击表名,直接添加数据,保存
2 1 3 访问Access数据库——显示 方法一:在Visual Studio.NET中建立连接 • 1、从工具箱中的“数据”标签中双击OleDbDataAdapter对象 如果工具箱中的“数据”标签中没有OleDbDataAdapter对象,则可以右击“数据”工具箱中某控件例如DataSet控件,从弹出的快捷菜单中执行[选择项…]命令(如图),打开“选择工具箱项”对话框,选择“.NET Framework组件”选项卡,从中选择OleDbDataAdapter这三个组件(在这三项组件的名称前的方框内打勾即可)。单击“确定”按钮,这三个组件就被添加到工具箱中了。
2 1 4 3 方法一:在Visual Studio.NET中建立连接 接下来,出现“数据适配器配置向导”对话框,点击“新建连接”按钮。出现“添加连接”对话框。可以执行“更改”选择数据源的类型。这里选择“其他”,然后点“确定”,接着,在OLE DB提供程序下选择: Microsoft Jet 4.0 OLE DB Provider
2 1 方法一:在Visual Studio.NET中建立连接 • 点“数据链接”按钮。出现“数据链接属性”对话框,在“连接”选项卡中选择或输入数据库名称右边的小按钮中选取数据库文件。选好后,点“测试连接”,提示“测试连接成功”
2 1 4 图3 3 方法一:在Visual Studio.NET中建立连接 • 点“确定”,回到“添加连接”对话框 • 点“确定”,回到“数据适配器配置向导”对话框,可以查看连接字符串。 • 点“下一步”,出现如图3对话框。这里请选择“是”(那么访问数据库时,将是相对路径,即.exe可执行文件和数据库文件将在同一个目录下),接着再点“下一步”
1 3 2 方法一:在Visual Studio.NET中建立连接 • 出现如图后,点“查询生成器”按钮。选择要用的表,然后点“添加”,把要用的字段依次打勾。然后点“确定”。
1 2 方法一:在Visual Studio.NET中建立连接 • 回到如图对话框,点“下一步”,点“完成”。最终,窗体下方生成“OleDbDataAdapter1”和“OleDbConnection1”两个对象(如图)。 3
2 1 3 方法一:在Visual Studio.NET中建立连接 右键“OleDbDataAdapter1”,选择“生成数据集…”,点“确定”后,生成数据集对象“DataSet11” 3
方法一:在Visual Studio.NET中建立连接 2、将数据源绑定到一个或多个显示控件上 • 问题:什么样的控件可以做为数据源的显示控件? • 一般来说,凡是具有DataBindings属性的控件都可做显示控件,典型的例子: TextBox 、Label、ComboBox等控件
方法一:在Visual Studio.NET中建立连接 将数据源绑定控件的操作如下: • 在属性窗口中设置文本框的DataBindings属性 • 打开DataBindings分类,单击Text属性,单击下拉箭头 • 选择某个数据集对象中某个表的某个字段
方法一:在Visual Studio.NET中建立连接 3、编写一部分代码 • 关键代码:利用数据适配器给数据集手动加载数据 • OleDbDataAdapter1.Fill(Dataset11) • 上述代码可以放在某个命令按钮的单击事件过程中,也可放在窗体的Load事件过程中
方法一:在Visual Studio.NET中建立连接 • 课堂实训
访问Access数据库——显示 创建导航控件
访问Access数据库——显示 创建导航控件的代码: ’首条 • Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click • Me.BindingContext(DataSet11, "职员基本信息表").Position = 0 • End Sub • ‘最后一条 • Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click • Me.BindingContext(DataSet11, "职员基本信息表").Position = Me.BindingContext(DataSet11, "职员基本信息表").Count - 1 • End Sub • ’ 前一条 • Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click • Me.BindingContext(DataSet11, "职员基本信息表").Position -= 1 • End Sub • ‘下一条 • Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click • Me.BindingContext(DataSet11, "职员基本信息表").Position += 1 • End Sub
访问Access数据库——显示 方法二:使用较多的代码 ADO.NET对象结构
方法二:使用较多的代码 ADO.NET对象功能(访问数据库时要用到的对象及步骤) • 1 、Connection对象负责连接数据库 • 2、 Command对象负责对数据库下达SQL命令 • 3、在ADO.NET中,介于Dataset和Connection对象之间还有一个对象DataAdapter,负责传递数据。 • 4、Dataset对象用来保存所查询到的数据记录,是一种非连接的数据缓存。
方法二:使用较多的代码 创建Connection对象时,可以使用2个类: 1、SqlConnection类:管理SQL Server 7.0或以上数据源的连接,该类位于System.Data.Sqlclient 命名空间。 2、OledbConnection类:管理可通过OLEDB访问的数据源的连接,例如 Access数据库。该类位于System.Data.OLEDB 命名空间。 同样,创建Command对象和DataAdapter对象时都有2个类可以选择,要看访问的数据源的类型。
方法二:使用较多的代码 连接好数据库后,用代码绑定数据集到显示控件,如下所示: • Me. TxtName.DataBindings.Add(“Text”, myDataSet, “职员基本信息表.姓名") • Me. TxtID.DataBindings.Add(“Text”, myDataSet, “职员基本信息表.职员编号") 其他要注意的地方: 在类定义的开头要指出数据访问对象所在的命名空间: • Imports System.Data.OleDb
方法二:使用较多的代码(例子) 例1:用较多代码访问数据库(请注意访问数据库的步骤,访问数据库时使用的是相对路径【数据库文件和可执行文件在同一个文件夹里】) 数据库为Student.mdb,有一个Records表,该表字段为:编号,姓名,性别,出生日期,家庭住址,手机,Email,Oicq。 思考:此种情况怎样实现导航功能呢?
方法二:使用较多的代码( 例子) 绝对路径 例2:请注意定义连接等对象的代码和例1有所不同。 • '说明:本例子并没有用到命令对象,请注意连接对象数据适配器对象的定义和赋值 • ‘1、声明连接字符串(访问该数据库时用的是绝对路径) • Dim sConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\VS2005Project\WindowsApplication7\bin\Debug\Student.mdb;Persist Security Info=False" • '2、声明连接对象 • Dim Mycn As New OleDbConnection(sConnString) • '3、声明命令对象 • 'Dim myCommand As OleDbCommand • '4、声明数据适配器对象 • Dim myDataAdapter As New OleDbDataAdapter • '5、声明数据集对象 • Dim myDataSet As New DataSet • '6、打开连接 • Mycn.Open() • '7、通过数据适配器填充已连接的数据源的数据到数据集中(一个数据适配器只能填充一张表) • Dim mySql As String • mySql = "select * from Records" • myDataAdapter = New OleDbDataAdapter(mySql, Mycn) • myDataAdapter.Fill(myDataSet, "Records") • '8、关闭连接 • Mycn.Close() • '9、用代码绑定数据集到显示控件 • Me.TextBox1.DataBindings.Add("Text", myDataSet, "Records.编号") • Me.TextBox2.DataBindings.Add("Text", myDataSet, "Records.姓名") • Me.TextBox3.DataBindings.Add("Text", myDataSet, "Records.性别") • Me.TextBox4.DataBindings.Add("Text", myDataSet, "Records.出生日期") • Me.TextBox5.DataBindings.Add("Text", myDataSet, "Records.家庭住址") • Me.TextBox6.DataBindings.Add("Text", myDataSet, "Records.手机") • Me.TextBox7.DataBindings.Add("Text", myDataSet, "Records.Email") • Me.TextBox8.DataBindings.Add("Text", myDataSet, "Records.Oicq") 思考:此种情况怎样实现导航功能呢?
思考 • 方法一和方法二有本质的区别吗?
关于Command对象 • Command对象的主要属性: 1、Connection属性:设置用于执行命令的Connection对象。 2、CommandText属性:设置被执行的SQL语句。 • 下面两段代码的效果相同(声明命令对象有二种方法): Dim sConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\luo\人力资源管理系统\hrmbook.mdb;Persist Security Info=False" Dim Mycn As New OleDbConnection(sConnString) Dim myCom As OleDbCommand ‘此方法声明可以不用关键字New,当然用也可以 Dim mySql As String mySql = "select sum(奖励金额) as 奖金, 职员编号 from 职员奖励表“ Mycom = New OleDbCommand(mySql,Mycn) Dim sConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\luo\人力资源管理系统\hrmbook.mdb;Persist Security Info=False" Dim Mycn As New OleDbConnection(sConnString) Dim myCom As New OleDbCommand ‘此方法声明一定要用关键字New Dim mySql As String mySql = "select sum(奖励金额) as 奖金, 职员编号 from 职员奖励表“ Mycom.Connection = Mycn Mycom.CommandText = mySql
关于Command对象 • Command对象的方法: 1、ExecuteNonQuery方法:执行一个SQL命令,但不返回结果,只返回一个值说明有多少行数据被处理。 2、ExecuteReader方法:执行一个SQL命令,并生成DataReader对象作为结果返回。使用该方法时要先创建DataReader对象用来获取数据。 • 案例见:DataBase.vb和frmSalary.vb
关于DataReader对象 • DataReader对象是基于连接的数据流,它一次只将一个记录导入内存,而不会将结果集的所有记录同时返回,因此可以避免耗费大量内存资源。 1、Read方法:读取DataReader对象的下一行记录。 详解:当DataReader对象首次打开时它被置于文件开始位置即第一行之前,当调用一次Read方法, DataReader才会移动到结果集的第一行处。以后每调用依次Read方法, DataReader都会移动到结果集的下一行处,直到Read方法返回False为止,表明此时查询无结果。 2、GetType方法:将指定列的值作为指定类型获取。例如:GetString方法表示将取得的字段数据设为字符串 • 案例见: frmSalary.vb
DataReader对象举例2 • Dim sConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\luo\人力资源管理系统\hrmbook.mdb;Persist Security Info=False" • Dim Mycn As New OleDbConnection(sConnString) • Dim myCom As OleDbCommand • Mycn.Open() • Dim mySql , strSQL As String • mySql = "select sum(奖励金额) as 奖金, 职员编号 from 职员奖励表“ • Mycom=New OleDbCommand(mySql,Mycn) • Dim dr As OleDbDataReader • dr = Mycom.ExecuteReader • While (dr.Read()) • Dim jine As Double = dr.GetDouble(0) • Dim id As String = dr.GetString(1) • strSQL = “update 月工资统计表 set 奖金=” + jine.ToString() + “ where 职 员编号='" & id & “’” • End While • dr.Close() • Mycom=New OleDbCommand(strSQL,Mycn) • Mycom.ExecuteNonQuery() 注意:该案例只执行了月工资统计表最后一条记录的更新,如何完善程序?见DataBase.vb和frmSalary.vb(通过数组知识和事务知识)
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click Try '异常处理,防止添加记录时出错 '请注意SQL语句的书写,特别要注意:哪两个双引号相互匹配,哪两个单引号相互匹配 Dim str As String = "insert into Records(编号,姓名,性别,出生日期,家庭住址,手机,Email,Oicq) values('" & Me.TextBox1.Text & "','" & Me.TextBox2.Text & "','" & Me.TextBox3.Text & "','" & Me.TextBox4.Text & "','" & Me.TextBox5.Text & "','" & Me.TextBox6.Text & "','" & Me.TextBox7.Text & "','" & Me.TextBox8.Text & "')" '声明命令对象 Dim mycom As OleDb.OleDbCommand mycom = New OleDb.OleDbCommand(str, Me.OleDbConnection1) '打开连接 Me.OleDbConnection1.Open() '执行无返回结果的查询命令ExecuteNonQuery mycom.ExecuteNonQuery() '清空数据集,因为数据库的内容已经发生变化 Me.DataSet11.Clear() Me.BindingContext(Me.DataSet11, "Records").ResumeBinding() ‘恢复数据绑定 '把最新的数据重新填充到数据集 Me.OleDbDataAdapter1.Fill(Me.DataSet11, "Records") '关闭连接 Me.OleDbConnection1.Close() Me.btnClear.Enabled = True '清空功能可用 Me.btnSave.Enabled = False '保存功能不可用 MsgBox("记录添加成功!") '出现错误时执行。ex的Message包含了错误的信息 Catch ex As Exception Me.BindingContext(Me.DataSet11, "Records").ResumeBinding() ‘恢复数据绑定 Me.OleDbConnection1.Close() MsgBox(ex.Message) End Try End Sub 2、内容录入完毕后,保存到数据库 Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click '把各文本框清空,准备录入新的记录 Me.BindingContext(Me.DataSet11, "Records").SuspendBinding() '挂起数据绑定 Me.TextBox1.Text = "" Me.TextBox2.Text = "" Me.TextBox3.Text = "" Me.TextBox4.Text = "" Me.TextBox5.Text = "" Me.TextBox6.Text = "" Me.TextBox7.Text = "" Me.TextBox8.Text = "" Me.btnSave.Enabled = True '保存功能可用 Me.btnClear.Enabled = False '清空功能不可用 Me.TextBox1.Focus() End Sub 1、清空各文本框内容,准备录入记录 访问Access数据库——增加
访问Access数据库——增加 例子1:程序运行界面图
访问Access数据库——修改 修改记录时,主键字段不可更改,因此,该SQL语句有一个where条件语句 Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Try Dim str As String = "update Records set 姓名='" & Me.TextBox2.Text & "',性别='" & Me.TextBox3.Text & "',出生日期='" & Me.TextBox4.Text & "',家庭住址='" & Me.TextBox5.Text & "',手机='" & Me.TextBox6.Text & "',Email='" & Me.TextBox7.Text & "',Oicq='" & Me.TextBox8.Text & "' where 编号='" & Me.TextBox1.Text & "'" Dim mycom As OleDb.OleDbCommand mycom = New OleDb.OleDbCommand(str, Me.OleDbConnection1) Me.OleDbConnection1.Open() mycom.ExecuteNonQuery() Me.DataSet11.Clear() Me.OleDbDataAdapter1.Fill(Me.DataSet11, "Records") Me.OleDbConnection1.Close() MsgBox("记录修改成功!") Catch ex As Exception Me.OleDbConnection1.Close() MsgBox(ex.Message) End Try End Sub
访问Access数据库——删除 Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click Try Dim str As String = "delete from Records where 编号='" & Me.TextBox1.Text & "'" Dim mycom As OleDb.OleDbCommand mycom = New OleDb.OleDbCommand(str, Me.OleDbConnection1) Me.OleDbConnection1.Open() mycom.ExecuteNonQuery() Me.DataSet11.Clear() Me.OleDbDataAdapter1.Fill(Me.DataSet11, "Records") Me.OleDbConnection1.Close() MsgBox("记录删除成功!") Catch ex As Exception Me.OleDbConnection1.Close() MsgBox(ex.Message) End Try End Sub
1 添加控件 2 设置属性 3 运行界面 关于DataGridView控件 • DataGridView控件具有极高的可配置性和可扩展性,它提供大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。 • 当需要在Windows窗体应用程序中显示表格数据时,应首先考虑使用DataGridView控件,然后再考虑使用其他控件(例如DataGrid)。 • 一般设置两个属性: DataSource:某个数据集对象 DataMember:该数据集对象的某个表
2 1 3 关于DataGrid控件 • DataGrid控件用于显示数据表中的数据,该控件可用来显示单个表,也可以显示多个不相关的表,也可以显示多个相关的表。具体的用法详见“任务七” 若工具箱中找不到DataGrid控件,可以在“所用 Windows窗体”分组工具箱中,右键,然后选择“选择项…”,在出现的窗口中,选择“.NET Framework组件”选项卡,找到“DataGrid”然后在其前面打勾。然后点“确定”。那么DataGrid就添加到工具箱中。
关于DataView • DataView类:表示用于排序、筛选、搜索和编辑的 表(DataTable )的可绑定数据的自定义视图。 • 创建 DataView 对象的方法: 方法一:使用 DataView 构造函数 Dim custDV As DataView = New DataView(custDS.Tables("Customers")) 方法二:创建对 DataTable 的 DefaultView 属性的引用 Dim custDV As DataView = custDS.Tables("Customers").DefaultView
关于DataView DataView对象的属性: • Sort属性:获取或设置 DataView 的一个或多个排序。 例:Dataview1.Sort = “Name Asc” Dataview1.Sort = “Name Desc” • RowFilter属性:获取或设置用于筛选在 DataView 中查看哪些行的表达式。 例:Dataview1. RowFilter = “Name like ‘%陈%’” • RowStateFilter属性:获取或设置用于 DataView 中的行状态筛选器。 例: Dataview1. RowStateFilter = DataViewRowState.CurrentRows Dataview1. RowStateFilter = DataViewRowState. ModifiedOriginal ___所有 Modified 行的 Original 行版本。
1 2 3 关于DataView的一个例子 若工具箱中找不到DataView控件,可以在“所用 Windows窗体”分组工具箱中,右键,然后选择“选择项…”,在出现的窗口中,选择“.NET Framework组件”选项卡,找到“DataView”然后在其前面打勾。然后点“确定”。那么DataView就添加到工具箱中。
1 4 3 2 关于DataView的一个例子 双击“DataView”控件后,在当前窗体下方会出现“DataView1”对象,在DataView1控件的属性窗口中,设置它的 Tabel属性:某个数据集对象某个表 接着把DataViewGrid控件的DataSource属性设置为DataView1。这样就可以使用DataView的属性:
课堂实训 • 实训1:创建一个Access数据库student,建一表Records,该表字段(字段类型均为文本,编号为主键):编号,姓名,性别,出生日期,家庭住址,手机,Email,Oicq。 在VB.NET环境中创建一个访问该数据库的系统(包括显示、修改、删除、增加和保存等功能)。如图所示界面。 • 实训2:利用数据库访问知识完善真实登录窗体frmlogin的代码
书面作业 • 工资管理系统 • 具体要求请看Word文档
补充内容 • 访问数据库的另外一种方法 • 具体例子及内容参考文件夹“任务三相关例子及代码”文件夹里的