C# datagridview 使用

更新时间:2023-11-02 09:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目十 数据管理

面向数据库编程始终是程序设计的一个难点和重点,对于大量的数据,使用数据库来存储管理将比通过文件来存储管理有更高的效率。VB.NET程序设计语言自身是不具备对数据库进行操作的功能,它对数据库的处理是通过.Net环境中面向数据库编程的类库和微软的MDAC(Microsoft Data Access Components)来实现的。

先介绍几个基本概念。以一定的方式组织并存储在一起的相互关联的数据的集合称为数据库(DataBase,简称DB)。对数据库的管理是由数据管理系统(DataBase Management Systme,DBMS)来实现,它是用户与数据库之间的接口,它提供了对数据库使用和处理的基本操作。

本章主要探讨用VB.NET进行数据库的基础编程技术,即:用VB.NET如何实现对数据的浏览,如何添加、插入记录,如何删除记录和如何更改记录。VB.NET可以处理许多外部数据库(由其它数据库软件建立的数据库),如Access、FoxPro、Dbase、Excel、SQL Server、Oracle等数据库。本章处理的数据库是Access数据库。

活动一 数据浏览

活动说明

现有某人的名片数据库cards.mdb中有一记录朋友信息的数据表friends,包括编号、姓名、公司、职务、公司地址、电话、手机、E-mail,要求在VB.NET 2005环境下能按图9-1-1窗体显示的格式来浏览查询朋友信息。要求能使用命令按钮来实现记录的向前、向后移动,文本框只用于浏览数据,不允许修改。

图9-1- 1 朋友信息浏览界面

进一步,如图9-1-2所示,要求根据输入不同的职务,能通过DataGridView控件显示所在这个单位的所有朋友的信息。若不输入“职务”,则显示所有客户。

图9-1- 2 朋友信息查询界面

活动分析

在VB.NET中,数据控件本身不能直接显示数据库记录集中的数据,而必须通过能与数据控件绑定的控件来实现。首先由

BindingSource数据控件指定数据源,再将各个文本框和DataGridView控件都绑定到数据控件BindingSource1上,运行时各个绑定控件就能够及时显示数据库的记录。最后在窗体上增加4个命令按钮,通过对4个命令按钮的编程实现记录的浏览。通过SQL语句改变数据控件BindingSource1的FriendsBindingSource的值,使DataGridView控件显示相应的查询记录。

提示:要是数据绑定控件能够显示数据库记录集中的数据,必须在设计时或运行时设置数据绑定控件的DataBindings属性,才可以显示数据库中的记录。

编程实现

一、 界面设计

设计界面分别如图9-1-1、图9-1-2所示添加各个控件,并按照下面进行属性设置。

1. 在 BindingSource1控件属性中:将DataSource属性中选择“添加数据源”,然后选择“数据库”,单击“下一步”,选择“新建连接”,如图9-1-3所示。将数据库设置为cards.mdb。

图9-1- 3 建立数据库的连接界面

2.将六个文本框的DataBindings属性中的Text设置为 FriendsBindingSource中相应的字段名。ReadOnly属性设置为True。

3. 在DataGridView控件属性中:将Datasource设置为FriendsBindingSource。将RowHeadersVisible设置为False,表示不显示左侧的行标题列。

4.其他控件的属性均按图示设置。 二、 事件过程代码 1.“首记录”按钮程序代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '首记录

FriendsBindingSource.MoveFirst() End Sub

2.“上一条”按钮程序代码

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click '上一条,向上移动记录指针

FriendsBindingSource.MovePrevious()

End Sub

3.“下一条”按钮程序代码

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click ' 下一条,向下移动记录指针

FriendsBindingSource.MoveNext()

End Sub

4.“末记录”按钮程序代码

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click '末记录

FriendsBindingSource.MoveLast()

End Sub

5. “查询”按钮程序代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim strsql objConn.Open()

objDSet.Clear() '清除原数据集记录 If Trim(TextBox1.Text) = \ strsql = \ Else

strsql = \职务='\ End If

Dim objAdap As New OleDbDataAdapter(strsql, objConn) objConn.Close()

