1、随着数据库产品和技术的发展,数据库访问技术也从ODBC、DAO、RDO、OLE DB、ADO 和 RDS发展到今天的ADO.NET。1数据库数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。大多是指依照一定格式存放在一起的数据记录文件。目前,绝大多数软件系统都需要有数据库的支持,数据库系统已广泛应用于各个领域,如管理信息系统、办公自动化系统、图书检索系统、金融交易系统、票务系统等。目前应用最广泛的数据库类型是关系型数据库,典型产品如Access、SQL Server、Oracle等,本章选择应用最广泛的SQL Server作为主要讨论对象。2表、记录和字段表、记录和字
2、段关系数据库中的数据以表(Table)的形式组织。表是有关信息的逻辑组,类似于日常生活中的表格,按行列方式将相关信息排列成逻辑组。表中的每一行被称为记录(Record),表中的列则被称为字段(Field)。1SQL简介简介SQL(Structural Query Language)结构化查询语言,是一种用来操作数据库的标准语言。SQL语言集数据定义(Data Define)、数据查询(Data Query)、数据操纵(Data Manipulation)和数据控制(Data Control)功能于一体,可以十分方便地实现对数据库的各种操作。2SQL的构成的构成SQL由命令、子句和运算符和函数等
3、基本元素构成,通过这些元素组成语句,对数据库进行操作。SQL命令分两大类,即DDL(数据定义语句)命令和DML(数据操纵语言)命令。DDL命令用于创建和定义新的数据库表、字段和索引,主要包括以下语句。(1)create:创建新的表、字段和索引。(2)drop:删除数据库中的表和索引。(3)alter:通过添加字段或改变字段定义来修改表。2SQL的构成的构成DML命令用于对数据库数据进行操作,主要包括以下语句。(1)select:在数据库中查找满足特定条件的记录。(2)insert:在数据库中插入新的记录。(3)update:更新特定的记录和字段。(4)delete:从数据库中删除记录。2SQL
4、的构成的构成SQL命令中的子句主要包括from、where、group by、having、order by等,通过这些子句,可以进一步定义要选择和要操作的数据。SQL运算符包括逻辑运算符和比较运算符。逻辑运算符用于连接两个表达式,包括and、or、not三种,比较运算符用于比较两个表达式的值,包括、=、=、between、like、in。3select语句语句select语句的功能是将满足一定约束条件的一个或多个表中的字段从数据库中检索出来,并按一定的分组和排序方法显示出来。语法是:SELECT select_list FROM table_source WHERE search_condi
5、tion GROUP BY group_by_expression HAVING search_condition ORDER BY order_expression ASC|DESCSELECT子句用于指定查询数据表中的哪些列,FROM子句用于指定从哪一个表或视图中查询数据。WHERE子句指出查询条件,ORDER BY子句使查询结果按顺序排列。4delete语句语句delete语句的功能是删除from子句列出的满足where子句条件的一个或多个表中的记录。语法是:DELETE FROM table_name WHERE condition5insert语句语句insert语句用于添加记录到表
6、中。语法是:INSERT INTO table_name(name_of_attr_1,name_of_attr_2,.)VALUES(val_attr_1,val_attr_2,)6update语句语句update语句用于按某个条件来更新特定表中的字段值。语法是:UPDATE table_name SET name_of_attr_1=value 1,name_of_attr_k=value_k WHERE conditionADO.NET是一个以.NET框架为基础的全新的数据操作模型,是专门为.NET平台上的数据访问而设计的,应用程序通过ADO.NET可以非常方便地访问并处理存储在各种数据
7、库中的数据。ADO.NET包括DataProvider(数据提供程序)和DataSet(数据集)两个核心组件,如图所示。1DataProvider.NET Framework数据提供程序用于连接数据库、执行命令和检索结果。它提供了DataSet和数据库之间的联系,同时也包含了存取数据库的一系列接口。通过数据提供程序所提供的应用程序编程接口(API),可以轻松地访问各种数据源的数据。对于不同类型的数据源,ADO.NET分别提供了相应的数据提供程序,从而要求引用不同的命名空间。1DataProvider表7-3 ADO.NET数据提供程序.NET数据提供程序访问对象位于命名空间包含核心对象SQL
8、Provider用于访问SQL Server7.0及以上System.Data.SqlClient S q l C o n n e c t i o n、SqlCommandS q l D a t a R e a d e r、SqlDataAdapterOLE DB Provider用于访问OLE DB公开的数据源如AccessSystem.Data.OleDbOleDbConnection、OleDbCommandOleDbDataReader、OleDbDataAdapterODBC Provider用于访问ODBC公开的数据源System.Data.ODBCOdbcConnection、O
9、dbcCommandOdbcDataReader、OdbcDataAdapterOracle Provider用于访问Oracle 数据源System.Data.Oracle ClientOracleConnection、OracleCommandOracleDataReader、OracleDataAdapter 1DataProvider.NET Framework数据提供程序有4个核心对象。其中,Connection对象用于与数据源建立连接;Command对象用于对数据源执行指定命令;DataReader对象用于从数据源返回一个向前的只读数据流;DataAdapter(数据适配器)对象用
10、于在数据库和DataSet之间传递数据。2DataSet可以把DataSet看作内存中的数据库,是不依赖于特定数据库的独立数据集。这里的独立是指即使断开或关闭数据连接,DataSet依然可用。在ADO.NET中,DataSet专门用来处理从数据源获得的数据,无论底层的数据是什么,都可以使用相同的方式来操作从不同数据源取得的数据。DataSet内部是用XML来描述数据的,XML是一种与平台无关、数据无关且能描述复杂数据关系的数据描述语言。2DataSetDataSet对象包括一个DataTable对象的集合和一个DataRelation对象的集合。其中,每一个DataTable对象又包含一个Da
11、taRow对象的集合,每一个DataRow对象用于保存表中的一行数据。而DataRelation对象用来描述不同DataTable对象之间的关系。通常,应用程序访问数据库的一般过程为:(1)连接数据库;(2)发出SQL语句,告诉数据库进行什么样的工作;(3)由数据库返回所需的数据记录。上述访问数据库的3个步骤分别由3个对象来完成:Connection对象负责连接数据库;Command对象负责对数据执行命令;DataSet对象用来保存所查询到的数据记录。图7-14 ADO.NET操作数据库的流程要创建与数据库的连接,需要使用Connection对象。Connection对象的一些属性描述了数据源
12、和用户身份验证的信息,还提供了与数据源连接与断开的方法,SqlConnection对象常用的属性和方法如表7-4所示。表7-4 SqlConnection对象常用的属性和方法属性 描述ConnectionString获取或设置用于打开数据库的字符串ConnectionTimeout获取在尝试建立连接时终止尝试并生成错误之前所等待的时间DataSource获取要连接的数据库实例的名称State获取连接的当前状态方法描述Open用连接字符串指定的属性打开数据库连接Close关闭与数据库连接连接数据库的步骤:(1)定义连接字符串;(2)创建Connection对象;(3)打开与数据库的连接。1.定义
13、连接字符串定义连接字符串连接字符串是用分号隔开的多项信息,对于不同的数据库和.NET框架提供程序,连接字符串的内容也不同。1.定义连接字符串定义连接字符串(1)使用Windows身份验证Data Source=服务器名;Initial Catalog=数据库名;Integrated Security=SSPI 或Server=服务器名;DataBase=数据库名;Integrated Security=True(2)使用SQL Server身份验证Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码或Server=服务器名;DataB
14、ase=数据库名;uid=用户名;pwd=密码其中,服务器名指数据库所在的服务器名称,有以下几种写法:.(圆点)本地服务器IP地址主机名参数Integrated Security指出连接是否是安全连接,可能的值有True、False和SSPI(与True相同)。2.创建创建Connection对象对象SqlConnection conn=new SqlConnection(connString);或SqlConnection conn=new SqlConnection();conn.ConnectionString=connString;注意:要记得引入命名空间System.Data.Sql
15、Client。3.打开与数据库的连接conn.Open();【例7-9】创建一个Windows项TestDemo,连接数据库MyProduct。Command对象主要用来向数据库发出各种SQL命令,例如:查询、插入、修改和删除等命令。表7-5 SqlCommand对象常用的属性和方法属性 描述ConnectionCommand对象使用的数据库连接CommandText执行的SQL语句方法描述ExecuteNonQuery()对连接执行SQL语句,返回受影响的行数ExecuteScalar执行查询,并返回查询结果集中第一行的第一列ExecuteReader执行查询,返回DataReader对象创
16、建Command对象的方法:SqlCommand cmd=new SqlCommand();cmd.Connection=conn;/通过通过Connection属性设置连接对象属性设置连接对象cmd.CommandText=insert into;/通过通过CommandText属属性设置性设置SQL语句语句或SqlCommand cmd=new SqlCommand(insert into,conn);DataReader对象是高度优化的对象,它从数据库检索只读、仅向前的数据流,查询结果在查询执行时返回,大大加快了读取和访问数据的速度,尤其在需要快速访问数据库,又不需要远程存储数据时很方便
17、。该方法一次在内存中存储一行,从而降低了系统开销。表7-6 DataReader对象常用的属性和方法属性 描述HasRowsDataReader中是否包含一行或多行方法描述Read()前进到下一行记录,如果下一行有记录,则读出该行并返回true,否则返回falseClose()关闭DataReader对象【例7-12】在项目TestDemo中,连接数据库MyProduct,显示产品名称列表。注意:DataReader对象是通过Command对象的ExecuteReader方法从数据源中检索行创建的。ADO.NET有两种访问数据库的方式,分别使用DataReader对象和DataSet对象。Da
18、taReader对象专为仅向前方式滚动只读记录而设计,DataSet对象是记录在内存中的缓存,可以从任何方向随意访问和修改。1DataSetDataSet数据集可以简单理解为一个内存中的数据库,DataSet将数据源的数据保存在内存中并独立于任何数据库,此时,DataSet中的数据相当于数据源的数据的一个副本,应用程序与内存中的DataSet数据进行交互,在交互期间不需要连接数据源,因此可以极大地加快数据访问和处理速度,同时也节约了资源。1DataSetDataSet存储数据的方式类似于关系数据库,它们都使用具有层次关系的表、行和列的对象模型,还可以为数据集中的数据定义约束和关系。一个Data
19、Set可以包含对个DataTable对象,DataTable对象对应于数据库中的表,即DataSet里的表是用DataTable表示的。另外,DataRow对象对应于表中的行,DataColumn对象对应于表中的列。要使用DataSet,必须先创建DataSet对象。在创建DataSet对象时可以指定一个数据集的名称,如果不指定名称,则默认被设为NewDataSet。创建DataSet的方法如下:DataSet ds=new DataSet();/创建一个名为创建一个名为NewDataSet的的数据集数据集DataSet ds=new DataSet(MyData);/创建一个名为创建一个名为
20、MyData的数据集的数据集2DataAdapter创建了DataSet对象,接下来需要在数据集和数据源之间建立一个桥梁,用于将数据源中的数据放入数据集中,以及在数据集中的数据发生改变时将修改后的数据提交到数据源中。DataAdapter是DataSet和数据源之间的桥接器,用于检索和保存数据。这好比把DataSet 比作临时仓库,数据库比作仓库,但是临时仓库中使用的材料还是需要某种运输工具去从数据库中获取的,DataAdaper 就是这种工具。这里仓库与临时仓库之间的路相当于数据库连接,而运货车相当于数据适配器DataAdapter,如图所示。2DataAdapter表7-7 SqlData
21、Adapter对象常用的属性和方法属性描述SelectCommand从数据库检索数据的Command对象方法描述Fill()向DataSet中的表填充数据Update()将DataSet中的数据提交到数据库2DataAdapter使用SqlDataAdapter对象填充数据集时,先使用Connection连接数据源,然后使用Fill()方法填充DataSet中的表,语法如下:(1)创建SqlDataAdapter对象SqlDataAdapter 对象名=new SqlDataAdapter(SQL语句,数据库连接)SqlDataAdapter dap=new SqlDataAdapter(sq
22、l,conn);(2)填充DataSetSqlDataAdapter对象.Fill(数据集对象,数据表名称字符串)dap.Fill(ds,MyTable);2DataAdapter把数据集中修改过的数据提交到数据源时,需要使用Update()方法,在调用Update()方法前,要先设置需要的相关命令,如INSERT命令、UPDATE命令和DELETE命令,这可以由设置DataAdapter相关的属性完成,也可以使用SqlCommandBuilder对象来自动生成更新需要的相关命令,简化操作,步骤如下:(1)自动生成用于更新的相关命令SqlCommandBuilder builder=new S
23、qlCommandBuilder(已创建的DataAdapter对象)SqlCommandBuilder builder=new SqlCommandBuilder(dap);2DataAdapter(2)将DataSet的数据提交到数据源SqlDataAdapter对象.Update(数据集对象,数据表名称字符串)dap.Update(ds,MyTable);3DataGridViewDataGridView控件是一个强大而灵活的用于显示数据的可视化控件,通过可视化操作可以轻松定义控件外观,像Excel表格一样方便地显示和操作数据。使用DataGridView显示数据时,需要指定DataGr
24、idView的数据源(即DataSource属性)。使用DataGridView的步骤如下:(1)将DataGridView控件添加到窗体;(2)设置DataGridView控件和其中各列的属性;(3)设置DataSource属性,指定数据源。使用DataSet对象访问数据库,并使用DataGridView控件显示数据的步骤如下:(1)创建数据库连接;(2)打开数据库连接;(3)定义SQL语句;(4)创建SqlDataAdapter对象;(5)创建DataSet对象;(6)用SqlDataAdapter对象的Fill方法填充数据集;(7)设定DataGridView的数据源;(8)关闭数据库连接。【例7-13】在项目TestDemo中,连接数据库MyProduct,显示数据库中产品信息。本项目将设计制作一个学生管理系统,功能包括用户登录、学生信息管理、课程信息管理和成绩信息管理。本系统的功能模块图如图7-27所示。图7-27 学生成绩管理系统功能模块图