资源预览内容
第1页 / 共104页
第2页 / 共104页
第3页 / 共104页
第4页 / 共104页
第5页 / 共104页
第6页 / 共104页
第7页 / 共104页
第8页 / 共104页
第9页 / 共104页
第10页 / 共104页
亲,该文档总共104页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第1页,共页,共103页页第8章 数据库应用开发8.1 8.1 数据库概述数据库概述数据库是指以一定的组织形式存放在计算机存储介质上的数据库是指以一定的组织形式存放在计算机存储介质上的相互关联的数据的集合。例如,把一个学校的教师、学生相互关联的数据的集合。例如,把一个学校的教师、学生和课程等数据有序地组织起来,存储在计算机磁盘上,就和课程等数据有序地组织起来,存储在计算机磁盘上,就构成了一个数据库。数据库概念提出后,先后出现了几种构成了一个数据库。数据库概念提出后,先后出现了几种数据模型,其中关系模型具有数据结构简单灵活、易学易数据模型,其中关系模型具有数据结构简单灵活、易学易懂且有雄厚的数学基础等特点,现已成为数据库的标准。懂且有雄厚的数学基础等特点,现已成为数据库的标准。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第2页,共页,共103页页8.1.1 关系数据库模型关系数据库是以关系模型来组织的。关系模型中数据的逻辑结构是一张二维表,它由行和列组成。例如,下表是在学生信息管理系统中使用的一个Students表,用来描述学生的属性。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第3页,共页,共103页页8.1.1 关系数据库模型一个关系数据库一般由多个表组成,表与表之间一个关系数据库一般由多个表组成,表与表之间可以以不同的方式相互关联。例如,下表是在学可以以不同的方式相互关联。例如,下表是在学生信息管理系统中使用的另一个表生信息管理系统中使用的另一个表CoursesCourses,用来,用来描述课程的属性。描述课程的属性。 在这个表中,在这个表中,CourseNoCourseNo( (课程号课程号) )字段是字段是CoursesCourses表的主键,因为它是唯一的。表的主键,因为它是唯一的。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第4页,共页,共103页页8.1.1 关系数据库模型由于一名学生可以选修多门课程,而一门课程又可由多名学由于一名学生可以选修多门课程,而一门课程又可由多名学生来选修,因此生来选修,因此StudentsStudents和和CoursesCourses表之间是一种多对多的表之间是一种多对多的关系。这个关系可以用一个成绩表关系。这个关系可以用一个成绩表ScoreScore来表示,即学生所来表示,即学生所学的课程对应成绩信息,该表将学生的学号与课程号进行了学的课程对应成绩信息,该表将学生的学号与课程号进行了关联,下表显示了该表的部分记录。关联,下表显示了该表的部分记录。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第5页,共页,共103页页8.1.2 结构化查询语言(SQL) 作为用来在作为用来在DBMSDBMS中访问和操作的语言,中访问和操作的语言,SQLSQL(结构化查询语言)的语句(结构化查询语言)的语句通常分为四类:一是通常分为四类:一是DDLDDL(Data Definition LanguageData Definition Language,数据定义语言),数据定义语言)语句,用来创建、修改或删除数据库中各种对象,包括表、视图、索引语句,用来创建、修改或删除数据库中各种对象,包括表、视图、索引等;二是等;二是DMLDML(Data Manipulation LanguageData Manipulation Language,数据操作语言)语句,数据操作语言)语句,用来对已经存在的数据库进行记录的插入、删除、修改等操作;三是用来对已经存在的数据库进行记录的插入、删除、修改等操作;三是QLQL(Query LanguageQuery Language,查询语言)语句,用来按照指定的组合、条件表,查询语言)语句,用来按照指定的组合、条件表达式或排序检索已存在的数据库中数据,但不改变数据库中的数据;四达式或排序检索已存在的数据库中数据,但不改变数据库中的数据;四是是DCLDCL(Data Control LanguageData Control Language,数据控制语言)语句,用来授予或收,数据控制语言)语句,用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视等。据库进行监视等。下面简单介绍一下下面简单介绍一下SQLSQL常用的语句。常用的语句。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第6页,共页,共103页页1. SELECT1. SELECT语句语句一个典型的一个典型的SQLSQL查询可以从指定的数据库表中查询可以从指定的数据库表中“选择选择”信息,这时就需信息,这时就需要使用要使用SELECTSELECT语句来执行。它的最简单形式是:语句来执行。它的最简单形式是:SELECT * FROM SELECT * FROM tableNametableName若要从表中选择指定字段的记录,则将星号(若要从表中选择指定字段的记录,则将星号(* *)用字段列表来代替,)用字段列表来代替,多个字段之间用逗号分隔,例如:多个字段之间用逗号分隔,例如:SELECT SELECT CourseNoCourseNo, Credit, , Credit, CourseNameCourseName FROM Courses FROM Courses则执行的结果如表所示,可以看出查询的结果记录集合(简称为则执行的结果如表所示,可以看出查询的结果记录集合(简称为“结果结果集集”)中的字段顺序是由)中的字段顺序是由SELECTSELECT语句中的字段顺序来决定的。语句中的字段顺序来决定的。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第7页,共页,共103页页 WHEREWHERE子句子句 在数据表查询在数据表查询SELECTSELECT语句中,经常还需要通过设定查询的条件来获取特语句中,经常还需要通过设定查询的条件来获取特定要求的记录,这是通过定要求的记录,这是通过WHEREWHERE子句来实现的,它的一般形式如下:子句来实现的,它的一般形式如下:SELECT column1, column2,SELECT column1, column2, FROM FROM tableNametableName WHERE condition WHERE condition例如,若将例如,若将ScoreScore表中成绩表中成绩(score)(score)在在8080分以上的记录查询出来,则可有分以上的记录查询出来,则可有下列语句:下列语句:SELECT SELECT StudentNoStudentNo, Score FROM Scores WHERE Score=80, Score FROM Scores WHERE Score=80WHEREWHERE子句中的条件可以子句中的条件可以 (大于)、(大于)、=(大于等于)、(大于等于)、= =(等于)、(等于)、(不等于)和(不等于)和LIKELIKE等运算符。其中,等运算符。其中,LIKELIKE用于模糊条件的查询,它可以使用星号(用于模糊条件的查询,它可以使用星号(* *)和问号()和问号(? ?)等通配符,星)等通配符,星号(号(* *)表示可以出现)表示可以出现0 0个或多个字符,问号(个或多个字符,问号(? ?)表示该位置处只能出现)表示该位置处只能出现1 1个字符。例如:个字符。例如:SELECT * FROM Scores WHERE SELECT * FROM Scores WHERE StudentNoStudentNo LIKE LIKE 21*21*VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第8页,共页,共103页页WHERE子句子句再如:再如:SELECT * FROM Scores WHERE SELECT * FROM Scores WHERE StudentNoStudentNo LIKE LIKE 210105?210105?则将则将ScoresScores表中所有学号以表中所有学号以210105210105打头的,且学号为打头的,且学号为8 8位的记位的记录查询出来。录查询出来。需要说明的是,需要说明的是,在许多在许多DBMSDBMS中,中,LIKELIKE后面字符串中的通配符用后面字符串中的通配符用“% %”来代替来代替“* *”,用,用“_ _”来代替来代替“?”。WHEREWHERE子句中的条件还可用子句中的条件还可用ANDAND(与)、(与)、OROR(或)以及(或)以及NOTNOT(非)(非)运算符来构造复合条件查询,例如:若查询运算符来构造复合条件查询,例如:若查询ScoresScores表中成绩表中成绩(scorescore)在)在7070分到分到8080分之间的记录,则可有下列语句:分之间的记录,则可有下列语句:SELECT * FROM Scores WHERE score=70SELECT * FROM Scores WHERE score=70VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第9页,共页,共103页页 ORDER BYORDER BY子句子句在关系模型中行是没有顺序的,但是用户可能希望查询的结果按某种顺在关系模型中行是没有顺序的,但是用户可能希望查询的结果按某种顺序显示。这就需要在数据表查询序显示。这就需要在数据表查询SELECTSELECT语句中使用语句中使用ORDER BYORDER BY子句来按序子句来按序输出结果集。如下面的形式:输出结果集。如下面的形式:SELECT column1, column2,SELECT column1, column2, FROM FROM tableNametableName WHERE condition WHERE condition ORDER BY col1, col2,ORDER BY col1, col2, ASC ASC或或SELECT column1, column2,SELECT column1, column2, FROM FROM tableNametableName WHERE condition WHERE conditionORDER BY col1, col2,ORDER BY col1, col2, DESC DESC其中,其中,ASCASC表示升序(从低到高),表示升序(从低到高),DESCDESC表示降序(从高到低),当在表示降序(从高到低),当在ORDER BYORDER BY子句中没有指定子句中没有指定ASC/DESCASC/DESC时,则按默认的升序进行排列。时,则按默认的升序进行排列。例如:例如:SELECT * FROM Scores ORDER BY SELECT * FROM Scores ORDER BY StudentNo,CourseNoStudentNo,CourseNo则查询的结果集是按学生号和课程号进行升序排列。则查询的结果集是按学生号和课程号进行升序排列。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第10页,共页,共103页页 INNER JOININNER JOIN语句语句在进行多个数据表查询时,总希望将多个表的某几个字段作为结果集的内在进行多个数据表查询时,总希望将多个表的某几个字段作为结果集的内容。例如,学生信息管理系统中,常需要将学生成绩按学号、姓名、课程容。例如,学生信息管理系统中,常需要将学生成绩按学号、姓名、课程名称、成绩的记录查询出来,这时就需要对名称、成绩的记录查询出来,这时就需要对ScoreScore、StudentStudent和和CourseCourse三个三个表的数据合并成单个结果集,这种合并称为表的表的数据合并成单个结果集,这种合并称为表的“联接联接”,我们可以通过,我们可以通过在在SELECTSELECT查询中使用查询中使用INNER JOININNER JOIN(内联)操作来实现。(内联)操作来实现。INNER JOININNER JOIN的最简单形式是:的最简单形式是:SELECT column1, column2,SELECT column1, column2, FROM table1 INNER JOIN table2 FROM table1 INNER JOIN table2 ON table1.columnName = table2.columnName ON table1.columnName = table2.columnName INNER JOININNER JOIN将将table1table1和和table2table2表进行内联,其联接的条件由表进行内联,其联接的条件由ONON子句来设定。子句来设定。通过通过ONON子句来指定这两个表中的哪些列进行比较,从而确定最终需要合并子句来指定这两个表中的哪些列进行比较,从而确定最终需要合并的记录。例如:的记录。例如:SELECT SELECT Scores.StudentNo,Scores.CourseNo,Courses.CourseNameScores.StudentNo,Scores.CourseNo,Courses.CourseName, , Scores.ScoreScores.Score FROM Scores INNER JOIN Courses ON FROM Scores INNER JOIN Courses ON Scores.CourseNoScores.CourseNo = = Courses.CourseNoCourses.CourseNo ORDER BY ORDER BY StudentNoStudentNo, , CourseNoCourseNoVC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第11页,共页,共103页页8.1.2 结构化查询语言(SQL)2. INSERT2. INSERT语句语句INSERTINSERT语句是用来向表中插入一个新的记录。该语句的常用形式是:语句是用来向表中插入一个新的记录。该语句的常用形式是:INSERT INTO tableName(col1, col2, col3,INSERT INTO tableName(col1, col2, col3, , colNcolN) ) VALUES (val1,val2,val3,VALUES (val1,val2,val3,valNvalN) )例如:例如:INSERT INTO INSERT INTO Students(StudentNoStudents(StudentNo, , StudentNameStudentName) VALUES ) VALUES (21010503, (21010503, 张小峰张小峰)将在将在StudentStudent中插入一个新行,其中中插入一个新行,其中StudentNoStudentNo(学号)为(学号)为“2101050321010503”,StudentNameStudentName(学生姓名)为(学生姓名)为“张小峰张小峰”,对于该记录的其它字段值由,对于该记录的其它字段值由于未指定值,其结果由系统决定。于未指定值,其结果由系统决定。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第12页,共页,共103页页8.1.2 结构化查询语言(SQL)3. UPDATE3. UPDATE语句语句UPDATEUPDATE语句用于更新表中的数据。该语句的常用形式是:语句用于更新表中的数据。该语句的常用形式是:UPDATE UPDATE tableNametableName SET column1=value1, column2=value2, SET column1=value1, column2=value2, , columnNcolumnN= =valueNvalueN WHERE condition WHERE condition例如:例如:UPDATE Students SET UPDATE Students SET StudentNameStudentName = = 王鹏王鹏 WHERE WHERE StudentNoStudentNo = = 2101050321010503将学号为将学号为“2101050321010503”的记录中的的记录中的StudentNameStudentName字段内容更新为字段内容更新为“王鹏王鹏”。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第13页,共页,共103页页8.1.2 结构化查询语言(SQL)4. DELETE4. DELETE语句语句DELETEDELETE语句用来从表中删除记录,其常用形式如下:语句用来从表中删除记录,其常用形式如下:DELETE FROM DELETE FROM tableNametableName WHERE condition WHERE condition该语句可删除该语句可删除tableNametableName表中一行或多行记录,这取决于表中一行或多行记录,这取决于WHEREWHERE后面的条件。例如:后面的条件。例如:DELETE FORM Students WHERE DELETE FORM Students WHERE StudentNoStudentNo LIKE 210105* LIKE 210105*则将则将StudentStudent表中所有以表中所有以210105210105开头的学号的记录删除。开头的学号的记录删除。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第14页,共页,共103页页 8.2 ADO.NET概述8.2.1 ADO.NET8.2.1 ADO.NET基本概念与特点基本概念与特点在在.NET.NET中数据库的访问是通过中数据库的访问是通过ADO.NETADO.NET完成的。完成的。ADO.NETADO.NET是微软公司是微软公司ADOADO(Active Data ObjectActive Data Object)技术的升级版本。)技术的升级版本。ADO.NETADO.NET是为基于消息的是为基于消息的WebWeb应用程序而设计的,同时也能为其他应用程应用程序而设计的,同时也能为其他应用程序结构提供良好的功能。以前序结构提供良好的功能。以前ADOADO操作主要依赖于两层结构并且是基于连操作主要依赖于两层结构并且是基于连接的,连接断开后就只能通过重新新建连接才能实现存取,而在接的,连接断开后就只能通过重新新建连接才能实现存取,而在ADO.NETADO.NET中,数据处理被延伸到三层以上的结构,程序员也需要采用无连接应用中,数据处理被延伸到三层以上的结构,程序员也需要采用无连接应用模型。通过支持对数据的松耦合访问,模型。通过支持对数据的松耦合访问,ADO.NETADO.NET减少了与数据库的活动连减少了与数据库的活动连接数目(即减少了多个用户争用数据库服务器上的有限资源的可能性),接数目(即减少了多个用户争用数据库服务器上的有限资源的可能性),从而实现了最大限度的数据共享。从而实现了最大限度的数据共享。下面就介绍一下下面就介绍一下ADO.NETADO.NET的主要特点:的主要特点: VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第15页,共页,共103页页8.2.1 ADO.NET基本概念与特点1. ADO.NET1. ADO.NET不依赖于连续的活动连接不依赖于连续的活动连接2. 2. 使用数据命令执行数据库交互使用数据命令执行数据库交互在在ADO.NETADO.NET中使用数据命令封装了中使用数据命令封装了SQLSQL语句或存储过程。例如,我们想要语句或存储过程。例如,我们想要从数据库读取一组行,则创建一个数据命令并用从数据库读取一组行,则创建一个数据命令并用SQLSQL的的SELECTSELECT语句的文本,语句的文本,或获取记录的存储过程名称来配置它。或获取记录的存储过程名称来配置它。在进行数据库交互时一般按以下顺序操作:在进行数据库交互时一般按以下顺序操作:(1 1)打开一个连接;)打开一个连接;(2 2)执行该命令引用的)执行该命令引用的SQLSQL语句或存储过程;语句或存储过程;(3 3)关闭连接。)关闭连接。连接保持打开的时间仅足够执行语句或存储过程。连接保持打开的时间仅足够执行语句或存储过程。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第16页,共页,共103页页3. 3. 使用数据集缓存数据使用数据集缓存数据数据集是从数据源检索的记录的缓存,它的工作方式如同虚拟的数据存数据集是从数据源检索的记录的缓存,它的工作方式如同虚拟的数据存储区:数据集包含一个或多个表(这些表可能来自实际数据库中的表),储区:数据集包含一个或多个表(这些表可能来自实际数据库中的表),并且它可以包含有关这些表之间的关系和对表可包含数据的约束的信息。并且它可以包含有关这些表之间的关系和对表可包含数据的约束的信息。4. 4. 数据集独立于数据源数据集独立于数据源尽管数据集是作为从数据库获取的数据的缓存,但数据集与数据库之间尽管数据集是作为从数据库获取的数据的缓存,但数据集与数据库之间没有任何实际关系。数据集是容器,它由从数据适配器执行的没有任何实际关系。数据集是容器,它由从数据适配器执行的SQLSQL命令或命令或存储过程填充。存储过程填充。5. 5. 数据保持为数据保持为XMLXMLVC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第17页,共页,共103页页8.2.1 ADO.NET基本概念与特点6. 6. 通过架构定义数据结构通过架构定义数据结构尽管我们不必知道有关尽管我们不必知道有关XMLXML的任何事情便可以读写数据库和使用数据集,的任何事情便可以读写数据库和使用数据集,但也有一些情况下我们需要直接与但也有一些情况下我们需要直接与XMLXML打交道,比如不打算访问数据而要打交道,比如不打算访问数据而要进行数据设计时,即需要在进行数据设计时,即需要在ADO.NETADO.NET中使用元数据时,将直接使用中使用元数据时,将直接使用XMLXML。 ADO.NETADO.NET数据集以数据集以XMLXML表示,使用基于表示,使用基于XMLXML架构定义语言(架构定义语言(XSDXSD)的)的XMLXML架构架构来定义数据集的结构(如在数据集中有哪些表、列、数据类型、约束等来定义数据集的结构(如在数据集中有哪些表、列、数据类型、约束等的定义)。就象数据集包含的数据可以从的定义)。就象数据集包含的数据可以从XMLXML加载和序列化为加载和序列化为XMLXML一样,一样,数据集的结构也可以从数据集的结构也可以从XMLXML架构加载和序列化为架构加载和序列化为XMLXML。对于大部分对于大部分ADO.NETADO.NET中的数据操作,中的数据操作,Visual Studio.NETVisual Studio.NET工具提供了可视工具提供了可视化的设计器来完成,并能根据需要生成和更新架构。化的设计器来完成,并能根据需要生成和更新架构。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第18页,共页,共103页页8.2.2 ADO.NET与ADO的比较对于已经使用过对于已经使用过ADOADO技术开发数据库的读者来说,应该了解技术开发数据库的读者来说,应该了解ADO.NETADO.NET与与ADOADO的不同之处。的不同之处。1. 1. 数据的内存中表示形式数据的内存中表示形式2. 2. 将打开连接的时间降至最低将打开连接的时间降至最低3. 3. 在应用程序间共享数据在应用程序间共享数据VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第19页,共页,共103页页8.2.3 ADO.NET对象模型的结构下图展示了下图展示了ADO.NETADO.NET对象模型中的主要对象。当然,实际上的对象模型中的主要对象。当然,实际上的ADO.NETADO.NET类类库是很复杂的,但我们现在需要了解的是库是很复杂的,但我们现在需要了解的是ADO.NETADO.NET对象模型中有哪些主要对象模型中有哪些主要对象,以及它们之间是如何交互的。对象,以及它们之间是如何交互的。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第20页,共页,共103页页8.2.3 ADO.NET对象模型的结构ADO.NETADO.NET的对象模型由两个部分组成:数据提供程序(的对象模型由两个部分组成:数据提供程序(Data ProviderData Provider,有时也叫托管,有时也叫托管提供程序)和数据集(提供程序)和数据集(DataSetDataSet)。数据提供程序负责与物理数据源的连接,数据集)。数据提供程序负责与物理数据源的连接,数据集代表实际的数据。这两个部分都可以和数据使用程序通信,如代表实际的数据。这两个部分都可以和数据使用程序通信,如Web FormWeb Form窗体和窗体和Win Win FormForm窗体。窗体。 1. 1. 数据提供程序数据提供程序在数据提供程序当中,在数据提供程序当中,DataAdapterDataAdapter(数据适配器)是功能最复杂的对象,它是(数据适配器)是功能最复杂的对象,它是ConnectionConnection对象和数据集之间的桥梁。对象和数据集之间的桥梁。DataAdapterDataAdapter对象管理了对象管理了4 4个个CommandCommand对象来处对象来处理后端数据集和数据源的通信。数据适配器的理后端数据集和数据源的通信。数据适配器的4 4个命令对象是个命令对象是SelectCommandSelectCommand、UpdateCommandUpdateCommand、InsertCommandInsertCommand和和DeleteCommandDeleteCommand。数据适配器用。数据适配器用SelectCommandSelectCommand对象对象来填充数据集,其他来填充数据集,其他3 3个对象在需要时用来插入、删除或改变数据源中的数据。个对象在需要时用来插入、删除或改变数据源中的数据。ADO.NETADO.NET的的ConnectionConnection对象和对象和CommandCommand对象与它们在对象与它们在ADOADO中的功能大致相同(主要的区中的功能大致相同(主要的区别在于缺少对服务器端游标的支持),而别在于缺少对服务器端游标的支持),而DataReaderDataReader在在ADOADO中的对应功能像一个单向中的对应功能像一个单向流水游标。在流水游标。在ADOADO中没有与数据适配器和数据集对应的功能。中没有与数据适配器和数据集对应的功能。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第21页,共页,共103页页8.2.3 ADO.NET对象模型的结构2. 2. 数据集数据集数据集(数据集(DataSetDataSet)是记录在内存中的数据,它的结构如图所示。)是记录在内存中的数据,它的结构如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第22页,共页,共103页页8.2.4 ADO.NET数据库开发方式1.1.了解了解ADO.NETADO.NET数据库开发数据库开发( (四种类型的数据提供器)四种类型的数据提供器)ADO.NETADO.NET在在WindowsWindows平台下主要有平台下主要有4 4种数据库访问方式:种数据库访问方式:OLEDBOLEDB模式、模式、ODBCODBC模式、模式、SQLClientSQLClient模式和模式和OracleOracle数据库模式,每一种模式都有前述数据库模式,每一种模式都有前述ADO.NETADO.NET对象模型的一种对象模型的一种实现。实现。 OLEDBOLEDB模式模式OLEDBOLEDB模式主要用于访问模式主要用于访问OLEDBOLEDB所支持的数据库。所支持的数据库。在使用在使用OLEDBOLEDB模式时需要引入的命名空间有模式时需要引入的命名空间有System.DataSystem.Data和和System.Data.OleDbSystem.Data.OleDb,对,对应于应于ADO.NETADO.NET对象模型中的对象,对象模型中的对象,OLEDBOLEDB模式的对象名称分别为模式的对象名称分别为OleDbConnectionOleDbConnection对对象,象,OleDbCommandOleDbCommand对象,对象,OleDbDataAdapterOleDbDataAdapter对象和对象和OleDbDataReaderOleDbDataReader对象。对象。 ODBCODBC模式模式 SQLClientSQLClient模式模式SQLClientSQLClient模式只用于访问模式只用于访问MS SQL ServerMS SQL Server数据库,是数据库,是ADO.NETADO.NET中比较特殊的组件。中比较特殊的组件。在使用在使用SQLClientSQLClient模式时需要引入的命名空间有模式时需要引入的命名空间有System.DataSystem.Data和和System.Data.SqlClientSystem.Data.SqlClient,对应于,对应于ADO.NETADO.NET对象模型中的对象分别是对象模型中的对象分别是SqlConnectionSqlConnection对象、对象、SqlCommandSqlCommand对象、对象、SqlDataAdapterSqlDataAdapter对象和对象和SqlDataReaderSqlDataReader对象。对象。 OracleOracle模式模式VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第23页,共页,共103页页8.2.4 ADO.NET数据库开发方式2. ADO.NET2. ADO.NET中两种基本的数据库开发方式中两种基本的数据库开发方式 利用利用CommandCommand对象和对象和DataReaderDataReader对象直接操作和显示数据可以使用数对象直接操作和显示数据可以使用数据命令据命令CommandCommand对象和数据读取器对象对象和数据读取器对象DataReaderDataReader以便与数据源直接通信。以便与数据源直接通信。使用数据命令使用数据命令CommandCommand对象和数据读取器对象对象和数据读取器对象DataReaderDataReader直接进行的数据直接进行的数据库操作包括:运行查询和存储过程、创建数据库对象、使用库操作包括:运行查询和存储过程、创建数据库对象、使用DDLDDL命令直接命令直接更新和删除更新和删除 使用使用DataAdapterDataAdapter对象和对象和DataSetDataSet对象对象如果应用程序需要访问多个源中的数据如果应用程序需要访问多个源中的数据,需要与其他应用程序相互操作,需要与其他应用程序相互操作或者可受益于保持和传输缓存结果,则使用或者可受益于保持和传输缓存结果,则使用DataAdapterDataAdapter适配器对象和数适配器对象和数据集据集DataSetDataSet是一个极好的选择。是一个极好的选择。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第24页,共页,共103页页8.3 创建连接要开发数据库应用程序,首先需要建立与数据库的连接。在要开发数据库应用程序,首先需要建立与数据库的连接。在ADO.NETADO.NET中数中数据库连接是通过据库连接是通过ConnectionConnection对象来管理的,此外事务的管理也通过对象来管理的,此外事务的管理也通过ConnectionConnection对象进行。对象进行。不同的数据库连接模式不同的数据库连接模式,其连接对象的成员大致其连接对象的成员大致相同相同,但是也有一些小的差别。,但是也有一些小的差别。8.3.1 Connection8.3.1 Connection连接字符串连接字符串ConnectionConnection对象最重要的属性是连接字符串对象最重要的属性是连接字符串ConnectionStringConnectionString,这也是,这也是ConnectionConnection对象惟一的非只读属性。对象惟一的非只读属性。ConnectionStringConnectionString是一个字符串,是一个字符串,用于提供登录数据库和指向特定数据库所需的信息。使用过用于提供登录数据库和指向特定数据库所需的信息。使用过ADOADO的程序员的程序员对连接字符串应该很熟悉了,典型的对连接字符串应该很熟悉了,典型的ConnectionStringConnectionString属性可能如下所属性可能如下所示:示:Provider=Provider=SQLOLEDB;DataSQLOLEDB;Data Source= Source=MySQLServer;InitialMySQLServer;Initial Catalog= Catalog=MyDBMyDB; ; Integrated Security=SSPIIntegrated Security=SSPIVC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第25页,共页,共103页页8.3.1 Connection连接字符串下面以下面以MS SQL ServerMS SQL Server和和MS AccessMS Access数据库为例介绍连接字符串的写法。数据库为例介绍连接字符串的写法。 与与SQL ServerSQL Server数据库的连接数据库的连接下面的连接字符串示例中的连接参数在读者的开发环境中可能是不同的,按下面的连接字符串示例中的连接参数在读者的开发环境中可能是不同的,按照要求换过来就可以了。我们假设照要求换过来就可以了。我们假设SQL ServerSQL Server数据库服务器为数据库服务器为127.0.0.1127.0.0.1(本机),要访问的数据库名为(本机),要访问的数据库名为MyDBMyDB,采用,采用WindowsWindows集成安全性认证方式。集成安全性认证方式。(1) (1) 在在SqlClientSqlClient方式下的字符串如下:方式下的字符串如下:data source=127.0.0.1;persist security info=data source=127.0.0.1;persist security info=False;initialFalse;initial catalog=Mcatalog=MyDByDB;integrated security=SSPI;integrated security=SSPI;(2) (2) OleDbOleDb方式的字符串如下:方式的字符串如下:Provider=SQLOLEDBProvider=SQLOLEDB; ;Data Data SourseSourse=127=127. .0 0. .0 0. .1 1; ; persist security persist security info=info=False;initialFalse;initial catalog= catalog=MyDB;integratedMyDB;integrated security=SSPI; security=SSPI;(3) (3) OdbcOdbc方式:方式:VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第26页,共页,共103页页8.3.1 Connection连接字符串 与与AccessAccess数据库的连接数据库的连接这里也约定该这里也约定该AccessAccess数据库是数据库是Access2000Access2000创建的,而数据库文件的路径创建的,而数据库文件的路径为为C:C:data.mdbdata.mdb。(1) (1) OleDbOleDb方式:方式:Provider=Microsoft.Jet.OLEDB.4.0;User ID=Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;DataAdmin;Data Source=Source=c:data.mdbc:data.mdb; ;(2) (2) OdbcOdbc方式:方式:Driver=Microsoft Access Driver Driver=Microsoft Access Driver (*.(*.mdb);DBQmdb);DBQ=C:=C:data.mdb;UIDdata.mdb;UID=admin;=admin;设定连接字符串时,设定连接字符串时,ConnectionConnection对象应该在非连接状态,因此如果要在对象应该在非连接状态,因此如果要在运行时通过代码来更改数据库的连接,首先应该断开已有的连接。运行时通过代码来更改数据库的连接,首先应该断开已有的连接。建立建立ConnectionConnection对象连接数据库可以通过代码方式对象连接数据库可以通过代码方式,也可以通过,也可以通过VisualStudio.NETVisualStudio.NET的的IDEIDE环境来完成。环境来完成。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第27页,共页,共103页页8.3.2 在设计时创建连接对象在在Visual Studio.NETVisual Studio.NET的的IDEIDE环境中可以很方便地建立环境中可以很方便地建立ConnectionConnection对象并对象并设置连接字符串设置连接字符串。我们假设要通过我们假设要通过OLEDBOLEDB模式连接到一个模式连接到一个AccessAccess数据库数据库C:C:data.mdbdata.mdb,在设计时建立连接的过程如下:,在设计时建立连接的过程如下: 1. 1. 打开打开“数据链接属性数据链接属性”对话框对话框在在IDEIDE环境中选择菜单环境中选择菜单“视图视图”“服务器资源管理器服务器资源管理器”或者直接或者直接按按Ctrl+Alt+SCtrl+Alt+S键激活键激活“服务器资源管理器服务器资源管理器”面板,如图面板,如图所示所示。 点击面板上方的连接到数据库工具栏按钮即可打开点击面板上方的连接到数据库工具栏按钮即可打开“数据链接属性数据链接属性”对话框。对话框。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第28页,共页,共103页页8.3.2 在设计时创建连接对象2. 2. 指定数据提供程序指定数据提供程序图图IDEIDE环境默认连接的是环境默认连接的是MS SQL MS SQL ServerServer数据库,所以数据库,所以“数据链接属性数据链接属性”对对话框打开时就处在第二的页面等待设置话框打开时就处在第二的页面等待设置SQL ServerSQL Server的连接参数,我们需的连接参数,我们需要连接的是要连接的是AccessAccess数据库,因此需要返回第一个页面选择数据库,因此需要返回第一个页面选择AccessAccess数据库数据库对应的数据提供程序:对应的数据提供程序:Microsoft Jet 4.0 OLE DB ProviderMicrosoft Jet 4.0 OLE DB Provider,如图,如图8.48.4、图、图8.58.5所示。所示。图图8.4 数据链接属性对话框数据链接属性对话框图图8.5 数据链接属性对话框:选择提供程序数据链接属性对话框:选择提供程序VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第29页,共页,共103页页8.3.2 在设计时创建连接对象3.3.设定参数设定参数选择选择“Microsoft Jet 4.0 OLE DB ProviderMicrosoft Jet 4.0 OLE DB Provider”驱动程序后点击驱动程序后点击“下一步下一步”按钮进入按钮进入“连接连接”页面设置连接参数。此时的页面设置连接参数。此时的“连接连接”页面应与页面应与“数数据链接属性据链接属性”对话框刚打开时不同,对话框刚打开时不同,在选择或输入数据库名称输入框中在选择或输入数据库名称输入框中输入输入AccessAccess数据库的名字,这里为数据库的名字,这里为“c:data.mdbc:data.mdb”,如图如图所示:所示: VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第30页,共页,共103页页3.设定参数设定参数AccessAccess数据库一般没有登录信息和其他参数需要设置,因此直接按数据库一般没有登录信息和其他参数需要设置,因此直接按“确确定定”即可生成连接。如果即可生成连接。如果AccessAccess数据库有密码保护,这就需要在数据库有密码保护,这就需要在“所有所有”页面中找到相关参数并设置了。双击参数所在的行会弹出参数输入框,页面中找到相关参数并设置了。双击参数所在的行会弹出参数输入框,输入参数值后即可,如图输入参数值后即可,如图所示所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第31页,共页,共103页页8.3.2 在设计时创建连接对象4. 4. 命名数据连接命名数据连接图图在在“数据链接属性数据链接属性”对话框中设置完毕并按对话框中设置完毕并按“确定确定”按钮后,按钮后,IDEIDE环境环境会自动在会自动在“服务器资源管理器服务器资源管理器”中增加一个数据连接条目,如图中增加一个数据连接条目,如图。在该数据连接上点右键,从弹出的快捷菜单中选择在该数据连接上点右键,从弹出的快捷菜单中选择“重命名重命名”,可以将连接改为,可以将连接改为自己需要的名称如自己需要的名称如“Access: Access: mydbmydb”。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第32页,共页,共103页页8.3.2 在设计时创建连接对象5. 5. 在窗体中使用数据连接在窗体中使用数据连接“服务器资源管理器服务器资源管理器”中的数据连接只是一个数据连接的定义,要在应用中的数据连接只是一个数据连接的定义,要在应用程序中使用该数据连接,需要建立该连接的实例。最简单的方法是直接将程序中使用该数据连接,需要建立该连接的实例。最简单的方法是直接将该数据连接从该数据连接从“服务器资源管理器服务器资源管理器”中拖放到窗体上,中拖放到窗体上,Visual Visual Studio.NETStudio.NET会自动生成该数据连接的实例并加上编号作为实例名,如果数会自动生成该数据连接的实例并加上编号作为实例名,如果数据连接是据连接是SQL ServerSQL Server提供程序,生成的数据连接实例为提供程序,生成的数据连接实例为SqlConnectionSqlConnection对对象,如果是其他象,如果是其他OLEDBOLEDB提供程序,则生成的数据连接实例为提供程序,则生成的数据连接实例为OleDbConnectionOleDbConnection对象。如图所示。对象。如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第33页,共页,共103页页5. 在窗体中使用数据连接单击生成的数据连接实例单击生成的数据连接实例(本例中为本例中为“oldDbConnection1oldDbConnection1”)即可在属性面板)即可在属性面板中修改其名称。该连接对象的实例一旦生中修改其名称。该连接对象的实例一旦生成,即可设定成为成,即可设定成为CommandCommand等对象的连接等对象的连接属性。另一种生成数据连接实例的方法是属性。另一种生成数据连接实例的方法是从从“工具箱工具箱”的的“数据数据”面板中将对应的面板中将对应的ConnectionConnection对象拖动到窗体上,然后再从对象拖动到窗体上,然后再从属性面板中的连接字符串属性中选择已定属性面板中的连接字符串属性中选择已定义好的数据连接。义好的数据连接。如图所示。如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第34页,共页,共103页页8.3.3 在运行时创建连接对象ConnectionConnection对象的构造函数有对象的构造函数有2 2个版本,没有参数的版本创建一个个版本,没有参数的版本创建一个ConnectionStringConnectionString属性为空的新连接,带参数的版本接受一个字符串作为属性为空的新连接,带参数的版本接受一个字符串作为ConnectionStringConnectionString属性的值。以下是使用带参数的构造函数的例子:属性的值。以下是使用带参数的构造函数的例子:System.Data.OleDb.OleDbConnectionSystem.Data.OleDb.OleDbConnection connconn = new = new System.Data.OleDb.OleDbConnectionSystem.Data.OleDb.OleDbConnection ( (“Provider=Microsoft.Jet.OLEDB.4.0;User ID=Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;DataAdmin;Data Source=Source=c:data.mdbc:data.mdb; ;”); ); 下面的例子是采用无参数构造函数下面的例子是采用无参数构造函数,然后修改,然后修改ConnectionStringConnectionString属性的例子:属性的例子:System.Data.OleDb.OleDbConnectionSystem.Data.OleDb.OleDbConnection connconn = new = new System.Data.OleDb.OleDbConnectionSystem.Data.OleDb.OleDbConnection( (); ); conn.ConnectionStringconn.ConnectionString= =”Provider=Microsoft.Jet.OLEDB.4.0;User Provider=Microsoft.Jet.OLEDB.4.0;User ID=ID=Admin;DataAdmin;Data Source= Source=c:data.mdbc:data.mdb; ;”; ;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第35页,共页,共103页页8.3.4 打开和关闭连接数据连接的两个主要方法是数据连接的两个主要方法是OpenOpen和和CloseClose。OpenOpen方法使用方法使用ConnectionStringConnectionString属性中的信息联系数据源并建立一个打开的连接;而属性中的信息联系数据源并建立一个打开的连接;而CloseClose方法关闭已打开的连接。方法关闭已打开的连接。如果使用数据适配器对象(如果使用数据适配器对象(DataAdapterDataAdapter)来操作数据库,则该对象的)来操作数据库,则该对象的某个方法如某个方法如FillFill或或UpdateUpdate被调用时会先检查连接是否打开,如果未打开被调用时会先检查连接是否打开,如果未打开则自动打开并执行其逻辑再关闭连接,但显式地关闭数据连接仍是一种则自动打开并执行其逻辑再关闭连接,但显式地关闭数据连接仍是一种良好的习惯,因为良好的习惯,因为FillFill等方法在连接已经打开的情况下只是使用该连接,等方法在连接已经打开的情况下只是使用该连接,使用完后也不会关闭它。使用完后也不会关闭它。为了有效地使用数据库连接,在实用的数据库应用程序中打开和关闭数为了有效地使用数据库连接,在实用的数据库应用程序中打开和关闭数据连接时一般都会使用如下技术:据连接时一般都会使用如下技术:VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第36页,共页,共103页页8.3.4 打开和关闭连接1. 1. 使用使用trytrycatchcatchfinallyfinally语句块语句块在在C#C#中使用中使用finallyfinally语句可以确保其中的语句得到执行,因此将关闭数据连接对语句可以确保其中的语句得到执行,因此将关闭数据连接对象的象的CloseClose方法放在方法放在finallyfinally语句块中是一个良好的习惯。语句块中是一个良好的习惯。例如:例如:trytryconn.Openconn.Open();();/ / 打开数据连接打开数据连接/ / 执行数据操作执行数据操作 catch( Exception ex )catch( Exception ex )/ / 错误处理错误处理 finallyfinallyconn.Closeconn.Close();();/ / 关闭数据连接关闭数据连接 在出现多个数据库连接时,在出现多个数据库连接时,trytrycatchcatchfinallyfinally语句块的层次可能会不太容易语句块的层次可能会不太容易阅读。因此还可以采用另一种技术,即阅读。因此还可以采用另一种技术,即usingusing语句块。语句块。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第37页,共页,共103页页8.3.4 打开和关闭连接2. 2. 使用使用usingusing语句块语句块在在C#C#语言中程序员已经从释放资源的工作中解脱出来,垃圾收集器替代语言中程序员已经从释放资源的工作中解脱出来,垃圾收集器替代了显式的对象清理。然而对于程序员来说,对象的析构函数的执行变得了显式的对象清理。然而对于程序员来说,对象的析构函数的执行变得不再可控,对象在什么时候被销毁是由垃圾收集器实时决定的。但是,不再可控,对象在什么时候被销毁是由垃圾收集器实时决定的。但是,对于数据库连接这样的稀缺资源来说,程序员希望在不使用时尽快关闭,对于数据库连接这样的稀缺资源来说,程序员希望在不使用时尽快关闭,在在C+C+中使用析构函数来释放资源的技术在中使用析构函数来释放资源的技术在C#C#中也一样可以使用,前提是中也一样可以使用,前提是被释放的对象实现了被释放的对象实现了IDisposableIDisposable接口,这就是接口,这就是usingusing语句块的用法,而语句块的用法,而ConnectionConnection对象正是这种对象。对象正是这种对象。usingusing语句块保证在退出语句块时实现语句块保证在退出语句块时实现IDisposableIDisposable接口的对象能立即释放,在接口的对象能立即释放,在ConnectionConnection对象的对象的DisposeDispose方法方法中会检查对象的状态,如果在打开状态则调用中会检查对象的状态,如果在打开状态则调用CloseClose方法,这就保证了资方法,这就保证了资源被及时释放。源被及时释放。由于上面介绍的两种方法都没有好的异常处理方法来替代,有时可以结由于上面介绍的两种方法都没有好的异常处理方法来替代,有时可以结合起来使用,下面的例子结合了合起来使用,下面的例子结合了trytrycatchcatchfinallyfinally和和usingusing技术确保技术确保数据连接及时关闭。数据连接及时关闭。trytrycatchcatchfinallyfinally与与usingusing的内外嵌套关系可以的内外嵌套关系可以根据需要决定。根据需要决定。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第38页,共页,共103页页2. 使用using语句块例如:例如:string string connStringconnString= = “Provider=Microsoft.Jet.OLEDB.4.0;User Provider=Microsoft.Jet.OLEDB.4.0;User ID=ID=Admin;DataAdmin;Data Source= Source=c:data.mdbc:data.mdb; ;”; ;trytryusing(OleDbConnectionusing(OleDbConnection connconn = new = new OleDbConnectionOleDbConnection ( (connStringconnString) ) )conn.Openconn.Open();();/ / 打开数据连接打开数据连接/ / 执行数据操作执行数据操作conn.Closeconn.Close();(); / / 显式关闭连接显式关闭连接/ / 其他与数据库操作无关的语句其他与数据库操作无关的语句 / / 如没有显式关闭连接,系统自动关闭连接如没有显式关闭连接,系统自动关闭连接 catch( Exception ex )catch( Exception ex )/错误处理错误处理 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第39页,共页,共103页页8.3.5 处理Connection对象的事件如果需要在连接建立时和关闭时进行某些操作,可以响应如果需要在连接建立时和关闭时进行某些操作,可以响应ConnectionConnection对对象的象的StateChangeStateChange事件。事件。StateChangeStateChange事件发生在事件发生在ConnectionConnection对象状态发对象状态发生改变后,它传递一个生改变后,它传递一个StateChangeStateChange EventArgsEventArgs对象给它的处理程序,该对象给它的处理程序,该对象有两个属性:对象有两个属性:OriginalStateOriginalState和和CurrentStateCurrentState,分别表示,分别表示ConnectionConnection对象改变前和改变后的状态,它们可取的值如表所示:对象改变前和改变后的状态,它们可取的值如表所示: VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第40页,共页,共103页页8.3.6 事务处理通常在数据库中会经常发生数据更新,为了保证数据操作的安全与一致,通常在数据库中会经常发生数据更新,为了保证数据操作的安全与一致,大型数据库服务器都支持事务处理以保证数据更新在可控制的范围内进大型数据库服务器都支持事务处理以保证数据更新在可控制的范围内进行。行。ADO.NETADO.NET通过通过ConnectionConnection对象的对象的BeginTransactionBeginTransaction方法来实现对事务方法来实现对事务处理的支持,该方法返回一个实现处理的支持,该方法返回一个实现IDbTransactionIDbTransaction接口的对象,而该对接口的对象,而该对象是在象是在System.DataSystem.Data中定义的。下面的代码片段示范了如何在中定义的。下面的代码片段示范了如何在ADO.NETADO.NET中中使用事务处理。使用事务处理。例如:例如:string string connStringconnString = = data source=127.0.0.1;initial data source=127.0.0.1;initial catalog=Mcatalog=MyDByDB;integrated security=SSPI;integrated security=SSPI;SqlConnectionSqlConnection connconn = new = new SqlConnectionSqlConnection ( (connStringconnString) ); ; SqlTransactionSqlTransaction txtx; ;trytryVC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第41页,共页,共103页页8.3.6 事务处理 conn.Openconn.Open();();/ / 打开数据连接打开数据连接 txtx= =conn.BeginTransactionconn.BeginTransaction();(); / / 执行数据操作执行数据操作 tx.Committx.Commit();();/ / 提交事务提交事务 catch( Exception ex )catch( Exception ex ) tx.Rollbacktx.Rollback();();/ / 回滚事务回滚事务 finallyfinally conn.Closeconn.Close();(); VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第42页,共页,共103页页8.4 使用Command对象与DataReader对象 建立数据连接后,应用程序与数据源之间要进行信息交换,完建立数据连接后,应用程序与数据源之间要进行信息交换,完成这种交换是通过数据命令对象成这种交换是通过数据命令对象Data CommandData Command来实现的。来实现的。 8.4.1 Command8.4.1 Command对象与对象与DataReaderDataReader对象简介对象简介CommandCommand与与DataReaderDataReader对象是操作数据库数据的最直接的方法。对象是操作数据库数据的最直接的方法。CommandCommand对象可以根据程序员所设置的对象可以根据程序员所设置的SQLSQL语句对数据库进行操语句对数据库进行操作。对需要返回结果集的作。对需要返回结果集的SQLSQL语句,语句,CommandCommand对象的对象的ExecuteReaderExecuteReader方法生成方法生成DataReaderDataReader对象,后者提供了一个只对象,后者提供了一个只读、单向的游标,从而使程序员可以以行为单位获取结果集中读、单向的游标,从而使程序员可以以行为单位获取结果集中的数据。的数据。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第43页,共页,共103页页8.4.2 使用Command对象操作数据像大多数可存在于窗体级的对象像大多数可存在于窗体级的对象样,数据命令对象也可在设计时或运行时进行创样,数据命令对象也可在设计时或运行时进行创建和配置。而建和配置。而DataReaderDataReader对象只能在运行时通过数据命令的对象只能在运行时通过数据命令的ExecuteReaderExecuteReader方法来方法来创建,而不能直接创建其实例。创建,而不能直接创建其实例。在在Visual Studio.NETVisual Studio.NET中创建中创建CommandCommand对象就像其它控件一样对象就像其它控件一样只需将只需将“工具箱工具箱”的的“数据数据”选项卡中的控件拖放到窗体上。选项卡中的控件拖放到窗体上。如果要通过代码在运行时创建如果要通过代码在运行时创建CommandCommand对象,可以使用对象,可以使用4 4个版本的构造函数,如表所个版本的构造函数,如表所示:示:原型XXXCommand()XXXCommand(string)XXXCommand(string,XXXConnection)XXXCommand(string,XXXConnection,XXXTransaction)VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第44页,共页,共103页页8.4.2 使用Command对象操作数据2. Command2. Command对象的属性对象的属性CommandTextCommandText是字符串属性,包含要执行的是字符串属性,包含要执行的SQLSQL语句或者数据源中存储过语句或者数据源中存储过程的名字;程的名字;ConnectionConnection属性指定要执行数据命令的连接对象,即指定要执行数据操属性指定要执行数据命令的连接对象,即指定要执行数据操作的数据源;作的数据源;TransactionTransaction属性指定执行数据命令登记的事务对象;属性指定执行数据命令登记的事务对象;此外此外CommandCommand对象还有以下几个属性:对象还有以下几个属性:CommandTimeoutCommandTimeout属性决定数据命令出错前等待服务器响应的时间。属性决定数据命令出错前等待服务器响应的时间。CommandTypeCommandType属性决定属性决定CommandCommand对象如何解释对象如何解释CommandTextCommandText属性的内容,默属性的内容,默认取值为认取值为TextText,即,即SQLSQL语句。语句。 ParametersParameters属性是针对属性是针对CommandTextCommandText属性所指定的属性所指定的SQLSQL语句或存储过程的语句或存储过程的参数集合。参数集合。UpdatedRowSourceUpdatedRowSource属性。属性。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第45页,共页,共103页页8.4.2 使用Command对象操作数据3. 3. 执行数据命令执行数据命令设置好设置好CommandCommand对象的对象的CommandTextCommandText为为SQLSQL语句或存储过程和名字语句或存储过程和名字(或是表(或是表名,仅被名,仅被OleDbCommandOleDbCommand支持支持)同时设置)同时设置CommandTypeCommandType属性与属性与CommandTextCommandText对应对应,并按需要设置其他参数后,就可以调用,并按需要设置其他参数后,就可以调用CommandCommand对象的相关方法来对象的相关方法来实现对数据源的操作了。实现对数据源的操作了。CommandCommand对象提供了几种方法用于执行命令,相对象提供了几种方法用于执行命令,相关方法如表所示:关方法如表所示:VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第46页,共页,共103页页8.4.2 使用Command对象操作数据【例例8.1】使用使用Command对象的对象的ExecuteNonQuery方法执行方法执行SQL语句。语句。using System;using System.Data.SqlClient;public class ExecuteNonQueryExample1public static void Main( string args )string connString = data source=127.0.0.1;+ persist security info=False;+ initial catalog=MyDB;+ integrated security=SSPI;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第47页,共页,共103页页【例8.1】string sqlString = UPDATE Students SET StudentName = 王鹏王鹏+ WHERE StudentNo = 21010503;SqlConnection conn = new SqlConnection (connString); conn.Open(); SqlCommand cmd = new SqlCommand( sqlString, conn); int rowsReturned = cmd.ExecuteNonQuery();Console.WriteLine(0 记录已更新记录已更新, rowsReturned);conn.Close(); VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第48页,共页,共103页页8.4.2 使用Command对象操作数据【例例8.2】使用使用Command对象的对象的ExecuteNonQuery方法执行存储过程方法执行存储过程。using System;using System.Data;using System.Data.SqlClient;public class ExecuteNonQueryExample2public static void Main( string args )string connString = data source=127.0.0.1;+ persist security info=False;+ initial catalog=MyDB;+ integrated security=SSPI;SqlConnection conn = new SqlConnection( connString ); conn.Open();SqlCommand cmd = new SqlCommand(PRO_INSERT_CUSTOMER, conn);cmd.CommandType = CommandType.StoredProcedure;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第49页,共页,共103页页 cmd.Parameters.Add(new SqlParameter(Customer, SqlDbType.VarChar, 50, Customer); cmd.Parameters.Add(new SqlParameter(Contact, SqlDbType.VarChar, 50, Contact); cmd.Parameters.Add(new SqlParameter(Address, SqlDbType.VarChar, 200, Address); cmd.Parameters.Add(new SqlParameter(result, SqlDbType.VarChar, 200, ParameterDirection.Output, false, 0, 0, CustomerNo, DataRowVersion.Default,null);cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第50页,共页,共103页页【例8.2】 cmd.ParametersCustomer.Value = 星光机械厂星光机械厂;cmd.ParametersContact.Value = 张三张三;cmd.ParametersAddress.Value = 长江路长江路111号号; cmd.ExecuteNonQuery();Console.WriteLine(插入的客户插入的客户ID是是: 0, cmd.Parametersresult.Value);conn.Close();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第51页,共页,共103页页【例8.2】-填入客户表填入客户表数据库存储过程如下:数据库存储过程如下:CREATE PROCEDURE PRO_INSERT_CUSTOMERCustomer varchar(50),Contactvarchar(50),Addressvarchar(200),result int OUTPUTASSELECT result = MAX(CustomerNo)+1 FROM CustomersIF result IS NULLSET result = 1INSERT INTO Customers(CustomerNo, Constomer, Contact, Address) VALUES(result, Customer, Contact, Address)GOVC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第52页,共页,共103页页8.4.2 使用Command对象操作数据【例例8.3】使用使用Command对象的对象的ExecuteScalar方法执行方法执行SQL语句。语句。using System;using System.Data.SqlClient;public class ExecuteScalarExamplepublic static void Main( string args )string connString = data source=127.0.0.1;+ persist security info=False;+ initial catalog=MyDB;+ integrated security=SSPI;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第53页,共页,共103页页【例8.3】 string sqlString = SELECT COUNT(*) FROM Students;SqlConnection conn = new SqlConnection (connString); conn.Open();SqlCommand cmd = new SqlCommand( sqlString, conn);obejct o = cmd.ExecuteScalar();Console.WriteLine(记录数为记录数为: 0, o);conn.Close();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第54页,共页,共103页页8.4.3 使用DataReader对象检索数据CommandCommand对象可以对数据源的数据进行直接地操作,但如果执行的是对象可以对数据源的数据进行直接地操作,但如果执行的是返回结果集的查询命令或存储过程,需要先对结果集的内容进行获取,返回结果集的查询命令或存储过程,需要先对结果集的内容进行获取,然后再进入加工或者是输出,这就需要然后再进入加工或者是输出,这就需要DataReaderDataReader对象来配合了。对象来配合了。DataReaderDataReader对象提供了一个只读的、单向的游标用于访问结果集的行,对象提供了一个只读的、单向的游标用于访问结果集的行,因为内存中每次仅有一个数据行,所以因为内存中每次仅有一个数据行,所以DataReaderDataReader需要的开销很少,需要的开销很少,效率很高。效率很高。DataReaderDataReader对象不能直接实例化,而是必须通过对象不能直接实例化,而是必须通过CommandCommand对象的对象的ExecuteReaderExecuteReader方法来生成。方法来生成。DataReaderDataReader使用使用ReadRead方法,将一行数据方法,将一行数据读入内存,然后可以用索引器或读入内存,然后可以用索引器或GetXXXGetXXX()方法来访问其中的字段。()方法来访问其中的字段。在在DataReaderDataReader遍历记录时,数据连接必须保持打开状态,直到遍历记录时,数据连接必须保持打开状态,直到DataReaderDataReader对象被关闭为止。对象被关闭为止。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第55页,共页,共103页页8.4.3 使用DataReader对象检索数据【例例8.4】使用使用Command对象和对象和DataReader对象获取数据对象获取数据。using System;using System.Data.SqlClient;public class ExecuteReaderExamplepublic static void Main( string args )string connString = data source=127.0.0.1;+ persist security info=False;+ initial catalog=MyDB;+ integrated security=SSPI;string sqlString = SELECT * FROM Students;SqlConnection conn = new SqlConnection (connString); VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第56页,共页,共103页页conn.Open();SqlCommand cmd = new SqlCommand( sqlString, conn);SqlDataReader rdr = cmd.ExecuteReader();while( rdr.Read() )Console.WriteLine(0, 1, 2, 3, 4, 5, rdr0, rdrStudnetName, rdrSex, rdrBirthday,rdrNative,rdrAddress );rdr.Close();conn.Close();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第57页,共页,共103页页8.5 使用DataAdapter对象与DataSet对象 8.5.1 8.5.1 用用DataSetDataSet对象管理数据对象管理数据数据集数据集DataSetDataSet可以认为是内存中的数据库。可以认为是内存中的数据库。DataSetDataSet的数据结构可以在的数据结构可以在Visual Studio .NETVisual Studio .NET环境中通过向导完成,也可环境中通过向导完成,也可以通过代码来增加表、增加表的列和约束以及增加表与表的关系。而数据以通过代码来增加表、增加表的列和约束以及增加表与表的关系。而数据集中的数据则可以来自数据源,也可以通过代码直接向表中增加数据行。集中的数据则可以来自数据源,也可以通过代码直接向表中增加数据行。从这一点上来看,从这一点上来看,DataSetDataSet类似于一个在客户机内存中的数据库,可以在这类似于一个在客户机内存中的数据库,可以在这个数据库中增加删除表,定义表结构和关系,增加删除表中的行。个数据库中增加删除表,定义表结构和关系,增加删除表中的行。DataSetDataSet类不考虑其中的表结构和数据是来自数据库、类不考虑其中的表结构和数据是来自数据库、XMLXML文件还是程序代码,前面文件还是程序代码,前面针对针对DataSetDataSet的范例均没有使用实际的数据库,而是直接生成数据集、定义的范例均没有使用实际的数据库,而是直接生成数据集、定义表结构、插入记录。表结构、插入记录。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第58页,共页,共103页页8.5.1 用DataSet对象管理数据DataSet对象的主要属性是Tables、Relations和ExtendedProperties等,如表所示: VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第59页,共页,共103页页8.5.1 用DataSet对象管理数据1 1DataSDataSetet对象的构建对象的构建通过窗体设计器可以很方便地添加通过窗体设计器可以很方便地添加DataSetDataSet组件。组件。【例例8.58.5】添加添加DataSetDataSet组件组件。(1) (1) 创建一个创建一个WindowsWindows窗体应用程序项目窗体应用程序项目Ex_9_DataSetEx_9_DataSet。(2) (2) 在工具箱中,单击在工具箱中,单击“数据数据”标签项,弹出与标签项,弹出与“数据数据”操作相关的组件。操作相关的组件。 (3) (3) 将工具箱中的将工具箱中的DataSetDataSet组件拖放到窗体上,弹出一个组件拖放到窗体上,弹出一个“添加数据集添加数据集”对话框,用来选择对话框,用来选择“类型化数据集类型化数据集”还是还是“非类型化数据集非类型化数据集”,如图所,如图所示。示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第60页,共页,共103页页1DataSet对象的构建(4) (4) 若选中若选中“类型化数据集类型化数据集”选项后,将创建已经存在于项目中的数据选项后,将创建已经存在于项目中的数据集类的一个实例(数据架构已定义);若选中集类的一个实例(数据架构已定义);若选中“非类型化数据集非类型化数据集”选选项则创建一个类型为项则创建一个类型为 System.Data.DatasetSystem.Data.Dataset的数据集,通常若以编程的数据集,通常若以编程方式定义数据集架构如添加数据表和列时,则需要选中此项。方式定义数据集架构如添加数据表和列时,则需要选中此项。(5) (5) 在本例中我们选中在本例中我们选中“非类型化数据集非类型化数据集”选项,单击选项,单击“确定确定”按钮,按钮,此时将添加此时将添加DataSetDataSet组件对象组件对象dataSet1dataSet1。(6) (6) 单击窗体模板下方的单击窗体模板下方的dataSet1dataSet1图标,将在其属性窗口中显示该图标,将在其属性窗口中显示该DataSetDataSet组件对象的全部属性,通过修改组件对象的全部属性,通过修改NameName属性可以更改该组件的属性可以更改该组件的实例名称,通过修改实例名称,通过修改DataSetNameDataSetName属性可以设置该属性可以设置该DataSetDataSet组件的名称,组件的名称,默认为默认为NewDataSetNewDataSet。当然也可以在运行时通过代码来建立数据集,直接调用数据集的构造函当然也可以在运行时通过代码来建立数据集,直接调用数据集的构造函数创建一个新的实例即可,如:数创建一个新的实例即可,如:DataSetDataSet dsds = new = new DataSetDataSet(); (); VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第61页,共页,共103页页2数据集中DataTable对象的构建8.5.1 用DataSet对象管理数据VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第62页,共页,共103页页8.5.1 用DataSet对象管理数据3. 3. 数据表的字段数据表的字段( (列列) )操作操作DataTableDataTable对象的对象的ColumnsColumns属性是一个包含数据表的列的集合,属性是一个包含数据表的列的集合,它所存储的是它所存储的是DataColumnDataColumn对象,后者封装了数据表中列的所对象,后者封装了数据表中列的所有操作,其构造函数如表所示。有操作,其构造函数如表所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第63页,共页,共103页页3. 数据表的字段(列)操作除了用程序添加数据表的列外,还可以在“表集合编辑器”窗口中通过单击Columns属性右侧的按钮,通过弹出的“列集合编辑器”窗口来添加列,如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第64页,共页,共103页页8.5.1 用DataSet对象管理数据4. 4. 数据表的记录数据表的记录( (行行) )操作操作DataTableDataTable类的类的RowsRows属性是一个包含数据行的集合,它所存储的是属性是一个包含数据行的集合,它所存储的是DataRowDataRow类对象。类对象。DataRowDataRow类封装了行的所有操作。下面分别说明。类封装了行的所有操作。下面分别说明。(1). (1). 添加记录行添加记录行当向指定表中添加记录时,可按下列步骤:当向指定表中添加记录时,可按下列步骤:使用使用DataTableDataTable对象的对象的NewRowNewRow方法来创建一个方法来创建一个DataRowDataRow对象;对象;指定指定DataRowDataRow对象中不同字段的值;对象中不同字段的值;调用调用DataTableDataTable对象对象RowsRows集合属性的集合属性的AddAdd方法添加记录行。方法添加记录行。调用调用DataTableDataTable类的类的AcceptChangesAcceptChanges方法接受该表进行的所有更改。方法接受该表进行的所有更改。(2). (2). 查找记录行查找记录行可以使用可以使用RowsRows集合的集合的FindFind方法来查找指定主键值的记录行,该方法的参数是要查方法来查找指定主键值的记录行,该方法的参数是要查找的主键值或主键值的数组。例如,下面的代码是在找的主键值或主键值的数组。例如,下面的代码是在ScoreScore表中查找学号为表中查找学号为2101010221010102记录行:记录行:DataRowDataRow findRowfindRow = dataTable1.Rows.Find(21010102); = dataTable1.Rows.Find(21010102);if ( if ( findRowfindRow != null ) / != null ) / 查找到查找到 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第65页,共页,共103页页4. 数据表的记录(行)操作(3). (3). 修改记录行修改记录行修改一个记录行的数据,可按下列步骤进行:修改一个记录行的数据,可按下列步骤进行:获取指定记录行的获取指定记录行的DataRowDataRow对象;对象;调用调用DataRowDataRow对象的对象的BeginEditBeginEdit方法进入记录行的编辑模式;方法进入记录行的编辑模式;更改该记录行的列的值;更改该记录行的列的值;调用调用DataRowDataRow对象的对象的EndEditEndEdit方法退出记录行的编辑模式;方法退出记录行的编辑模式;调用调用DataRowDataRow对象的对象的AcceptChangesAcceptChanges方法接收对该行的所有修改,或调方法接收对该行的所有修改,或调用所在用所在DataTableDataTable对象的对象的AcceptChangesAcceptChanges方法接受该表进行的所有更改。方法接受该表进行的所有更改。4. 4. 删除记录行删除记录行若删除一个记录行,则可使用若删除一个记录行,则可使用DataRowDataRow类的类的DeleteDelete方法来删除,然后调用方法来删除,然后调用DataRowDataRow类的类的AcceptChangesAcceptChanges方法;或者直接调用方法;或者直接调用RowsRows集合的集合的RemoveRemove方法。方法。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第66页,共页,共103页页8.5.2 数据绑定在在WindowsWindows窗体应用程序中,几乎每个应用程序都需要从数据源中读取信窗体应用程序中,几乎每个应用程序都需要从数据源中读取信息,而实现这一功能的通常方式是采用数据绑定。数据绑定是指将控件的息,而实现这一功能的通常方式是采用数据绑定。数据绑定是指将控件的某些属性值与数据集中的数据元素连接在一起,属性变化会反映到数据集某些属性值与数据集中的数据元素连接在一起,属性变化会反映到数据集中,反之亦然。其好处是可以大大简化数据的展示,对绑定的统一管理使中,反之亦然。其好处是可以大大简化数据的展示,对绑定的统一管理使界面元件能同步更新,实现记录向前向后浏览时自动同步更新。界面元件能同步更新,实现记录向前向后浏览时自动同步更新。数据绑定的逻辑模型如图所示。数据绑定的逻辑模型如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第67页,共页,共103页页8.5.2 数据绑定有两种类型的数据绑定:简单绑定和复杂绑定。简单数据绑定是指将一个有两种类型的数据绑定:简单绑定和复杂绑定。简单数据绑定是指将一个控件和单个数据元素(如数据表的列值)进行绑定,大多数控件和单个数据元素(如数据表的列值)进行绑定,大多数WindowsWindows窗体控窗体控件如文本框控件都具有这个能力。复杂数据绑定指将一个控件和多个数据件如文本框控件都具有这个能力。复杂数据绑定指将一个控件和多个数据元素进行绑定,具有该能力的有元素进行绑定,具有该能力的有DataGridDataGrid、ListBoxListBox和和ComboBoxComboBox等控件。等控件。对于简单绑定,编程实现时是直接指定该控件的对于简单绑定,编程实现时是直接指定该控件的DataBindingsDataBindings属性,它是属性,它是一个集合类型,存储的是一个集合类型,存储的是BindingBinding类对象。调用类对象。调用DataBindingsDataBindings集合的集合的AddAdd方方法即可加入新的绑定对象,如:法即可加入新的绑定对象,如:textBox1.DataBindings.Add(Text,dataSet1,stuents.studentno); textBox1.DataBindings.Add(Text,dataSet1,stuents.studentno); 或或Binding Binding newBingingnewBinging=new =new Binding(Text,dataSet1,stuents.studentno);Binding(Text,dataSet1,stuents.studentno);textBox1.DataBindings.Add(newBinding);textBox1.DataBindings.Add(newBinding);VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第68页,共页,共103页页8.5.2 数据绑定【例例8.68.6】使用数据绑定联结数据源和窗体控件使用数据绑定联结数据源和窗体控件。设计界面如图所示。设计界面如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第69页,共页,共103页页1. 1. 创建创建WindowsWindows窗体应用程序框架窗体应用程序框架创建一个创建一个WindowsWindows窗体应用程序项目窗体应用程序项目Ex_9_BindingEx_9_Binding。在打开的窗体设计器中,单击在打开的窗体设计器中,单击Form1Form1窗体,在开发环境的窗体属性窗体,在开发环境的窗体属性窗口中,将窗体的窗口中,将窗体的TextText(标题)属性内容(标题)属性内容“Form1”Form1”改为改为“数据绑数据绑定定”,然后调整窗体大小。,然后调整窗体大小。在工具箱中,单击在工具箱中,单击“数据数据”标签项,将标签项,将DataSetDataSet组件拖放到窗体上,组件拖放到窗体上,此时弹出一个此时弹出一个“添加数据集添加数据集”对话框,选中对话框,选中“非类型化数据集非类型化数据集”选选项,单击项,单击“确定确定”按钮,此时将添加按钮,此时将添加DataSetDataSet组件对象组件对象dataSet1dataSet1。在在dataSet1dataSet1属性窗口中,单击属性窗口中,单击TablesTables属性右侧的属性右侧的“”按钮,弹出按钮,弹出“表集合编辑器表集合编辑器”窗口,单击窗口,单击“添加添加”按钮,将按钮,将TableNameTableName属性设属性设为为StudentsStudents,如图所示。,如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第70页,共页,共103页页1. 创建Windows窗体应用程序框架在在“表集合编辑器表集合编辑器”窗口中通过单击窗口中通过单击ColumnsColumns属性右侧属性右侧的的按钮,弹出按钮,弹出“列集合编辑器列集合编辑器”窗口,按表为窗口,按表为StudentsStudents表添加列。表添加列。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第71页,共页,共103页页1. 创建Windows窗体应用程序框架单击窗体属性窗口的事件按钮,为窗体添加单击窗体属性窗口的事件按钮,为窗体添加Form1_Load事件处理事件处理方法,并添加下列代码:方法,并添加下列代码:private void Form1_Load(object sender, System.EventArgs e)DataRow row1 = dataTable1.NewRow();row1studentno = 21010101; row1studentname = 张芳张芳; row1sex = False; row1birthday = 1981-12-5;row1native = 江苏南京江苏南京;row1address = 南京农业大学南京农业大学;dataTable1.Rows.Add( row1 );DataRow row4 = dataTable1.NewRow();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第72页,共页,共103页页1. 创建Windows窗体应用程序框架 row4studentno = 21010502; row4studentname = 王涛王涛; row4sex = True; row4birthday = 1981-7-8; row4native = 江苏南京江苏南京; row4address = 南京农业大学南京农业大学; dataTable1.Rows.Add( row4 ); dataTable1.AcceptChanges();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第73页,共页,共103页页【例8.6】2. 2. 用用DataGridDataGrid绑定数据表绑定数据表打开窗体设计器,将工具箱中的打开窗体设计器,将工具箱中的WindowsWindows窗体标签页面的窗体标签页面的DataGridDataGrid控件拖放到窗体中,在其属性窗口中,将控件拖放到窗体中,在其属性窗口中,将DataSourceDataSource属性选择为属性选择为dataTable1dataTable1。在在Form1_LoadForm1_Load方法的最后添加下列代码:方法的最后添加下列代码:dataGrid1.CaptionText = dataTable1.TableName;dataGrid1.CaptionText = dataTable1.TableName;编译并运行,结果如图所示。编译并运行,结果如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第74页,共页,共103页页【例8.6】3. 3. 添加其他控件并进行数据绑定添加其他控件并进行数据绑定打开窗体设计器,向窗体添加一个组框打开窗体设计器,向窗体添加一个组框GroupBoxGroupBox控件,在其属性窗控件,在其属性窗口中将其口中将其TextText属性修改为属性修改为“学生信息记录学生信息记录”,然后在组框内添加如,然后在组框内添加如表所示的控件。表所示的控件。 表表8.11 控件的属性设置控件的属性设置VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第75页,共页,共103页页3. 添加其他控件并进行数据绑定完成后的窗体如图所示。完成后的窗体如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第76页,共页,共103页页3. 添加其他控件并进行数据绑定单击单击textBox1textBox1控件,在其属性窗口中,展开(控件,在其属性窗口中,展开(DataBindingsDataBindings)节点,)节点,单击(单击(AdvancedAdvanced)属性右侧的)属性右侧的“”按钮,弹出按钮,弹出“高级数据绑定高级数据绑定”窗口,如图所示。窗口,如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第77页,共页,共103页页3. 添加其他控件并进行数据绑定单击单击TextText属性右侧的下拉按钮,从弹出的下拉列表中,选择属性右侧的下拉按钮,从弹出的下拉列表中,选择“dataTable1”dataTable1”下的下的StudentNoStudentNo,单击,单击“关闭关闭”按钮,完成了按钮,完成了textBox1textBox1控件和控件和dataTable1dataTable1表中的表中的studentnostudentno字段的绑定。字段的绑定。按照上述方法,依次按下表为控件添加数据绑定。按照上述方法,依次按下表为控件添加数据绑定。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第78页,共页,共103页页3. 添加其他控件并进行数据绑定单击单选按钮单击单选按钮(男男),在其属性窗口中单击事件处理按钮,为该控件在,在其属性窗口中单击事件处理按钮,为该控件在窗体中添加窗体中添加CheckedChanged事件处理方法事件处理方法radioButton1_CheckedChanged,并添加下列代码:,并添加下列代码:private void radioButton1_CheckedChanged(object sender, System.EventArgs e)radioButton2.Checked=!radioButton1.Checked;编译运行,可以看到已经基本上具备一个数据库应用程序的框架了。编译运行,可以看到已经基本上具备一个数据库应用程序的框架了。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第79页,共页,共103页页【例8.6】4. 4. 处理绑定对象的事件处理绑定对象的事件BindingBinding对象公开的事件主要是对象公开的事件主要是FormatFormat事件和事件和ParseParse事件,主要的功能是事件,主要的功能是提供从控件到数据源以及数据源到控件进行数据传输的过程中对数据的提供从控件到数据源以及数据源到控件进行数据传输的过程中对数据的格式化操作。下图是格式化操作。下图是FormatFormat事件与事件与ParseParse事件发生的示意图。事件发生的示意图。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第80页,共页,共103页页4. 处理绑定对象的事件下面为范例程序中的下面为范例程序中的radioButton1的绑定对象和的绑定对象和dateTimePicker1的绑定对的绑定对象增加象增加Format事件处理。在事件处理。在Form1_Load事件中的最后加上下面的代码:事件中的最后加上下面的代码:this.radioButton1.DataBindings0.Format += new ConvertEventHandler(radioButton1_Format);this.dateTimePicker1.DataBindings0.Format +=new ConvertEventHandler(dateTimerPicker1_Format);VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第81页,共页,共103页页4. 处理绑定对象的事件下面增加事件处理方法,在前面手工增加的单选钮男控件的下面增加事件处理方法,在前面手工增加的单选钮男控件的CheckedChanged事件处理方法事件处理方法radioButton1_CheckedChanged的下面添加下列代码:的下面添加下列代码:private void radioButton1_Format(object sender, ConvertEventArgs e)/ 如果是空值,转换成如果是空值,转换成falseif(Convert.IsDBNull(e.Value)e.Value=false;private void dateTimerPicker1_Format(object sender, ConvertEventArgs e)/ 如果是空值,转换成当前日期如果是空值,转换成当前日期if(Convert.IsDBNull(e.Value)e.Value=System.DateTime.Today;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第82页,共页,共103页页【例8.6】5. 记录导航记录导航dataGrid控件中用户可以在记录间进行切换,但是有的应用程序可能不控件中用户可以在记录间进行切换,但是有的应用程序可能不需要表格控件而中是一条记录一屏,此时如何进行记录间的导航呢?答需要表格控件而中是一条记录一屏,此时如何进行记录间的导航呢?答案是利用案是利用BindingContext对象。将窗口下面扩大并增加对象。将窗口下面扩大并增加4个按钮,按钮标个按钮,按钮标签分别为签分别为“|”、“”和和“|”,分别用来将当前记录指针移,分别用来将当前记录指针移动到第一条记录、上一条记录、下一条记录和最后一条记录。动到第一条记录、上一条记录、下一条记录和最后一条记录。为这为这4个按钮分别增加个按钮分别增加Click事件处理方法,代码如下:事件处理方法,代码如下:private void button1_Click(object sender, System.EventArgs e)this.BindingContextdataTable1.Position=0;private void button2_Click(object sender, System.EventArgs e)if(this.BindingContextdataTable1.Position0)this.BindingContextdataTable1.Position-=1;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第83页,共页,共103页页5. 记录导航private void button3_Click(object sender, System.EventArgs e)if(this.BindingContextdataTable1.Position0)this.BindingContextdataTable1.Position =this.BindingContextdataTable1.Count-1;运行程序,点击不同的按钮可以发现记录指针发生了移动。运行程序,点击不同的按钮可以发现记录指针发生了移动。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第84页,共页,共103页页8.5.3 使用DataAdapter对象DataAdapterDataAdapter对象表示一组数据命令和一个数据库连接,用对象表示一组数据命令和一个数据库连接,用于填充于填充DataSetDataSet和更新数据源。作为和更新数据源。作为DataSetDataSet和数据源之间的和数据源之间的桥接器,通过映射桥接器,通过映射FillFill来向来向DataSetDataSet填充数据,通过填充数据,通过UpdateUpdate向数据库更新向数据库更新DataSetDataSet中的变化,如图如示。中的变化,如图如示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第85页,共页,共103页页8.5.3 使用DataAdapter对象1. 1. 数据库数据显示数据库数据显示Visual Studio.NETVisual Studio.NET提供了向导来生成提供了向导来生成DataAdapterDataAdapter对象连接对象连接数据源,只需要给向导提供连接信息,并指定需要查询的数数据源,只需要给向导提供连接信息,并指定需要查询的数据表,向导可以自动生成据表,向导可以自动生成SELECTSELECT查询语句和相关的查询语句和相关的UPDATEUPDATE、DELETEDELETE和和INSERTINSERT数据维护语句。数据维护语句。【例例8.78.7】数据库的绑定数据库的绑定。(1) (1) 新建一个新建一个WindowsWindows窗体应用程序项目窗体应用程序项目Ex_9_DB0Ex_9_DB0。(2) (2) 在打开的窗体设计器中,单击在打开的窗体设计器中,单击Form1Form1窗体,在开发环境窗体,在开发环境的窗体属性窗口中,将窗体的的窗体属性窗口中,将窗体的Text(Text(标题标题) )属性内容属性内容“Form1”Form1”改为改为“数据查询与显示数据查询与显示”,然后调整窗体大小。,然后调整窗体大小。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第86页,共页,共103页页【例8.7】(3) (3) 从从“工具箱工具箱”中单击中单击“数据数据”标签项,数据面板拖一个标签项,数据面板拖一个OleDbDataAdapterOleDbDataAdapter控件到窗体上,这将会自动打开适配器向控件到窗体上,这将会自动打开适配器向导,在欢迎页面点击导,在欢迎页面点击“下一步下一步”按钮进入选择数据连接页面,按钮进入选择数据连接页面,如图所示。如图所示。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第87页,共页,共103页页【例8.7】如果已经前面建立好数据连接,那么在下拉列表中应该可以看到如果已经前面建立好数据连接,那么在下拉列表中应该可以看到Acess:mydbAcess:mydb这个数据连接了,直接按这个数据连接了,直接按“下一步下一步”即可;如果还没有建立即可;如果还没有建立连接,请点击连接,请点击“新建连接新建连接”按钮,建立数据连接。按钮,建立数据连接。(4) (4) 在在“选择查询类型选择查询类型”页面中选择页面中选择“使用使用SQLSQL语句语句”选择项,如图所选择项,如图所示,然后点击示,然后点击“下一步下一步”。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第88页,共页,共103页页【例8.7】(5) (5) 在在“生成生成SQLSQL语句语句”页面中,输入查询所需的页面中,输入查询所需的SQLSQL语句。这里直接输语句。这里直接输入入“select * from students”select * from students”,然后点击,然后点击“下一步下一步”按钮即可,即按钮即可,即从数据表从数据表studentsstudents中查询出所有数据,如图所示。中查询出所有数据,如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第89页,共页,共103页页【例8.7】这里的查询语句只要是符合规范的这里的查询语句只要是符合规范的SQLSQL语句即可,包括多表的关联查询。语句即可,包括多表的关联查询。可以通过点击可以通过点击“查询生成器查询生成器”按钮打开查询生成器可视化地生成按钮打开查询生成器可视化地生成SQLSQL语句。根据查询语句,向导会自动生成代码,向工程中添加四个语句。根据查询语句,向导会自动生成代码,向工程中添加四个DataCommandDataCommand对象,分别作为适配器对象的对象,分别作为适配器对象的SelectCommandSelectCommand、InsertCommandInsertCommand、UpdateCommandUpdateCommand和和DeleteCommandDeleteCommand对象。同时,向导会对象。同时,向导会根据所选择的数据连接生成对应的数据连接对象。点击根据所选择的数据连接生成对应的数据连接对象。点击“完成完成”后可能后可能会出现连接中使用的连接字符串包括密码可能会不安全的提示,可以忽会出现连接中使用的连接字符串包括密码可能会不安全的提示,可以忽略之。在多表关联查询中,因为涉及到多个表的列,向导是无法生成略之。在多表关联查询中,因为涉及到多个表的列,向导是无法生成InsertCommandInsertCommand、UpdateCommandUpdateCommand和和DeleteCommandDeleteCommand对象的,此时需要手对象的,此时需要手工编写代码来创建适当的工编写代码来创建适当的CommandCommand对象来更新数据库。对象来更新数据库。 VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第90页,共页,共103页页【例8.7】VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第91页,共页,共103页页关闭向导窗口后,在表单设计器中出现了一个名为关闭向导窗口后,在表单设计器中出现了一个名为“oleDbDataAdapter1”oleDbDataAdapter1”的数据适配器对象和一个名为的数据适配器对象和一个名为oleDbConnection1”oleDbConnection1”的数据连接对象。在的数据连接对象。在“oleDbDataAdapter1”oleDbDataAdapter1”对象上点击鼠标右键,在弹出菜单中选择对象上点击鼠标右键,在弹出菜单中选择“生成数生成数据集据集”菜单项打开生成数据集对话框,如图所示。菜单项打开生成数据集对话框,如图所示。保持各选项的默认值按保持各选项的默认值按“确定确定”按钮,向导会自动生成一个名为按钮,向导会自动生成一个名为“dataSet11”dataSet11”数据集对象加入窗体设计器,该数据集的结构定义也将自动生成,并存入对应的数据集对象加入窗体设计器,该数据集的结构定义也将自动生成,并存入对应的“dataSet1.xsd”dataSet1.xsd”文件中。文件中。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第92页,共页,共103页页(7) (7) 打开窗体设计器,将工具箱中的打开窗体设计器,将工具箱中的WindowsWindows窗体标签页面的窗体标签页面的DataGridDataGrid控件拖放到窗体中,在其属性窗口中,将控件拖放到窗体中,在其属性窗口中,将DataSourceDataSource属性选择为属性选择为dataSet11dataSet11,将,将DataMemberDataMember属性选择为属性选择为studentsstudents。(8) (8) 添加其他控件,按要求绑定这些控件到添加其他控件,按要求绑定这些控件到studentsstudents表的不同列上。表的不同列上。(9) (9) 双击窗体,为窗体添加双击窗体,为窗体添加Form1_LoadForm1_Load事件处理方法,并添加下列代码,事件处理方法,并添加下列代码,用于向数据集中填充数据:用于向数据集中填充数据:private void Form1_Load(object sender, private void Form1_Load(object sender, System.EventArgsSystem.EventArgs e) e) oleDbDataAdapter1.Fill(dataSet11); oleDbDataAdapter1.Fill(dataSet11); (10) (10) 编译运行,结果与前一个例子是一样的,但本例中所有的数据都编译运行,结果与前一个例子是一样的,但本例中所有的数据都是从真实的数据库中取出来的,这主要是靠是从真实的数据库中取出来的,这主要是靠DataAdapterDataAdapter的的FillFill方法,方法,从这个例子可以看出,通过从这个例子可以看出,通过DataAdapterDataAdapter的的FillFill方法、方法、DataSetDataSet和窗体和窗体控件的绑定就可以很方便地实现数据表的数据展示。控件的绑定就可以很方便地实现数据表的数据展示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第93页,共页,共103页页8.5.3 使用DataAdapter对象2. 2. 修改和更新数据到数据库修改和更新数据到数据库上面实例程序在修改了数据后再重新启动,发现数据没有变化,这是由上面实例程序在修改了数据后再重新启动,发现数据没有变化,这是由于于ADO.NETADO.NET使用断开连接的模型,数据的修改在本地数据集中完成。使用断开连接的模型,数据的修改在本地数据集中完成。因此在数据集中的内容发生变化后,要通过因此在数据集中的内容发生变化后,要通过DataAdapterDataAdapter对象的对象的UpdateUpdate方方法将法将DataSetDataSet中的数据显式地写回数据库中,中的数据显式地写回数据库中,UpdateUpdate方法自动调用方法自动调用DataAdapterDataAdapter的对应的对应CommandCommand对象完成对数据源的更新,在有些情况下,对象完成对数据源的更新,在有些情况下,需要程序员自已创建需要程序员自已创建CommandCommand对象来完成数据更新。在本例中,我们增加对象来完成数据更新。在本例中,我们增加一个按钮并通过编写代码完成数据的更新。在窗体设计器中加入一个按一个按钮并通过编写代码完成数据的更新。在窗体设计器中加入一个按钮控件,并在钮控件,并在ClickClick事件处理方法中输入以下代码:事件处理方法中输入以下代码:private void Button1_Click(object sender, private void Button1_Click(object sender, System.EventArgsSystem.EventArgs e) e) this.BindingContextdataSet11,students.EndCurrentEdit(); this.BindingContextdataSet11,students.EndCurrentEdit(); oleDbDataAdapter1.Update(dataSet11,students); oleDbDataAdapter1.Update(dataSet11,students); 再次运行程序,修改数据后点击再次运行程序,修改数据后点击“保存保存”按钮,关闭程序后再次打开时按钮,关闭程序后再次打开时可以发现数据的修改已经确实保存在数据库中了。可以发现数据的修改已经确实保存在数据库中了。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第94页,共页,共103页页8.5.4 多表应用并不是所有的数据库应用都是单表查询,而在多表关联查询中不能根据并不是所有的数据库应用都是单表查询,而在多表关联查询中不能根据SelectSelect语句自动生成语句自动生成DataAdapterDataAdapter对象的数据更新对象的数据更新CommandCommand对象,此时需对象,此时需要程序员手工写代码来创建要程序员手工写代码来创建CommandCommand对象完成数据操作。此外,对于不对象完成数据操作。此外,对于不同的业务逻辑和界面设计的要求,程序员需要在不同的同的业务逻辑和界面设计的要求,程序员需要在不同的ADOADO对象中灵活对象中灵活选择选择CommandCommand对象直接操作数据或者通过对象直接操作数据或者通过DataAdapter+DataSetDataAdapter+DataSet对象对象+ +数数据绑定的方式。下面的例子是对据绑定的方式。下面的例子是对CommandCommand对象与对象与DataAdapterDataAdapter对象的综合对象的综合应用。应用。【例例8.88.8】多表应用多表应用。运行界面如图所示。运行界面如图所示。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第95页,共页,共103页页【例8.8】(1) (1) 新建一个新建一个WindowsWindows窗体应用程序项目窗体应用程序项目Ex_9_DB1Ex_9_DB1。(2) (2) 在打开的窗体设计器中,单击在打开的窗体设计器中,单击Form1Form1窗体,在开发环境的窗体属性窗体,在开发环境的窗体属性窗口中,将窗体的窗口中,将窗体的Text(Text(标题标题) )属性内容属性内容“Form1”Form1”改为改为“成绩维护成绩维护”,然后调整窗体大小。,然后调整窗体大小。(3) (3) 增加对应的控件,设置属性值如表所示。增加对应的控件,设置属性值如表所示。(4) (4) 建立一个建立一个oleDbDataAdapter1oleDbDataAdapter1控件,在属性设置中分别找到控件,在属性设置中分别找到SelectCommandSelectCommand、InsertCommandInsertCommand、UpdateCommandUpdateCommand和和DeleteCommandDeleteCommand,单击下拉列表并选择,单击下拉列表并选择“新建新建”选项生成对应的选项生成对应的CommandCommand对象实例。对象实例。VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第96页,共页,共103页页【例8.8】(5) 在表格控件的当前行发生变化时,要更新右边的编辑框控件的内容,在表格控件的当前行发生变化时,要更新右边的编辑框控件的内容,为为dataGrid1控件增加控件增加CurrentCellChanged事件。事件。private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)/ 使使dataGrid1控件中当前选中的记录行内容在右边的控件中控件中当前选中的记录行内容在右边的控件中if(dataGrid1.CurrentRowIndex 0)comboBox1.SelectedIndex=0;VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第99页,共页,共103页页【例8.8】(8) 分别为三个按钮添加分别为三个按钮添加Click事件处理方法,用于向数据库中增加、删事件处理方法,用于向数据库中增加、删除或修改记录。除或修改记录。private void button1_Click(object sender, System.EventArgs e)/ 通过通过InsertCommand命令来添加命令来添加trystring strStuNO = textBox1.Text.Trim();if (!strStuNO.Equals(string.Empty)/ 创建一个添加记录行的创建一个添加记录行的SQL语句语句 oleDbDataAdapter1.InsertCommand.CommandText = INSERT INTO score(CourseNo, StudentNo, Score) VALUES ( + comboBox1.Tag + , + strStuNO + , + textBox2.Text + );VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第100页,共页,共103页页【例8.8】 / 执行操作执行操作oleDbConnection1.Open();oleDbInsertCommand1.ExecuteNonQuery();/ 显示在显示在dataGrid1控件中控件中DataTable table1 = new DataTable();oleDbDataAdapter1.Fill( table1 ); dataGrid1.DataSource = table1; catch (System.Data.OleDb.OleDbException err)System.Windows.Forms.MessageBox.Show( err.Message, 错误错误 );finallyoleDbConnection1.Close();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第101页,共页,共103页页【例8.8】private void button2_Click(object sender, System.EventArgs e)/ 通过通过DeleteCommand命令来删除命令来删除try string strStuNO = textBox1.Text.Trim();if (!strStuNO.Equals(string.Empty) / 创建一个删除记录行的创建一个删除记录行的SQL语句语句oleDbDataAdapter1.DeleteCommand.CommandText = DELETE FROM Score WHERE studentno= + strStuNO+and CourseNo=+comboBox1.Tag+;/ 执行操作执行操作oleDbConnection1.Open();oleDbDeleteCommand1.ExecuteNonQuery();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第102页,共页,共103页页【例8.8】 / 显示在显示在dataGrid1控件中控件中DataTable table1 = new DataTable();oleDbDataAdapter1.Fill( table1 );dataGrid1.DataSource = table1;catch (System.Data.OleDb.OleDbException err) System.Windows.Forms.MessageBox.Show( err.Message, 错误错误 ); finallyoleDbConnection1.Close();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第103页,共页,共103页页【例8.8】private void button3_Click(object sender, System.EventArgs e)/ 通过通过UpdateCommand命令来修改命令来修改trystring strStuNO = textBox1.Text.Trim();if (!strStuNO.Equals(string.Empty) / 创建一个添加记录行的创建一个添加记录行的SQL语句语句 oleDbDataAdapter1.InsertCommand.CommandText = UPDATE score SET Score= + textBox2.Text + WHERE CourseNo= + comboBox1.Tag + and StudentNo=+strStuNO+; / 执行操作执行操作 oleDbConnection1.Open(); oleDbInsertCommand1.ExecuteNonQuery();VC#程序设计程序设计第第8章章 数据库应用开发数据库应用开发河北软件职业技术学院河北软件职业技术学院 软件工程系软件工程系第第104页,共页,共103页页【例8.8】 / 显示在显示在dataGrid1控件中控件中DataTable table1 = new DataTable();oleDbDataAdapter1.Fill( table1 );dataGrid1.DataSource = table1;catch (System.Data.OleDb.OleDbException err)System.Windows.Forms.MessageBox.Show( err.Message, 错误错误 );finallyoleDbConnection1.Close();(9) 编译运行程序。编译运行程序。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号