第8章数据库应用开发PPT讲稿.ppt
第第8章数据库应用开章数据库应用开发发第1页,共108页,编辑于2022年,星期一8.1.1关系数据库模型关系数据库模型数据库是指以一定的组织形式存放在计算机存储介质上的相互关联的数据的集合。例如,把一个学校的教师、学生和课程等数据有序地组织起来,存储在计算机磁盘上,就构成了一个数据库。数据库概念提出后,先后出现了几种数据模型,其中关系模型具有数据结构简单灵活、易学易懂且有雄厚的数学基础等特点,现已成为数据库的标准。关系数据库是以关系模型来组织的。关系模型中数据的逻辑结构是一张二维表,它由行和列组成。例如,表8.1是在学生信息管理系统中使用的一个Students表,用来描述学生的属性。表表8.1Students表表第2页,共108页,编辑于2022年,星期一8.1.1关系数据库模型关系数据库模型一个关系数据库一般由多个表组成,表与表之间可以以不同的方式相互关联。例如,表8.2是在学生信息管理系统中使用的另一个表Courses,用来描述课程的属性。表表8.2Courses表表在这个表中,CourseNo(课程号)字段是Courses表的主键,因为它是唯一的。第3页,共108页,编辑于2022年,星期一8.1.1关系数据库模型关系数据库模型由于一名学生可以选修多门课程,而一门课程又可由多名学生来选修,因此Students和Courses表之间是一种多对多的关系。这个关系可以用一个成绩表Scroe来表示,即学生所学的课程对应成绩信息,该表将学生的学号与课程号进行了关联,表8.3显示了该表的部分记录。表表8.3Score表表Score表的CourseNo字段引用自Courses表,StudentNo字段引用自Students表,这里的CourseNo字段和StudentNo字段又可称之为Score表的外键,分别指向Courses表和Students表的主键。这样,要唯一标识出Score表的一条记录,必须使用StudentNo和CourseNo两个字段的组合。所以Score表的主键就是这两个字段的组合。第4页,共108页,编辑于2022年,星期一8.1.2结构化查询语言(结构化查询语言(SQL)作为用来在DBMS中访问和操作的语言,SQL(结构化查询语言)的语句通常分为四类:一是DDL(Data Definition Language,数据定义语言)语句,用来创建、修改或删除数据库中各种对象,包括表、视图、索引等;二是DML(Data Manipulation Language,数据操作语言)语句,用来对已经存在的数据库进行记录的插入、删除、修改等操作;三是QL(Query Language,查询语言)语句,用来按照指定的组合、条件表达式或排序检索已存在的数据库中数据,但不改变数据库中的数据;四是DCL(Data Control Language,数据控制语言)语句,用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视等。下面简单介绍一下SQL常用的语句。1.SELECT语句语句一个典型的SQL查询可以从指定的数据库表中“选择”信息,这时就需要使用SELECT语句来执行。它的最简单形式是:SELECT*FROM tableName第5页,共108页,编辑于2022年,星期一1.SELECT语句语句其中,星号(*)用来指定从数据库的tableName表中选择所有的字段(列)。例如,若要查询Courses表中所有记录,则可用下列语句:SELECT*FROM Courses若要从表中选择指定字段的记录,则将星号(*)用字段列表来代替,多个字段之间用逗号分隔,例如:SELECT CourseNo,Credit,CourseName FROM Courses则执行的结果如表8.4所示,可以看出查询的结果记录集合(简称为“结果集”)中的字段顺序是由SELECT语句中的字段顺序来决定的。表表8.4Courses表执行表执行SELECT的结果的结果第6页,共108页,编辑于2022年,星期一1.SELECT语句语句WHERE子句子句 在数据表查询SELECT语句中,经常还需要通过设定查询的条件来获取特定要求的记录,这是通过WHERE子句来实现的,它的一般形式如下:SELECT column1,column2,FROM tableName WHERE condition例如,若将Score表中成绩(score)在80分以上的记录查询出来,则可有下列语句:SELECT StudentNo,Score FROM Scores WHERE Score=80WHERE子句中的条件可以(大于)、=(大于等于)、=(等于)、(不等于)和LIKE等运算符。其中,LIKE用于模糊条件的查询,它可以使用星号(*)和问号(?)等通配符,星号(*)表示可以出现0个或多个字符,问号(?)表示该位置处只能出现1个字符。例如:SELECT*FROM Scores WHERE StudentNo LIKE 21*第7页,共108页,编辑于2022年,星期一WHERE子句则将Score表中所有学号以21打头的记录查询出来。注意,LIKE后面的字符串是以单引号来标识。再如:SELECT*FROM Scores WHERE StudentNo LIKE 210105?则将Scores表中所有学号以210105打头的,且学号为8位的记录查询出来。需要说明的是,在许多DBMS中,LIKE后面字符串中的通配符用“%”来代替“*”,用“_”来代替“?”。WHERE子句中的条件还可用AND(与)、OR(或)以及NOT(非)运算符来构造复合条件查询,例如:若查询Scores表中成绩(score)在70分到80分之间的记录,则可有下列语句:SELECT*FROM Scores WHERE score=70第8页,共108页,编辑于2022年,星期一1.SELECT语句语句ORDERBY子句子句在关系模型中行是没有顺序的,但是用户可能希望查询的结果按某种顺序显示。这就需要在数据表查询SELECT语句中使用ORDER BY子句来按序输出结果集。如下面的形式:SELECT column1,column2,FROM tableName WHERE condition ORDER BY col1,col2,ASC或SELECT column1,column2,FROM tableName WHERE conditionORDER BY col1,col2,DESC其中,ASC表示升序(从低到高),DESC表示降序(从高到低),当在ORDER BY子句中没有指定ASC/DESC时,则按默认的升序进行排列。col1、col2、分别用来指定是按什么字段来排序。当指定多个字段时,则先按col1排序,当有相同col1的记录时,则相同的记录按col2排序,依此类推。例如:SELECT*FROM Scores ORDER BY StudentNo,CourseNo则查询的结果集是按学生号和课程号进行升序排列。第9页,共108页,编辑于2022年,星期一1.SELECT语句语句INNERJOIN语句语句在进行多个数据表查询时,总希望将多个表的某几个字段作为结果集的内容。例如,学生信息管理系统中,常需要将学生成绩按学号、姓名、课程名称、成绩的记录查询出来,这时就需要对Score、Student和Course三个表的数据合并成单个结果集,这种合并称为表的“联接”,我们可以通过在SELECT查询中使用INNER JOIN(内联)操作来实现。INNER JOIN的最简单形式是:SELECT column1,column2,FROM table1INNER JOIN table2 ON table1.columnName=table2.columnName INNER JOIN将table1和table2表进行内联,其联接的条件由ON子句来设定。通过ON子句来指定这两个表中的哪些列进行比较,从而确定最终需要合并的记录。例如:SELECT Scores.StudentNo,Scores.CourseNo,Courses.CourseName,Scores.ScoreFROM Scores INNER JOIN Courses ON Scores.CourseNo=Courses.CourseNoORDER BY StudentNo,CourseNo第10页,共108页,编辑于2022年,星期一8.1.2结构化查询语言(结构化查询语言(SQL)2.INSERT语句语句INSERT语句是用来向表中插入一个新的记录。该语句的常用形式是:INSERT INTO tableName(col1,col2,col3,colN)VALUES(val1,val2,val3,valN)其中,tableName用来指定插入新记录的数据表,tableName后跟一对圆括号,包含一个以逗号分隔的列(字段)名的列表,VALUES后面的圆括号内是一个以逗号分隔的值列表,它与tableName后面的列名列表是一一对应的。需要说明的是,若某个记录的某个字段值是字符串,则需要用单引号来括起来。例如:INSERT INTO Students(StudentNo,StudentName)VALUES(21010503,张小峰)将在Student中插入一个新行,其中StudentNo(学号)为“21010503”,StudentName(学生姓名)为“张小峰”,对于该记录的其它字段值由于未指定值,其结果由系统决定。第11页,共108页,编辑于2022年,星期一8.1.2结构化查询语言(结构化查询语言(SQL)3.UPDATE语句语句UPDATE语句用于更新表中的数据。该语句的常用形式是:UPDATE tableName SET column1=value1,column2=value2,columnN=valueN WHERE condition该语句可以更新tableName表中一行记录或多行记录的数据,这取决于WHERE后面的条件。关键字SET后面是以逗号分隔的“列名/值”列表。例如:UPDATE Students SET StudentName=王鹏 WHERE StudentNo=21010503将学号为“21010503”的记录中的StudentName字段内容更新为“王鹏”。第12页,共108页,编辑于2022年,星期一8.1.2结构化查询语言(结构化查询语言(SQL)4.DELETE语句语句DELETE语句用来从表中删除记录,其常用形式如下:DELETE FROM tableName WHERE condition该语句可删除tableName表中一行或多行记录,这取决于WHERE后面的条件。例如:DELETE FORM Students WHERE StudentNo LIKE 210105*则将Student表中所有以210105开头的学号的记录删除。第13页,共108页,编辑于2022年,星期一8.2ADO.NET概述概述8.2.1ADO.NET基本概念与特点基本概念与特点在.NET中数据库的访问是通过ADO.NET完成的。ADO.NET是微软公司ADO(Active Data Object)技术的升级版本。为了保持对ADO技术的兼容性,ADO.NET不但能够访问那些使用新的.NET数据提供程序的数据源,也可访问那些现有的ADO OLEDB数据提供程序。ADO.NET是为基于消息的Web应用程序而设计的,同时也能为其他应用程序结构提供良好的功能。以前ADO操作主要依赖于两层结构并且是基于连接的,连接断开后就只能通过重新新建连接才能实现存取,而在ADO.NET中,数据处理被延伸到三层以上的结构,程序员也需要采用无连接应用模型。通过支持对数据的松耦合访问,ADO.NET减少了与数据库的活动连接数目(即减少了多个用户争用数据库服务器上的有限资源的可能性),从而实现了最大限度的数据共享。下面就介绍一下ADO.NET的主要特点:第14页,共108页,编辑于2022年,星期一8.2.1ADO.NET基本概念与特点基本概念与特点1.ADO.NET不依赖于连续的活动连接不依赖于连续的活动连接在传统的客户端/服务器应用程序中,组件将建立与数据库的连接,并在应用程序运行过程中使连接保持打开状态。该方法在许多应用程序中并不实用,打开的数据库连接将占用宝贵的系统资源。在大多数情况下,数据库只可以维持少量的并发连接,维持这些连接的系统开销将降低应用程序的总体性能。2.使用数据命令执行数据库交互使用数据命令执行数据库交互若要在数据库中执行操作,应执行SQL语句或存储过程(它包括SQL语句)。我们使用SQL语句或存储过程读写行并执行聚合函数,例如添加或求平均值,我们还可使用SQL语句或存储过程创建或修改表或列、执行事务等。在ADO.NET中使用数据命令封装了SQL语句或存储过程。例如,我们想要从数据库读取一组行,则创建一个数据命令并用SQL的SELECT语句的文本,或获取记录的存储过程名称来配置它。在进行数据库交互时一般按以下顺序操作:(1)打开一个连接;(2)执行该命令引用的SQL语句或存储过程;(3)关闭连接。连接保持打开的时间仅足够执行语句或存储过程。第15页,共108页,编辑于2022年,星期一8.2.1ADO.NET基本概念与特点基本概念与特点3.使用数据集缓存数据使用数据集缓存数据虽然使用数据命令可以进行几乎全部数据库的操作,但在处理Windows Forms应用程序时,我们需要做的最常见的数据任务是从数据库检索数据并对数据进行某些操作:显示数据、处理数据或将数据发送给另一个组件。这便是数据集的概念。数据集是从数据源检索的记录的缓存,它的工作方式如同虚拟的数据存储区:数据集包含一个或多个表(这些表可能来自实际数据库中的表),并且它可以包含有关这些表之间的关系和对表可包含数据的约束的信息。4.数据集独立于数据源数据集独立于数据源尽管数据集是作为从数据库获取的数据的缓存,但数据集与数据库之间没有任何实际关系。数据集是容器,它由从数据适配器执行的SQL命令或存储过程填充。5.数据保持为数据保持为XML数据需要从数据存储区移动到数据集以及从数据集移动到各种组件。在ADO.NET中,传输数据的格式是XML。类似地,如果需要保持数据(例如保持到文件中),则将其存储为XML。如果有XML文件,则可以像使用任何数据源一样使用它,并从它创建数据集。第16页,共108页,编辑于2022年,星期一5.数据保持为数据保持为XML使数据协议以XML为基础可提供许多便利之处:XML是工业标准格式。这意味着我们的应用程序数据组件可以与其他任何应用程序中的任何组件交换数据,只要该组件理解XML。许多应用程序被编写为可理解XML,把异类应用程序间的交换提升到了空前高的水平。XML是基于文本的。数据的XML表示形式不使用任何二进制信息,这使它可以通过任何协议(如HTTP)进行发送。大多数防火墙将阻塞二进制信息,但通过将信息格式化为XML,组件仍可以方便地交换信息。对于大多数方案,我们不必知道XML便可以使用ADO.NET中的数据。ADO.NET自动根据需要将数据转换为XML或从XML转换出数据,我们可以使用普通编程方法与数据进行交互。第17页,共108页,编辑于2022年,星期一8.2.1ADO.NET基本概念与特点基本概念与特点6.通过架构定义数据结构通过架构定义数据结构尽管我们不必知道有关XML的任何事情便可以读写数据库和使用数据集,但也有一些情况下我们需要直接与XML打交道,比如不打算访问数据而要进行数据设计时,即需要在ADO.NET中使用元数据时,将直接使用XML。ADO.NET数据集以XML表示,使用基于XML架构定义语言(XSD)的XML架构来定义数据集的结构(如在数据集中有哪些表、列、数据类型、约束等的定义)。就象数据集包含的数据可以从XML加载和序列化为XML一样,数据集的结构也可以从XML架构加载和序列化为XML。对于大部分ADO.NET中的数据操作,Visual Studio.NET工具提供了可视化的设计器来完成,并能根据需要生成和更新架构。第18页,共108页,编辑于2022年,星期一8.2.2ADO.NET与与ADO的比较的比较对于已经使用过ADO技术开发数据库的读者来说,应该了解ADO.NET与ADO的不同之处。1.数据的内存中表示形式数据的内存中表示形式在ADO中,数据的内存中表示形式为记录集:在ADO.NET中,数据的内存中表示形式为数据集。它们之间有重要的差异。表的个数记录集看起来像单个表。如果记录集包含来自多个数据库表的数据,则它必须使用JOIN查询,将来自各个数据库表的数据组合到单个结果表中。数据导航和游标在ADO中,我们使用ADOMoveNext方法顺序扫描记录集的行。在ADO.NET中,行表示为集合,因此我们可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation对象维护有关主记录和详细资料记录的信息,并提供方法使我们可以获取与正在操作的记录相关的记录。“游标”是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在ADO.NET DataReader对象中提供只进、只读游标的功能。第19页,共108页,编辑于2022年,星期一8.2.2ADO.NET与与ADO的比较的比较2.将打开连接的时间降至最低将打开连接的时间降至最低如前所述ADO.NET采用了无连接模型。在ADO.NET中,打开连接的时间仅足够执行数据库操作,例如“选择”(SELECT)或“更新”(UPDATE)。我们可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。在ADO中,记录集可以提供不连接的访问,但ADO主要是为连接的访问设计的。ADO和ADO.NET中的不连接处理之间存在一个显著差异:在ADO中,通过调用OLEDB提供程序来与数据库通信。但在ADO.NET中,我们通过数据适配器(OleDbDataAdapter或SqlDataAdapter对象)与数据库通信,这将调用OLEDB提供程序或基础数据源提供的API。ADO和ADO.NET之间的重要差异是:在ADO.NET中,数据适配器允许我们控制将对数据集所做的更改传输到数据库的方式,方法是进行性能优化、执行数据验证检查或添加其他任何额外处理。第20页,共108页,编辑于2022年,星期一8.2.2ADO.NET与与ADO的比较的比较3.在应用程序间共享数据在应用程序间共享数据在应用程序间传输ADO.NET数据集比传输ADO不连接的记录集要容易得多。若要将ADO不连接的记录集从一个组件传输到另一个组件,可使用COM封送。若要在ADO.NET中传输数据,可使用数据集,它可以传输XML流。相对于COM封送,XML文件的传输提供以下便利之处:更丰富的数据类型。COM封送提供一组有限的数据类型(由COM标准定义的那些类型)。由于ADO.NET中的数据集传输基于XML格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。更优秀的性能。传输大型ADO记录集或大型ADO.NET数据集会使用网络资源,随着数据量的增长,施加于网络的压力也在增加。ADO和ADO.NET都使我们可以最大限度地降低所传输的数据,但ADO.NET还提供另一个性能优势:ADO.NET不需要数据类型转换。而需要COM封送来在组件间传输记录集的ADO,则需要将ADO数据类型转换为COM数据类型。穿透防火墙。防火墙可以影响试图传输不连接的ADO记录集的两个组件。要记住,防火墙通常配置为允许HTML文本通过,但防止系统级可求(如COM封送)通过。因为组件使用XML交换ADO.NET数据库,所以防火墙可以允许数据集通过。第21页,共108页,编辑于2022年,星期一8.2.3ADO.NET对象模型的结构对象模型的结构图8.1展示了ADO.NET对象模型中的主要对象。当然,实际上的ADO.NET类库是很复杂的,但我们现在需要了解的是ADO.NET对象模型中有哪些主要对象,以及它们之间是如何交互的。图图8.1ADO.NET的对象模型的对象模型第22页,共108页,编辑于2022年,星期一8.2.3ADO.NET对象模型的结构对象模型的结构ADO.NET的对象模型由两个部分组成:数据提供程序(Data Provider,有时也叫托管提供程序)和数据集(DataSet)。数据提供程序负责与物理数据源的连接,数据集代表实际的数据。这两个部分都可以和数据使用程序通信,如Web Form窗体和Win Form窗体。1.数据提供程序数据提供程序数据提供程序组件属于数据源(Data Source)。在.NET框架下的数据提供程序具有功能相同的对象,但这些对象的名称、部分属性或方法可能不同。在数据提供程序当中,DataAdapter(数据适配器)是功能最复杂的对象,它是Connection对象和数据集之间的桥梁。DataAdapter对象管理了4个Command对象来处理后端数据集和数据源的通信。Command对象支持SQL语句和存储过程,存储过程可返回单个值,一组或多组值,也可以不返回值。数据适配器的4个命令对象是SelectCommand、UpdateCommand、InsertCommand和DeleteCommand。数据适配器用SelectCommand对象来填充数据集,其他3个对象在需要时用来插入、删除或改变数据源中的数据。ADO.NET的Connection对象和Command对象与它们在ADO中的功能大致相同(主要的区别在于缺少对服务器端游标的支持),而DataReader在ADO中的对应功能像一个单向流水游标。在ADO中没有与数据适配器和数据集对应的功能。第23页,共108页,编辑于2022年,星期一8.2.3ADO.NET对象模型的结构对象模型的结构2.数据集数据集数据集(DataSet)是记录在内存中的数据,它的结构如图8.2所示。图图8.2ADO.NET的对象模型的对象模型第24页,共108页,编辑于2022年,星期一8.2.4ADO.NET数据库开发方式数据库开发方式1.了解了解ADO.NET数据库开发数据库开发ADO.NET在Windows平台下主要有4种数据库访问方式:OLEDB模式、ODBC模式、SQLClient模式和Oracle数据库模式,每一种模式都有前述ADO.NET对象模型的一种实现。OLEDB模式OLEDB模式主要用于访问OLEDB所支持的数据库。在使用OLEDB模式时需要引入的命名空间有System.Data和System.Data.OleDb,对应于ADO.NET对象模型中的对象,OLEDB模式的对象名称分别为OleDbConnection对象,OleDbCommand对象,OleDbDataAdapter对象和OleDbDataReader对象。ODBC模式ODBC模式主要用于连接ODBC所支持的数据库。在使用ODBC模式时需要引入的命名空间有System.Data和System.Data.Odbc,对应于ADO.NET对象模型中的对象,ODBC模式的对象名称分别为OdbcConnection对象,OdbcCommand对象,OdbcDataAdapter对象和OdbcDataReader对象。SQLClient模式SQLClient模式只用于访问MS SQL Server数据库,是ADO.NET中比较特殊的组件。在使用SQLClient模式时需要引入的命名空间有System.Data和System.Data.SqlClient,对应于ADO.NET对象模型中的对象分别是SqlConnection对象、SqlCommand对象、SqlDataAdapter对象和SqlDataReader对象。第25页,共108页,编辑于2022年,星期一8.2.4ADO.NET数据库开发方式数据库开发方式2.ADO.NET中两种基本的数据库开发方式中两种基本的数据库开发方式 利用Command对象和DataReader对象直接操作和显示数据可以使用数据命令Command对象和数据读取器对象DataReader以便与数据源直接通信。使用数据命令Command对象和数据读取器对象DataReader直接进行的数据库操作包括:运行查询和存储过程、创建数据库对象、使用DDL命令直接更新和删除 使用DataAdapter对象和DataSet对象如果应用程序需要访问多个源中的数据,需要与其他应用程序相互操作或者可受益于保持和传输缓存结果,则使用DataAdapter适配器对象和数据集DataSet是一个极好的选择。第26页,共108页,编辑于2022年,星期一8.3创建连接创建连接要开发数据库应用程序,首先需要建立与数据库的连接。在ADO.NET中数据库连接是通过Connection对象来管理的,此外事务的管理也通过Connection对象进行。不同的数据库连接模式,其连接对象的成员大致相同,但是也有一些小的差别。8.3.1Connection连接字符串连接字符串Connection对象最重要的属性是连接字符串ConnectionString,这也是Connection对象惟一的非只读属性。ConnectionString是一个字符串,用于提供登录数据库和指向特定数据库所需的信息。使用过ADO的程序员对连接字符串应该很熟悉了,典型的ConnectionString属性可能如下所示:Provider=SQLOLEDB;Data Source=MySQLServer;Initial Catalog=MyDB;Integrated Security=SSPI第27页,共108页,编辑于2022年,星期一8.3.1Connection连接字符串连接字符串下面以MS SQL Server和MS Access数据库为例介绍连接字符串的写法。与SQL Server数据库的连接下面的连接字符串示例中的连接参数在读者的开发环境中可能是不同的,按照要求换过来就可以了。我们假设SQL Server数据库服务器为127.0.0.1(本机),要访问的数据库名为MyDB,采用Windows集成安全性认证方式。(1)在SqlClient方式下的字符串如下:data source=127.0.0.1;persist security info=False;initial catalog=MyDB;integrated security=SSPI;(2)OleDb方式的字符串如下:Provider=SQLOLEDB;Data Sourse=127.0.0.1;persist security info=False;initial catalog=MyDB;integrated security=SSPI;(3)Odbc方式:Driver=SQL Server;Server=127.0.0.1;Database=MyDB;Trusted_Connection=Yes;UID=Administrator第28页,共108页,编辑于2022年,星期一8.3.1Connection连接字符串连接字符串 与Access数据库的连接这里也约定该Access数据库是Access2000创建的,而数据库文件的路径为C:datamdb。(1)OleDb方式:Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=c:data.mdb;(2)Odbc方式:Driver=Microsoft Access Driver(*.mdb);DBQ=C:data.mdb;UID=admin;设定连接字符串时,Connection对象应该在非连接状态,因此如果要在运行时通过代码来更改数据库的连接,首先应该断开已有的连接。建立Connection对象连接数据库可以通过代码方式,也可以通过VisualStudio.NET的IDE环境来完成。第29页,共108页,编辑于2022年,星期一8.3.2在设计时创建连接对象在设计时创建连接对象在Visual Studio.NET的IDE环境中可以很方便地建立Connection对象并设置连接字符串。我们假设要通过OLEDB模式连接到一个Access数据库C:data.mdb,在设计时建立连接的过程如下:1.打开打开“数据链接属性数据链接属性”对话框对话框在IDE环境中选择菜单“视图”“服务器资源管理器”或者直接按Ctrl+Alt+S键激活“服务器资源管理器”面板,如图8.3所示。图图8.3 服务器资源管理器面板服务器资源管理器面板点击面板上方的连接到数据库工具栏按钮即可打开“数据链接属性”对话框。第30页,共108页,编辑于2022年,星期一8.3.2在设计时创建连接对象在设计时创建连接对象2.指定数据提供程序图指定数据提供程序图IDE环境默认连接的是MS SQL Server数据库,所以“数据链接属性”对话框打开时就处在第二的页面等待设置SQL Server的连接参数,我们需要连接的是Access数据库,因此需要返回第一个页面选择Access数据库对应的数据提供程序:Microsoft Jet 4.0 OLE DB Provider,如图8.4、图8.5所示。图图8.4 数据链接属性对话框数据链接属性对话框图图8.5 数据链接属性对话框:选择提供程序数据链接属性对话框:选择提供程序第31页,共108页,编辑于2022年,星期一8.3.2在设计时创建连接对象在设计时创建连接对象3.设定参数图设定参数图选择“Microsoft Jet 4.0 OLE DB Provider”驱动程序后点击“下一步”按钮进入“连接”页面设置连接参数。此时的“连接”页面应与“数据链接属性”对话框刚打开时不同,在选择或输入数据库名称输入框中输入Access数据库的名字,这里为“c:data.mdb”,如图8.6所示:图图8.6 数据链接属性对话框:设置连接参数数据链接属性对话框:设置连接参数第32页,共108页,编辑于2022年,星期一3.设定参数图Access数据库一般没有登录信息和其他参数需要设置,因此直接按“确定”即可生成连接。如果Access数据库有密码保护,这就需要在“所有”页面中找到相关参数并设置了。双击参数所在的行会弹出参数输入框,输入参数值后即可,如图8.7所示。图图8.7 数据链接属性对话框:高级设置数据链接属性对话框:高级设置第33页,共108页,编辑于2022年,星期一8.3.2在设计时创建连接对象在设计时创建连接对象4.命名数据连接图命名数据连接图在“数据链接属性”对话框中设置完毕并按“确定”按钮后,IDE环境会自动在“服务器资源管理器”中增加一个数据连接条目,如图8.8。图图8.8 新建的数据库服务器条目新建的数据库服务器条目在该数据连接上点右键,从弹出的快捷菜单中选择“重命名”,可以将连接改为自己需要的名称如“Access:mydb”。第34页,共108页,编辑于2022年,星期一8.3.2在设计时创建连接对象在设计时创建连接对象5.在窗体中使用数据连接在窗体中使用数据连接“服务器资源管理器”中的数据连接只是一个数据连接的定义,要在应用程序中使用该数据连接,需要建立该连接的实例。最简单的方法是直接将该数据连接从“服务器资源管理器”中拖放到窗体上,Visual Studio.NET会自动生成该数据连接的实例并加上编号作为实例名,如果数据连接是SQL Server提供程序,生成的数据连接实例为SqlConnection对象,如果是其他OLEDB提供程序,则生成的数据连接实例为OleDbConnection对象。如图8.9所示。图图8.9 在窗体中加入数据连接实例在窗体中加入数据连接实例第35页,共108页,编辑于2022年,星期一5.在窗体中使用数据连接在窗体中使用数据连接单击生成的数据连接实例(本例中为“oldDbConnection1”)即可在属性面板中修改其名称。该连接对象的实例一旦生成,即可设定成为Command等对象的连接属性。另一种生成数据连接实例的方法是从“工具箱”的“数据”面板中将对应的Connection对象拖动到窗体上,然后再从属性面板中的连接字符串属性中选择已定义好的数据连接。如图8.10所示。图图8.10 工具箱的数据组件工具箱的数据组件第36页,共108页,编辑于2022年,星期一8.3.3在运行时创建连接对象在运行时创建连接对象一般来讲没有必要在代码中来创建窗口一级的Connection对象,因为使用Visual Studio.NET提供的设计器创建连接更加方便而且一样有效。但是有时需要在没有绑定到窗体的应用中使用数据库连接时,就必须手动用代码来创建连接了。Connection对象的构造函数有2个版本,没有参数的版本创建一个ConnectionString属性为空的新连接,带参数的版本接受一个字符串作为ConnectionString属性的值。以下是使用带参数的构造函数的例子:System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection (“Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=c:data.mdb;”);下面的例子是采用无参数构造函数,然后修改ConnectionString属性的例子:System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection();conn.ConnectionString=”Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=c:data.mdb;”;第37页,共108页,编辑于2022年,星期一8.3.4打开和关闭连接打开和关闭连接数据连接的两个主要方法是Open和Close。Open方法使用ConnectionString属性中的信息联系数据源并建立一个打开的连接;而Close方法关闭已打开的连接。及时关闭连接是必要的,程序员应该养成这个习惯,因为大多数数据源只支持有限数目的同发连接,过多的连接会白白消耗服务器资源,这也是ADO.NET采用无连接模型的原因。如果使用数据适配器对象(DataAdapter)来操作数据库,则该对象的某个方法如Fill或Update被调用时会先检查连接是否打开,如果未打开则自动打开并执行其逻辑再关闭连接,但显式地关闭数据连接仍是一种良好的习惯,因为Fill等方法在连接已经打开的情况下只是使用该连接,使用完后也不会关闭它。为了有效地使用数据库连接,在实用的数据库应用程序中打开和关闭数据连接时一般都会使用如下技术:第38页,共108页,编辑于2022年,星期一8.3.4打开和关闭连接打开和关闭连接1.使用使用trycatchfinally语句块语句块在C#中使用finally语句可以确保其中的语句得到执行,因此将关闭数据连接对象的Close方法放在finally语句块中是一个良好的习惯。例如:tryconn.Open();/打开数据连接/执行数据操作 catch(Exception ex)/错误处理finallyconn.Close();/关闭数据连接在出现多个数据库连接时,trycatchfinally语句块的层次可能会不太容易阅读。因此还可以采用另一种技术,即using语句块。第39页,共108页,编辑于2022年,星期一8.3.4打开和关闭连接打开和关闭连接2.使用使用using语句块语句块在C#语言中程序员已经从释放资源的工作中解脱出来,垃圾收集器替代了显式的对象清理。然而对于程序员来说,对象的析构函数的执行变得不再可控,