objAdap.Fill(objDSet, \

DataGridView1.DataSource = objDSet.Tables(\

End Sub

拓展:用DataGridView属性窗口上的“编辑列”“添加列”,对显示的记录信息进行设置。

学习支持

一、数据库的基本概念

按数据的组织方式不同,数据库可分为三种类型:网状数据库、层次数据库和关系数据库。其中,关系数据库是目前应用最多的数据库。

在关系数据库中,将数据存储在一些二维表中,然后可以通过建立各个表之间的关系来定义数据库的结构。

(1)表

将相关的数据按行和列的形式组织成的二维表格即为表。如表9-1-1所示就是一个用于描述“”这一实体的若干信息的表。

表9-1-1 学生信息表

班级 J200000101 J200000102 J200000201 J200000202 J200000301 J200000302 J200000401 J200000401 J200000402 S200000501 J200000502 X200000701 X200000701 X200000601 X200000601 学号 20000101001 20000101002 20000201001 20000202001 20000301001 20000301002 20000401001 20000401002 20000402001 20000501001 20000501002 20000701001 20000701002 X0000601001 X0000601002 姓名 张少华 李海涛 王莹 赵文文 曹磊 林玲 金子 谭国庆 成铭和 庄小丽 陆国华 沈荣 顾佳佳 马黎丽 朱晓菲 性别 男 男 女 女 男 女 女 男 男 女 男 男 女 女 女 出生日期 1982/5/2 1982/6/7 1982/8/30 1981/11/2 1981/10/29 1982/5/30 1982/6/6 1981/12/20 1982/10/28 1982/8/10 1982/2/13 1981/11/23 1982/4/26 1982/5/6 1982/8/18 家庭住址 中山南二路900号 黄山路123号 广西路59号 凤阳路145号 四川路555号 山东路1000号 新华南路333号 江苏北路444号 宁夏路788号 黄河路111号 高科路458号 北城路500号 河南中路410号 天山路999号 华山路123号

表9-1-2 专业表

专业代码 系部代码 专业名称 001 002 003 004 005 006 007 001 001 002 002 002 003 003 电子工程 微电子学 英语 德语 法语 广播电视学 广告学 系部名称 表9-1-3 系部表

系部代码 001 002 003 信息科学与工程系 外文系 新闻系 一个数据库中可以有一个或多个表,各表之间存在着某种关系。如“专业”表与“系部”表可以通过“系部代码”建立每个专业与各个系部之间的关系,见表9-1-2与表9-1-3。数据库也有自己的名称,如可以将包含以上三个表的数据库称为“学生信息管理”数据库。

(2)表的结构

每个表 由多行和多列组成,表中的每一行称为记录,如“专业”表中的每个专业的信息就是一个记录,同一个表中不应有相同的记录。表中的每一列称为一个字段,每个字段有一个字段名,如“专业”表中共有3列,即3个字段,字段名依次是:专业代码、系部代码、专业名称。每个字段具有相同的数据类型,记录中的某字段值称为数据项。

拓展:在一个表中,记录的顺序和字段顺序不影响表中的数据信息。

字段名称、字段类型、字段长度等要素构成了表的结构。表9-1-4

描述了“学生信息管理”数据库中各表的结构。

表9-1-4 “学生信息管理”数据库中各表的结构

表名 学生信息 系部 专业 字段名 专业代码 班级 学号 姓名 性别 出生日期 家庭住址 系部代码 系部名称 专业代码 系部代码 专业 名称 字段类型 文本 文本 文本 文本 文本 日期/时间 文本 文本 文本 文本 文本 文本 字段长度 4 30 12 10 2 默认 50 4 20 4 4 30 (3)表中的关键字

如果表中的某个字段或多个字段组合能唯一地确定一个记录,则称该字段或多个字段组合为候选关键字。如“学生信息”表中的“学号”可以作为候选关键字,因为对于每个学生来说,学号是唯一的。一个数据表中可以有多个候选关键字,但只能确定一个候选关键字作为主关键字。

提示:主关键字必须具有一个唯一的值,且不能为空值。

(4)表间的关联

表与表之间的关系是按照某一个公共字段来建立的一个表中记录同另一个表中记录之间的关系,如“学生信息”表与“专业”表之间就可以通过“专业代码”这个公共字段建立关系。表间的关系分为一对一、一对多(多对一)、多对多关系。常用的是一对多(或多对一)关系,例如,对于“专业”表中的每一个专业代码,在“学生信息”表中都有多条记录具有相同的专业代码。

(5)外关键字(Foreign Key)

如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外关键字。由此可见,外关键字表示了两个关系之间的联系。以另一个关系的外关键字做主关键字的表被称为主表,具有此外关键字的表被称为主表的从表。外关键字又称作外键。在“专业”表中,“专业代码”是主键,在“学生信息”表中也有“专业代码”字段,因此“专业表”是主表,“学生信息”表是从表,字段“专业代码”就是主表的外键。 (6)索引

索引提供了一个针对表中特定列的数据的指针,是以特定的顺序记录在一个索引文件上。查找数据时,数据库管理系统先从索引文件上找到信息的位置,再根据指针从表中读取数据。

每个索引都必须有一个名称,且由一个索引表达式来确定索引的顺序,索引表达式即可以是一个字段,也可以是多个字段的组合。在一个表中可以建立多个索引,但只能有一个主索引,主索引的索引字段在整个表中不允许出现重复。例如,要按学生的学号快速检索,就要在“学生信息”表中以“学号”为索引字段建立一个索引,并为其取个名字。

提示:只有当被所有的字段中的数据经常被查询时,才需要对表创建索引。索引将占用磁盘空间,并降低添加、删除和更新记录的速度。

二、 数据源控件(BindingSource)

1. “数据源”控件的主要功能就是连接到数据源、建立和执行针对这些数据源的命令以及将这些命令的结果检索和绑定到页上的元

素。另外,“数据源”控件还对用户当前正在操作的记录进行跟踪。 “数据源”控件是一个 ActiveX?控件,在运行时没有任何可见的界面。 用户可以直接在控件工具箱的数据标签中找到数据控件

BindingSource()。它是VB.NET内部控件之一,它可以通过数据库引擎Microsoft Jet访问Access、Foxpro等数据库,还可以访问ODBC数据源。BindingSource控件充当数据绑定控件和数据源之间的中介。它提供了一个通用接口,其中包含控件绑定到数据源时所需的所有功能。使用向导将控件绑定到数据源时,实际上创建并配置了一个BindingSource控件实例,并绑定到该实例。利用此控件可以写少量的代码就能实现对数据库的数据进行查询、添加、删除、更新等一系列基本操作,如图9-1-4所示。

图9-1-4 BindingSource与数据库的连接原理图

2.数据源控件的主要属性、事件和方法

如果创建了一个新的Windows窗体程序,并在主窗口Form1中添加了一个BindingSource控件,配置BindingSource实例的第一步是设置其DataSource属性。这可以是几种数据源中的任何一种,包括自己创建的数据源,但通常是类型化数据集。使用属性窗口,可以绑定到项目中类型化数据集。BindingSource控件中常用的属性、事件、方法参见表9-1-5、表9-1-6和表9-1-7所示。

表9-1-5 BindingSource控件常用属性列表

属性 AllowEdit AllowNew AllowRemove Count CurrencyManager Current DataMember DataSource Filter Item Sort 说明 指示是否可以编辑BindingSource控件中的记录。 指示是否可以使用 AddNew 方法向BindingSource控件添加记录 指示是否可从BindingSource控件中删除记录。 获取BindingSource控件中的记录数。 获取与BindingSource控件关联的当前记录管理器。 获取BindingSource控件中的当前记录 获取或设置连接器当前绑定到的数据源中的特定数据列表或数据库表。 获取或设置连接器绑定到的数据源。 获取或设置用于筛选的表达式。 获取或设置指定索引的记录。 获取或设置用于排序的列名来指定排序。

表9-1-6 BindingSource控件常用事件列表 名称 AddingNew CurrentChanged CurrentItemChanged DataMemberChanged DataSourceChanged ListChanged PositionChanged 说明 在将项添加到基础列表之前发生。 在当前绑定项更改时发生。 在 Current 属性的属性值更改后发生。 在 DataMember 属性值更改后发生。 在 DataSource 属性值更改后发生。 当基础列表更改或列表中的项更改时发生。 在 Position 属性的值更改后发生。

表9-1-7 BindingSource控件常用方法列表 名称 Add AddNew CancelEdit Clear EndEdit Insert MoveFirst MoveLast MoveNext MovePrevious Remove RemoveAt RemoveCurrent 说明 将现有项添加到内部列表中。 向基础列表添加新项。 取消当前编辑操作。 从列表中移除所有元素。 将挂起的更改应用于基础数据源。 将一项插入列表中指定的索引处。 移至列表中的第一项。 移至列表中的最后一项。 移至列表中的下一项。 移至列表中的上一项。 从列表中移除指定的项。 移除此列表中指定索引处的项。 从列表中移除当前项。

三、数据绑定控件(DataGridView)

利用数据源控件可以实现对数据库的访问,然而数据源控件本身并不能直接显示记录集中的数据,必须通过与它绑定的控件来实现。

在VB.NET中,可以和数据源控件绑定的有文本框、标签、列表框、组合框等内部控件。利用标准数据绑定控件显示记录集信息,一般通过设置绑定控件DataSource属性来实现绑定。并通过窗体上的DataGridView1的任务窗口设置显示的数据列。如图9-1-6所示。

图9-1-5 DataGridView数据绑定的设置

或者代码实现如下:

Dim ds As DataSet = GetDataSet()

DataGridView1.DataSource = ds.Tables(\

DataGridView 一次只能显示一个表。如果绑定整个DataSet,则不会显示任何数据,除非您使用要显示的表名设置了 DataMember 属 性。

DataGridView 显示遵循以下几项简单的规则: ? 为数据源中的每个字段创建一列。

? 使用字段名称创建列标题。列标题是固定的,这意味着用户在列表中向下移动时列标题不会滚动出视图。

? 支持 Windows XP 视觉样式。您会注意到列标题具有新式的平面外观,并且当用户将鼠标移到其上时会突出显示。

DataGridView 还包括几个您可能不会立即注意到的默认行为: ? 允许就地编辑。用户可以在单元格中双击或按 F2 来修改当前值。唯一的例外是将 DataColumn.ReadOnly 设置为 True 的字段 ? 支持自动排序。用户可以在列标题中单击一次或两次,基于该字段中的值按升序或降序对值进行排序。默认情况下,排序时会考虑数据类型并

? 按字母或数字顺序进行排序。字母顺序区分大小写。 ? 允许不同类型的选择。用户可以通过单击并拖动来突出显示一个单元格、多个单元格或多个行。单击 DataGridView 左上角的方块可以选择整个表。

? 支持自动调整大小功能。用户可以在标题之间的列分隔符上双击,使左边的列自动按照单元格的内容展开或收缩。

实践活动

要求在本项目活动一的基础上增加4个按钮:新增、删除、修改和放弃,如图9-1-5所示,通过对4个按钮的编程建立增删改的功能。根据按钮提示文字调用AddNew方法或Update方法,当按钮提示为“新

增”时调用AddNew方法,并将按钮提示文字改为“确认”,同时使“删除”按钮和“修改”按钮不可用,而使“放弃”按钮可用。当新增加记录后需再次单击“确认”按钮调用Update方法添加记录,并将按钮提示文字改为“新增”,使“删除”按钮和“修改”按钮可用,而使“放弃”按钮不可用。

其他按钮的操作类似“新增”按钮。

图 9-1-6 实践活动程序运行界面

活动二 学生信息管理系统

活动说明

一个简单的学生信息管理系统,运行时界面及其他各界面如图9-2-1至9-2-6所示,主界面包含两个选项卡,分别为“数据查询”——用于按指定方式查询相应的信息;“数据维护”——用于指定的数据表进行浏览、添加、删除和更新操作。

图 9-2-1 “选项卡”界面

图 9-2-2 查询条件输入框

图 9-2-3 查询结构

图 9-2-4 “系部”数据表维护界面

图 9-2-5 “专业”数据表维护界面

图 9-2-6 “学生信息”数据表维护界面

活动分析

学生信息管理系统在主界面中采用TabControl控件,使得在一个窗体Form1上同时拥有了几个不同的人机交互界面,如图9-2-1所示。 运行时,在“数据查询”选项卡中选择一种查询方式(如按专业查询后),单击“确定”按钮,打开一个输入框,提示输入查询条件(如输入专业代码为“001”,如图9-2-2所示),确定后打开查询结果

窗体,显示查询结果(如图9-2-3所示)。

运行时,在“数据维护”选项卡中选择一个表后,单击“确定”按钮,打开相应的维护界面,分别如图9-2-4、图9-2-5、图9-2-6所示,在维护界面上可以分别对“系部”、“专业”和“学生信息”三个表进行添加记录、删除记录和更新当前修改操作,并均可以浏览记录。 在本活动中需要TabControl、DataGrid等控件;添加一个标准模块,在其中定义全局变量。

编程实现

一、 主窗体建立

1.首先在窗体上创建一个TabControl控件;

2. 按图9-2-1所示添加框架、单选按钮和命令按钮等控件; 3. 按题目中各控件的属性进行设置;

4. 其他窗体按图9-2-2至图9-2-6所示进行设置。 二、主要控件的属性

1.在TabControl控件的属性页中;TabPages属性添加选项卡,将选项卡数设置为2,并且分别为两个选项卡输入标题Text属性:“数据查询”和“数据维护”。

图9-2-7

2.将Button按钮的image属性设置为对应的图片。

3.在DataGridView控件的属性中:RowHeadersVisible属性是指示是否显示包含行的标题列,设置为False。

4.方向箭头为素材图片,其他控件的属性均按图示设置。

提示:TabControl控件结合了 Visual Basic 6.0 中 TabStrip 和 SSTab 两个控件的功能。

三、事件过程代码

1.添加一个标准模块,在模块中定义全局变量

Imports System.Data

Imports System.Data.OleDb

Module Module1 '自动生成的代码,其它代码需要手动生成

Public str As String Public sno As String Public snn As String

Public mybind As BindingManagerBase

Public strConn As String = \学生信息管理.mdb\

Public objConn As New OleDbConnection(strConn)

Public objAdap As New OleDbDataAdapter Public objDSet As New DataSet

End Module '自动生成的代码,其它代码需要手动输入

2.主界面“学生信息管理系统”窗体(Form1)代码

Imports System.Data

Imports System.Data.OleDb

Public Class Form1 '自动生成的代码,其它代码需要手动输入

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click If RadioButton4.Checked Then str = \系部\ Form2.Show()

ElseIf RadioButton5.Checked Then str = \专业\ Form3.Show() Else

str = \学生信息\ Form4.Show() End If End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click '退出 End End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click '进入

Dim str1, str2, str3, str4 As String If RadioButton1.Checked Then

sno = InputBox(\请输入系部代码?\ snn = \系部\

str1 = \系部.系部名称,专业.专业名称\ str2 = \专业,系部\

str3 = \专业.系部代码=系部.系部代码\ str4 = \系部.系部代码=\ str = str1 & str2 & str3 & str4 ElseIf RadioButton2.Checked Then

sno = InputBox(\请输入专业代码?\ snn = \专业\

str1 = \系部.系部名称,专业.专业名称,学生信息.班级\ str2 = \专业,系部,学生信息\

str3 = \where 专业.系部代码=系部.系部代码and 专业.专业代码=学生信息.专业代码\

str4 = \专业.专业代码=\ str = str1 & str2 & str3 & str4 ElseIf RadioButton3.Checked Then

sno = InputBox(\请输入班级代码?\ snn = \班级\

str1 = \系部.系部名称,专业.专业名称,学生信息.班级,学生信息.学号,学生信息.姓名,学生信息.性别,学生信息.出生日期,学生信息.家庭住址\ str2 = \专业,系部,学生信息\

str3 = \where 专业.系部代码=系部.系部代码and 专业.专业代码=学生信息.专业代码\

str4 = \学生信息.班级=\ str = str1 & str2 & str3 & str4 End If

Form5.Text = Form5.Text & \ Form5.Show() End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

End '退出 End Sub

End Class '自动生成的代码,其它代码需要手动输入

3.“查询结果”窗体(Form5)代码

Imports System.Data

Imports System.Data.OleDb

Public Class Form5 '自动生成的代码,其它代码需要手动输入

Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load objConn.Open()

Dim objAdap As New OleDbDataAdapter(str, objConn) objConn.Close()

End Select Next i

txtReCode.Text = Recode ' 显示加密后的字符串 End Sub

答案:

【Mid(strInput, i, 1)】 【iAsc = iAsc - 26】 【Code + c】 【Asc(c) - 5】 【iAsc + 26】

2. 函数FindSub用来判断字符串S中是否包含子串SubS。

TextBox1存放子串,TextBox2输入字符串,以回车键结束输入,调用函数FindSub,如果TextBox2包含子串,则在列表框上输出该字符串;如果不包含指定子串,则给出提示。

在TextBox2_KeyPress事件中,按回车键结束字符串输入,开始调用FindSub函数。在FindSub函数中,从S串中不断截取样本串的子串与SubS串比较。

下图是多次执行TextBox2_KeyPress事件后的显示效果。

Private Function FindSub(ByVal S$, ByVal SubS$) As Boolean Dim lenS%, lenSubS%, i% lenS = Len(S)

lenSubS =_____(6)_____

For i = 1 To lenS - lenSubS + 1

If Mid(S, i, lenSubS) =_____(7)_____ Then

FindSub = True ' 找到该子串 Exit Function End If Next i

FindSub =_____(8)_____ End Function

Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress

If e.KeyChar = Chr(_____(9)_____) Then ' 按了回车键 If FindSub(TextBox2.Text,_____(10)_____ ) Then ' 调用判断函数

ListBox1.Items.Add(TextBox2.Text) Else

MsgBox(\该字符串不包含指定子串!\ End If

TextBox2.Text = \ End If

End Sub

答案:

【Len(SubS)】 【SubS】 【False】 【13】

【TextBox1.Text】

DataSet对象是一个必须填充的容器,填充方法有多种:调用DataAdapter的Fill方法、手工填充、复制或合并其它DataSet的数据。我们这里介绍使用DataAdapter的Fill方法填充DataSet对象。

提示: ‘假设objconn是有效的连接对象

Dim strSql = \专业 \

Dim objAdap As New OleDbDataAdapter(strSql, objConn)

Dim objDSet As New DataSet objAdap.Fill(objDSet, str)

二、使用代码实现数据库的访问

通过ADO.NET数据控件实现数据访问的方法简单,但是却不灵活。为建立灵活性更强的应用程序,可以通过代码来创建数据对象。因此需要创建连接对象、命令对象、数据适配器对象和数据集对象。创建数据对象的代码,使用如下格式: Dim 数据对象 As New 对象类(参数)

下面通过将学生信息管理数据库中的系部表的数据操作为例,简要叙述通过代码访问数据库的过程。

(1)根据要求设计界面。通过TextBox控件显示系部代码、系部名称。

(2)导入ADO.NET名称空间

ADO.NET是围绕System.Data基本名称空间设计的,其他都是从此派生来的。例如,有Oledb前缀的数据类派生自System.Data.Oledb空间。如果在应用程序中要引用这些类,必须在窗体的代码编辑窗的开始处导入相应的名称空间。代码如下:

Imports System.Data ‘应用数据对象类

Imports System.Data.OleDb ‘引用Oledb前缀的对象类 (3)创建OledbConnection连接对象

创建一个连接学生信息管理.mdb的连接对象objconn,在窗体的Load事件过程输入代码: Dim

strconn

as

String

=

\

=

Microsoft.Jet.OLEDB.4.0; Data Source = 学生信息管理.mdb\Dim objConn As New OledbConnection(strconn) ‘创建一个数据连接

Objconn.Open() ‘打开连接 (4)创建OledDataAdapter连接对象 Dim strSql = \系部\

Dim objAdap As New OleDbDataAdapter(strSql, objConn) (5)创建数据集对象 Dim objDSet As New DataSet objAdap.Fill(objDSet, \系部\(6)实现数据绑定

简单绑定需要通过控件的DataBindings属性来实现。使用DataBindings的Add方法为控件创建一个绑定,语法如下: 控件对象. DataBindings.Add(New Binding(“控件属性”,数据集,“字段名”))

例如 TextBox1要绑定到objDset的系部表的“系部代码”,代码如下:

TextBox1.DataBindings.Add(New Binding(\objDSet, \系部.系部代码\

为实现对数据记录的浏览,可以定义一个BindingManagemerBase对象MyBind,声明绑定管理,然后通过Position属性实现记录的浏览。

提示:声明绑定管理Dim mybind As BindingManagerBase,将绑定管理赋予MyBind:mybind = Me.BindingContext(objDSet, str) 对数据记录的浏览简化为:

mybind.Position = 0 ‘首记录 mybind.Position -= 1 ‘上一条 mybind.Position += 1 ‘下一条

mybind.Position = mybind.Count – 1 ‘末记录

(7)数据的插入

通过重新SQL语句的Insert命令,创建命令对象,命令对象的ExecuteNonQuery方法是针对当前连接,执行SQL语句,并返回受影响的行。例如:

? Dim strin As String = \系部代码,系部名称)\

Values ('\? '创建命令对象objCmd()

? Dim objCmd As New OleDbCommand(strin, objConn) ? objCmd.ExecuteNonQuery() ? '增加记录后重新填充数据集()

? Dim strSql = \系部\

? objAdap.SelectCommand = New OleDbCommand(strSql, objConn) ? objDSet.Clear()

? objAdap.Fill(objDSet, str)

? MsgBox(\添加成功\

(8)数据的更新

如同数据的插入操作基本类似,通过SQL语句的Update命令,创建命令对象,使用ExecuteNonQuery方法,完成数据的更新。 (9)数据删除

通过数据集objDset的Tables属性和Rows属性,利用Delete方法实现数据的删除。例如:

? objDSet.Tables(\系部\? objDSet.Tables(\系部\? MsgBox(\删除成功\

也可以这样理解,从DataTable对象中删除DataRow对象,使用Delete方法实现数据记录的删除。例如:

? ? ? ? ?

DataTable mytable=objDset.Tables[\系部\mytable.Rows[mybind.Position].Delete(); objAdap.Update(objDset); objDset.AcceptChanges(); MsgBox(\删除成功\

三、结构化查询语言

SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。

(1)Select查询语句

在众多的SQL命令中,select语句应该算是使用最频繁的。select语句主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。Select语句的语法格式如下:

select column1 [, column2,etc] from tablename [where condition]; ([] 表示可选项)

select语句中位于select关键词之后的列名用来决定那些列将作为查询结果返回。用户可以按照自己的需要选择任意列,还可以使用通配符“*”来设定返回表格中的所有列。

select语句中位于from关键词之后的表格名称用来决定将要进行查询操作的目标表格。

Select语句中的where可选从句用来规定哪些数据值或哪些行将被作为查询结果返回或显示。

在where条件从句中可以使用以下一些运算符来设定查询标准: = 等于 > 大于 < 小于 >= 大于等于 <= 小于等于 <> 不等于

除了上面所提到的运算符外,LIKE运算符在where条件从句中也非常重要。LIKE运算符的功能非常强大,通过使用LIKE运算符可以设定只选择与用户规定格式相同的记录。此外,我们还可以使用通配符“%”用来代替任何字符串。举例如下:

select firstname, lastname, city from employee where firstname LIKE ‘E%’; (注意,字符串必须被包含在单引号内)

上述SQL语句将会查询所有名称以E开头的姓名。或者,通过如下语句:

select * from employee where firstname = ‘May’; 查询所有名称为May的行。

(2)Insert插入语句

SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语句的使用格式如下:

insert into tablename (first_column,...last_column) values (first_value,...last_value); 例如:

insert into employee (firstname, lastname, age, address, city) values (‘Li’, ‘Ming’, 45, ‘No.77 Changan Road’, ‘Beijing”);

当向数据库表格中添加新记录时,在关键词insert into后面输入所要添加的表格名称,然后在括号中列出将要添加新值的列的名称。最后,在关键词values的后面按照前面输入的列的顺序对应的输入所有要添加的记录值。 (3)Update更新语句

SQL语言使用update语句更新或软件改满足规定条件的现有记录。update语句的格式为:

update tablename

set columnname = newvalue [, nextcolumn = newvalue2...] where columnname OPERATOR value [andor column OPERATOR value];

例如:

update employee set age = age+1

where first_name= ‘Mary’and last_name= ‘Williams’; 使用update语句时,关键要设定好用于进行判断的where条件从句。

(4)Delete删除语句

SQL语言使用delete语句删除数据库表格中的行或记录。Delete语句的格式为:

delete from tablename

where columnname OPERATOR value [andor column OPERATOR value]; 例如:

delete from employee where lastname = May;

当需要删除某一行或某个记录时,在delete from关键词之后输入表格名称,然后在where从句中设定删除记录的判断条件。注意,如果用户在使用delete语句时不设定where从句,则表格中的所有记录将全部被删除。 (5)删除数据库表格

在SQL语言中使用drop table命令删除某个表格以及该表格中的所有记录。drop table命令的使用格式为: drop table tablename; 例如:

drop table employee;

如果用户希望将某个数据库表格完全删除,只需要在drop table

命令后输入希望删除的表格名称即可。drop table命令的作用与删除表格中的所有记录不同。删除表格中的全部记录之后,该表格仍然存在,而且表格中列的信息不会改变。而使用drop table命令则会将整个数据库表格的所有信息全部删除。

SQL语言的功能不仅仅如此,它还有很多功能,能够完成更高级、更深入复杂的任务。例如,创建并使用存储过程,触发器等。

SQL语言在不同的数据库系统中,其功能、语法结构等不完全相同,都有别于标准SQL,一般都对标准SQL语言做一定的扩充。上述介绍的内容在大部分关系数据库系统中都可以实现。

如今,SQL语言已经发展成为开发关系数据库的事实上的标准语言,并且随着客户/服务器开发工具出现以及一些大型数据库系统的广泛应用。大多数数据库应用程序的开发都要求具有SQL语言的知识。

实践活动

设计一个学生信息的简单维护系统,数据库为“学生信息管理.mdb”,结构见表9-1-4,界面设计如图9-2-9所示,运行界面如图9-2-10所示。

图 9-2-9 简单维护系统的设计界面

图 9-2-10 简单维护系统的运行界面

具体要求如下:

1.使用ADO.NET对象访问数据库,要求用代码实现与数据库“学生信息管理.mdb”的连接;

2.设置DataGridView1绑定到“学生信息”表,并显示学生信息,并使DataGridView1不能添加、不能删除、不能更新;

3.组合框ComboBox1用于选择,使其列表内容为各专业代码; 4.框架GroupBox1的文本框用于显示或编辑记录,开始运行时,框架中的所有文本框不能编辑;如图9-2-10所示。

5.运行时,当从ComboBox1中选择某专业后,在DataGridView1中显示相应的内容,同时,在各文本框中显示当前记录各字段的内容。

6. 当单击“新增”按钮,按钮文本改为“确认”,允许在文本框中输入一条新的记录,并再次单击“确认”按钮后,插入一条新的记录,并将文本框的内容设为只读状态。

7. 当单击“删除”按钮,删除当前记录。

8. 当单击“更新”按钮,允许在文本框中修改当前记录信息。 9. 当单击“关闭”按钮,结束程序运行。

提示:本活动没有进行任何错误处理,不考虑输入信息的校验和数据信息的冲突,在实际应用中可添加容错功能,使程序更加完善。

一、 选择题 一、单选题 1.数据库绑定列表框ListBox和下拉列表框ComboBox控件中的列表数据通过属性________从数据集中取得。

A. DataSource和DataField B. DataSource和DisplayMember C. BoundColumn和BoundText D. RowSource和ListField 答案:B

2.下列________组关键字是Select语句中不可缺少的。 A. Select、From B. Select、Where C. From、Order By D. Select、All 答案:A

3. 下列所显示的字符串中,字符串________不包含在连接对象的ConnectionString属性内。

A. Microsoft.Jet.OLEDB.4.0 B. DataSource=C:\\Mydb.mdb C. Password=” ” D.2-adCmdTable 答案:D

4. VB.NET集成开发环境有浮动和固定两类窗口,_________ 窗口是浮动窗口。 A. 解决方案资源管理器 B. 属性和代码 C. 代码窗口

D. 窗体设计窗口 答案:A

5. 在面向对象程序设计中,以下叙述正确的是_________。 A.类是对象的实例化

B. 一个类中不能定义构造函数

C. VB.NET不具备面向对象程序设计语言\封装性、继承性和多态性\的三大特征 D. 在VB.NET中,用户不仅可以使用大量预定义的类,而且还可以自定义类 答案:D

6.在下面关于VB.NET的有关说法中,错误的是_________。 A. VB.NET具备面向对象程序设计语言的所有特征

B. 在VB.NET中,用户不仅可以使用大量预定义的类,而且还可以自定义类 C. 从4.0版本开始,VB具有封装性、继承性和多态性

D. 现代程序设计 语言向面向对象编程靠拢是因为面向对象编程具备代码维护方便、可拓展性好和支持代码重用等优点 答案:C

7. 下列条件中不能判断 x 是否为奇数的是_________。

A. x/2<>Int(x/2) B. x mod 2=1 C. x\\2*2<>x D. x\\2=1 答案:D

8. 在VB.NET中,若希望调用过程Proc后返回一个结果,则过程Proc的首部应为__________。

A. Sub Proc(ByVal n%,ByRef m%) B. Sub Proc(ByRef n%, ByRef m%) C. Sub Proc( n%, m%)

D. Sub Proc(ByVal n%,ByVal m%) 答案:A

9.在下列关于构造函数的说法中,错误的是 _________ 。 A.构造函数实质上是名称为New的Sub过程 B.一个类中可以有多个构造函数

C.构造函数在对象实例化时由系统自动调用,程序不能直接调用 D.用户在定义类时必须在其中定义构造函数 答案:D

10. 循环语句 For i% = 4 To -4 Step -2 的执行次数是__________。 A. 5 B. 6 C. 4 D. 7 答案:C

11. 在下面关于随机文件的描述中,不正确的是_________。 A. 每条记录的长度必须相同 B. 一个文件中记录号不必唯一

C. 可通过编程对文件中的某条记录方便地修改 D. 文件的组织结构比顺序文件复杂 答案:B

12.循环语句 X=0

For i% = 8 To 0 Step -2

X=X+ i

执行后X的值是__________。 A. 20

B. 22 C. 18 D. 16 答案:A

13. 若要清除组合框的所有选项,可以使用_________。

A .ComboBox1.items.RemoveItem B . ComboBox1. items.Clear C .ComboBox1.items.RemoveItem All D . ComboBox1.items.Cls 答案:B

14.假定有一个菜单项,名为MenuItem1,为了在运行时使该菜单项失效(变灰),应使用的语句为___________。

A.MenuItem1.Visible = True B.MenuItem1.Visible = False C.MenuItem1.Enabled = True D.MenuItem1.Enabled = False 答案:D

15. 若要从磁盘上读一个文件名为“c:\\T1.txt”的顺序文件,则应使用下列__________程序段打开文件。 A. Dim F as String F=”c:\\T1.txt”

FileOpen(1,F,OpenMode.Input)

B. Dim F as String F=”c:\\T1.txt”

FileOpen(1,“F”,OpenMode.Input)

C. FileOpen(1, ”c:\\T1.txt”,OpenMode.Output) D. FileOpen(1, c:\\T1.txt,OpenMode.Input)

答案:A

二、填空题

1.面向对象程序设计具有封装性、__________和多态性。 答案:继承性

2.文件根据组织、存取形式可分为顺序文件、__________和二进制文件。 答案:随机

3. 常量是在程序运行中不变的量,VB.NET中有三种常量:直接常量 、符号常量__________。 答案:系统常量

4.在基本情况表中查询专业为“物理”系所有学生的查询语句为___________。 答案:select * from 基本情况 where 专业=’物理’

5.在用通用对话框控件建立的\打开\文件对话框中,如果文件过滤框要显示\文本文件(.txt)\,指定的文件类型是文本文件(即.txt文件),则应使用语句: OpenFileDialog1. ___________ = \答案:filename

6. 在VB.NET的应用程序中访问数据库的过程中,使用__________对数据库发出SQL命令,告诉数据完成某种操作。 答案:命令对象(Command)

7. 设a=2,b=3,c=4,d=5,下列表达式的值是 。

3>2*b OR a=c AND b<>c OR c>d。 答案:False

8. 对于正在使用的数组A,要再增加一个单元,但要保留原数组各元素的值,则应使用:

ReDim ______________语句。

答案:Preserve A( Ubound ( A ) + 1 )

9. 在VB.NET的应用程序中访问数据库的过程中,首先使用__________完成与数据库的连接。

答案:连接对象(Connection)

10. 是在声明时未给出数组的大小。而在程序执行时分配存储空间。 答案:动态数组

三、程序填空题

1. 加密和解密程序。即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。

运行界面如图所示。

程序的思想是每个字符加5后加密,如果加5后超出26个字母,如“z”加5加密后超出范围,即再减去26.加密后为“e”。

Private Sub btnCode_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles

btnCode.Click ' 加密按钮

Dim strInput, Code As String, c As Char Dim i%, length%, iAsc% strInput = txtInput.Text

length = Len(Trim(strInput)) ' 去掉字符串左右边的空格,求真正的长度 Code = \ For i = 1 To length

c = ____(1)_____ ' 取第i个字符 Select Case c

Case \ ' 大写字母加序数5加密 iAsc = Asc(c) + 5

If iAsc > Asc(\____(2)_____ ' 加密后字母超过Z Code = Code + Chr(iAsc) Case \

iAsc = Asc(c) + 5 ' 小写字母加序数5加密 If iAsc > Asc(\ Code = Code + Chr(iAsc)

Case Else ' 当第i个字符为其他字符时不加密 Code = ____(3)_____ End Select Next i

txtCode.Text = Code ' 显示加密后的字符串 End Sub

Private Sub btnRecode_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRecode.Click ' 解密按钮

Dim strInput, Code, Recode As String, c As Char Dim i%, length%, iAsc% strInput = txtCode.Text

length = Len(Trim(strInput)) ' 去掉字符串左右边的空格,求真正的长度 Recode = \ For i = 1 To length

c = Mid(strInput, i, 1) ' 取第i个字符 Select Case c

Case \ ' 大写字母减序数5解密 iAsc = ____(4)_____

If iAsc < Asc(\____(5)_____ ' 解密后字母小于A Recode = Recode + Chr(iAsc) Case \

iAsc = Asc(c) - 5 ' 小写字母减序数5解密 If iAsc < Asc(\ Recode = Recode + Chr(iAsc)

Case Else ' 当第i个字符为其他字符时不加密 Recode = Recode + c

TextBox7.DataBindings.Add(New Binding(\家庭住址\

mybind = Me.BindingContext(objDSet, str) End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click mybind.Position = 0 End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click mybind.Position -= 1 End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click mybind.Position += 1 End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click mybind.Position = mybind.Count - 1 End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click If Button5.Text = \确认\

objConn.Open() ' 打开连接对象 '定义SQL插入语句的字符串()

Dim strin As String = \专业代码,班级,学号,姓名,性别,出生日期,家庭住址)\& \Values ('\& TextBox1.Text & \& TextBox2.Text & \TextBox6.Text & \

Dim objCmd As New OleDbCommand(strin, objConn) '创建命令对象objCmd() objCmd.ExecuteNonQuery() '关闭连接() objConn.Close()

'增加记录后重新填充数据集()

Dim strSql = \

objAdap.SelectCommand = New OleDbCommand(strSql, objConn) objDSet.Clear()

objAdap.Fill(objDSet, str) MsgBox(\添加成功\ '恢复按钮提示()

Button5.Text = \新增\ Else

TextBox1.Text = \清空文本框

TextBox2.Text = \: TextBox3.Text = \: TextBox4.Text = \: TextBox5.Text = \

TextBox6.Text = \ Button5.Text = \确认\改变按钮提示 End If End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click '删除

objDSet.Tables(str).Rows(mybind.Position).Delete() objDSet.Tables(str).AcceptChanges() MsgBox(\删除成功\ End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click objConn.Open()

Dim strupd As String = \\& str & \Set 专业代码 ='\& TextBox1.Text & \班级 ='\学号 ='\姓名 ='\TextBox4.Text & \性别 ='\& TextBox5.Text & \出生日期 =#\& TextBox6.Text & \家庭住址 ='\学号='\ Dim objcmd As New OleDbCommand(strupd, objConn) objcmd.ExecuteNonQuery() objConn.Close() MsgBox(\更新成功\ End Sub

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click Me.Close() End Sub End Class

拓展:本活动没有进行任何错误处理,不考虑数据信息的索引冲突,在实际应用中添加容错功能,使程序更加完善。

学习支持

一、 使用ADO访问数据库

ADO.NET(Active X Data Object)对象模型是美国微软公司推出的.NET平台中的一种数据访问技术,逐步替代了 DAO和RDO而成为主要的数据访问接口。ADO.NET类库中提供了用于数据连接、处理数据操作的类。System.Data名称空间可以通过数据提供者(provider)与数据库通信,ADO.NET对象允许通过组件连接到数据库,在数据库中进行检索、编辑、删除和插入数据,并在程序中处理数据。ADO.NET支持已连接环境和非连接环境的数据访问。

提示:在本活动中学生信息管理.mdb数据库属于OLEDB数据库提供程序时候,因此必须声明命名空间,即

Imports System.Data

Imports System.Data.OleDb

1.ADO.NET组件

ADO.NET有两个重要的组成部分——DataSet对象和.NET数据提供者。DataSet对象用于以表格形式在程序中放置一组数据,它不关心数据的来源。数据提供者包含许多针对数据源的组件,设计者通过这些组件可以使程序与指定的数据源进行连接。.NET数据提供者主要包括Connection对象、Command对象、DataReader对象以及DataAdapter对象。如图9-2-8所示。

图 9-2-8 ADO.NET结构图(来自微软MSDN) 2. .NET Framework数据提供程序

包括四种数据提供程序。本活动以Access数据库为案例,属于OLE DB .NET Framework数据提供程序。不同的数据提供程序在访问数据时操作基本相似,存在细微差别。

? SQL Server .NET Framework数据提供程序。 ? OLE DB .NET Framework数据提供程序 ? ODBC .NET Framework数据提供程序 ? Oracle .NET Framework数据提供程序 3. .NET Data Provider核心类

.NET Framework数据提供程序包括四个核心类,如图9-2-8所示,用于实现对数据库的数据处理。

(1) Connection对象

数据应用程序和数据库进行交互是在建立数据库连接的基础上,Connection对象成为连接对象,提供了对数据存储中正在运行的事务

(Transaction)的访问技术。

提示: Dim strConn As String = \Source = 学生信息管理.mdb\

Dim objConn As New OleDbConnection(strConn) Objconn.Open()

(2) Command对象

Command对象用于执行数据库的命令操作,命令操作包括检索、插入、删除以及更新操作。

(3)DataAdapter对象

该对象包含有SelectCommand、InsertCommand、UpdateCommand和DeleteCommand四个属性,用来定义处理数据存储中数据的命令,并且每个命令都是对Command对象的一个引用,可以共享同一个数据源。常用Fill方法:该方法用来执行SelectCommand,用数据源的数据填充DataSet对象。

(4)DataSet对象

DataSet对象用于实现通过DataAdapter数据提供程序控件和数据库相连接,然后通过相关控件和数据库应用程序连接。DataSet的结构与关系数据库的结构相似,它包括表集合(Tables)和描述表之间关系的关系集合。

? DataSet对象的创建

DataSet对象的创建可以通过工具栏中的控件实现,DataSet对象可通过DataAdapter对象属性窗口下方的“生成数据集”超级链接来建立,或者单击DataAdapter对象,在下拉表中选择“生成数据集”。

? 填充DataSet对象

本文来源:https://www.bwwdw.com/article/5ft2.html

Top