450 likes | 691 Views
第 11 章 C# 数据库编程与 ADO.NET 本章要点: ADO.NET 体系结构 数据提供程序 数据集 DataSet. 11.1 ADO.NET 概述. 11.1.1 ADO.NET 结构 ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件。 ADO.NET 库中包含用于连接至数据源、提交查询以及处理结果的类。利用最主要的非连接对象 DataSet ,可以对数据进行排序、搜索、筛选、存储挂起更改,以及在分层数据中进行浏览。 DataSet 还包含很多功能,填补了传统数据访问和 XML 开发之间的空白。下图给出了 ADO.NET 的体系结构:.
E N D
第11章 C#数据库编程与ADO.NET • 本章要点: • ADO.NET体系结构 • 数据提供程序 • 数据集DataSet
11.1ADO.NET概述 11.1.1 ADO.NET结构 ADO.NET为创建分布式数据共享应用程序提供了一组丰富的组件。ADO.NET库中包含用于连接至数据源、提交查询以及处理结果的类。利用最主要的非连接对象DataSet,可以对数据进行排序、搜索、筛选、存储挂起更改,以及在分层数据中进行浏览。DataSet还包含很多功能,填补了传统数据访问和XML开发之间的空白。下图给出了ADO.NET的体系结构:
.NET Framework 数据提供程序 DataSet DataTableCollection Connection DataAdapter Transaction DataTable SelectCommand DataRowCollection Command InsertCommand DataColumnCollection Parameters UpdateCommand ConstraintCollection DeleteCommand DataReader DataRelationCollection 数据库 XML 11.1ADO.NET概述 11.1.1 ADO.NET结构
11.1ADO.NET概述 11.1.1 ADO.NET结构 (1) .NET Framework数据提供程序 .NET Framework数据提供程序是专门为数据处理以及快速地只进、只读访问数据而设计的组件。Connection对象提供与数据源的连接。Command对象能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader从数据源中提供高性能的数据流。最后,DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使对DataSet中数据的更改与数据源保持一致。
11.1ADO.NET概述 11.1.1 ADO.NET结构 (2) 数据集DataSet ADO.NET DataSet专门为独立于任何数据源的数据访问而设计。因此,它可以用于多种不同的数据源、用于XML数据或用于管理应用程序本地的数据。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列以及有关DataTable对象中数据的主键、外键、约束和关系信息组成。
11.1ADO.NET概述 11.1.2 ADO.NET数据提供程序 .NET Framework数据提供程序用于连接到数据库、执行命令和检索结果。可以直接处理检索到的结果,或将其放入ADO.NET DataSet对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。.NET Framework数据提供程序是轻量的,它在数据源和代码之间创建了一个最小层,以便在不以功能为代价的前提下提高性能。 其所包含对象有:
11.1ADO.NET概述 11.1.2 ADO.NET数据提供程序
11.1ADO.NET概述 11.1.2 ADO.NET数据提供程序 .NET Framework中包含的.NET Framework数据提供程序
11.1ADO.NET概述 11.1.3 在代码中使用ADO.NET ADO.NET的相关类都被封装到System.Data命名空间中,在代码中要使用ADO.NET相关功能,需要将System.Data命名空间引入到代码中,其中该命名空间下又包括OleDb、ODBC、SqlClient、Common、SqlTypes、Sql、ProviderBase等常用子命名空间。根据需要使用的数据提供程序不同需要将特定的子命名空间引入到程序中即可。
11.1ADO.NET概述 • 11.1.3 在代码中使用ADO.NET • .NET Framework类库中与数据库相关的常用命名空间及说明如下: • System.Data.Odbc:用于 ODBC 的.NET Framework 数据提供程序描述了用来访问托管空间中的 ODBC 数据源的类集合; • System.Data.OleDb:用于 OLE DB 的 .NET Framework 数据提供程序描述了用于访问托管空间中的 OLE DB 数据源的类集合; • System.Data.Sql:包含支持 SQL Server 特定的功能的类; • System.Data.SqlClient:SQL Server 的 .NET Framework 数据提供程序描述了一个类集合,这个类集合用于访问托管空间中的 SQL Server 数据库; • System.Data.SqlTypes:为 SQL Server 2005 中的本机数据类型提供类。这些类为 .NET Framework 公共语言运行库 (CLR) 所提供的数据类型提供了一种更为安全和快速的替代项。
11.2 数据连接对象Connection • 11.2.1 Connection对象 • Connectionion对象主要用于连接数据库,它的常用的属性如下: • ConnectionString属性:该属性用来获取或设置用于打开SQL Server数据库的字符串。 • ConnectionTimeout属性:该属性用来获取在尝试建立连接时终止尝试,并生成错误之前所等待的时间。 • DataBase属性:该属性用来获取当前数据库或连接打开后要使用的数据库的名称。 • DataSource属性:该属性用来设置要连接的数据源实例名称,例如SQL Server的Local服务实例。 • State属性:该属性是一个枚举类型的值,用来表示同当前数据库的连接状态。State属性一般是只读不写的
11.2 数据连接对象Connection 11.2.2 Connection对象的方法 (1) 构造方法
11.2 数据连接对象Connection 11.2.2 Connection对象的方法 (2) Open和Close方法 Open和Close方法分别用来打开和关闭数据库连接,都不带参数,均无返回值。 (3) SqlCommand(OleDbCommand)CreateCommand()方法 SqlCommand(OleDbCommand)CreateCommand()方法用来创建一个Command类型的对象。
11.2 数据连接对象Connection 11.2.3 Connection对象的事件 (1) 使用InfoMessage事件 可以使用SqlConnection对象的InfoMessage事件从数据源中检索警告和信息性消息。从数据源返回的严重程度为11到16的错误将引发异常。但是,InfoMessage事件可用于从数据源中获取与错误无关联的消息。对于Microsoft SQL Server,任何严重程度等于或小于10的错误都将被视为信息性消息,将使用InfoMessage事件来捕获。 (2) 使用StateChange事件 StateChange事件在Connection的状态改变时发生。StateChange事件接收StateChangeEventArgs,使用户能够使用OriginalState和CurrentState属性来确定Connection状态的改变。OriginalState属性是一个ConnectionState枚举,指示改变前的Connection状态。CurrentState是一个ConnectionState枚举,指示改变后的Connection状态。
11.2 数据连接对象Connection 11.2.4 创建Connection对象 针对数据库驱动提供者的不同,Connection对象的创建方式也有所差异: (1) 连接到SQL Server SQL Server .NET Framework数据提供程序支持类似于OLE DB (ADO)连接字符串格式的连接字符串格式。连接格式如下: using System.Data.SqlClient; //引入命名空间 …… SqlConnection connection = new SqlConnection(connectionString) (2) 对于OLE DB .NET Framework数据提供程序,连接字符串格式与ADO中使用的连接字符串格式基本相同 (3) 连接到ODBC数据源 对于ODBC .NET Framework数据提供程序,连接字符串的格式设计为尽可能与ODBC连接字符串的格式相匹配。
11.2 数据连接对象Connection 11.2.5 使用Connection对象 Connection对象应用的一般步骤是: (1) 创建连接字符串; (2) 创建Connection类型的对象; (3) 打开数据源的连接; (4) 执行数据库的访问操作代码; (5) 关闭数据源连接。 参考如下代码:
11.2 数据连接对象Connection 11.2.5 使用Connection对象 using System.Data.OleDb; //添加引用 //连接Access数据库 string connStr="Porvider = Microsoft.Jet.OleDB.4.0;Data Source= D:\myDB.mdb"; //根据连接字符串创建OleDbConnection连接对象 OleDbConnection objConnection = new OleDbConnection(strConnect); //打开数据连接 if (objConnection.State == ConnectionState.Closed) objConnection.Open(); //关闭数据连接 if (objConnection.State == ConnectionState.Open) objConnection.Close();
11.3 数据库命令对象Command 11.3.1 Command对象的属性 (1) Connection属性 Connection属性用来获得或设置该Command对象的连接数据源。比如某SqlConnection类型的conn对象连在SQL Server服务器上,又有一个Command类型的对象cmd,可以通过cmd.Connection = conn来让cmd在conn对象所指定的数据库上操作。通常的做法是直接通过Connection对象来创建Command对象,而Command对象不宜通过设置Connection属性来更换数据库,所以上述做法并不推荐。 (2) ConnectionString属性 ConnectionString属性用来获得或设置连接数据库时用到的连接字符串,用法和上述Connection属性相同。同样,不推荐使用该属性来更换数据库。
11.3 数据库命令对象Command • 11.3.1 Command对象的属性 • (3) CommandType属性 • CommandType属性用来获得或设置CommandText属性中的语句是SQL语句、数据表名还是存储过程。该属性的取值有3个: • 如果把CommandType设置成为Text或不设置,说明CommandText属性的值是一个SQL语句。 • 如果把CommandType设置成为TableDirect,说明CommandText属性的值是一个要操作的数据表的名。 • 如果把CommandType设置成为StoredProcedure,说明CommandText属性的值是一个存储过程。 • (4) CommandText属性 • 根据CommandType属性的不同取值,可以使用CommandText属性获取或设置SQL语句、数据表名或存储过程。
11.3 数据库命令对象Command 11.3.2 Command对象的方法 (1) 构造方法
11.3 数据库命令对象Command 11.3.2 Command对象的方法 (2) ExecuteNonQuery方法 ExecuteNonQuery方法用来执行Insert、Update、Delete和其他没有返回结果集的SQL语句,并返回执行命令后影响的行数。如果Update和Delete命令所对应的目标记录不存在,返回0。如果出错,返回(1)。 (3) ExecuteScalar方法 ExecuteScalar方法执行一个SQL命令,并返回结果集中的首行首列。如果结果集大于一行一列,则忽略其他部分。根据该特性,这个方法通常用来执行包含Count、Sum等聚合函数的SQL语句。
11.3 数据库命令对象Command • 11.3.2 Command对象的方法 • (4) ExecuteReader方法 • ExecuteReader方法在Command对象中用得比较多,通过DataReader类型的对象,应用程序能够获得执行SQL查询语句后的结果集。该方法的两种定义为: • ExecuteReader(),不带参数,直接返回一个DataReader结果集。 • ExecuteReader(CommandBehavior behavior),根据behavior的取值类型,决定DataReader的类型。
11.3 数据库命令对象Command 11.3.3 创建Command对象 像Connection对象一样,对于操作SQL Server数据库和支持ADO Managed Provider的数据库使用了两个不同的Command对象,分别是SqlCommand对象和OleDbCommand对象 (1) 当使用OleDbCommand对象,使用方法如下: string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection); (2) 当使用SqlCommand对象,使用方法如下: string mySelectQuery = "SELECT OrderID, Customer FROM Orders"; SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);
11.3 数据库命令对象Command 11.3.4 Command对象的使用 以下代码演示了Command对象的使用: //创建连接myDB数据库的字符串 private static string strConnect = "data source=localhost; uid=sa;pwd=sa123;database=myDB" //根据连接字符串创建SqlConnection连接句柄 SqlConnection objConnection = new SqlConnection(strConnect); //创建数据库命令 SqlCommand objCommand = new SqlCommand("", objConnection); // 设置Sql语句 objCommand.CommandText = " INSERT INTO TEST " + " (ID, NAME, Role) "+" VALUES " + " (@ID, @ NAME, @ Role) "; … // 打开数据库连接 if (objConnection.State == ConnectionState.Closed) objConnection.Open(); // 获取运行结果,插入数据 objCommand.ExecuteNonQuery(); //省略后继动作
11.4 数据读取器对象DataReader • 11.4.1 DataReader的属性 • DataReader对象有以下常用属性: • FieldCount属性:该属性用来表示由DataReader得到的一行数据中的字段数。 • HasRows属性:该属性用来表示DataReader是否包含数据。 • IsClosed属性:该属性用来表示DataReader对象是否关闭。
11.4 数据读取器对象DataReader 11.4.2 DataReader的方法 (1) Close方法 Close方法不带参数,无返回值,用来关闭DataReader对象。由于DataReader在执行SQL命令时一直要保持同数据库的连接,所以在DataReader对象开启的状态下,该对象所对应的Connection连接对象不能用来执行其他的操作。所以,在使用完DataReader对象时,一定要使用Close方法关闭该DataReader对象,否则不仅会影响到数据库连接的效率,更会阻止其他对象使用Connection连接对象来访问数据库。
11.4 数据读取器对象DataReader 11.4.2 DataReader的方法 (2) bool Read()方法 bool Read()方法会让记录指针指向本结果集中的下一条记录,返回值是true或false。当Command的ExecuteReader方法返回DataReader对象后,须用Read方法来获得第一条记录;当读好一条记录想获得下一下记录时,也可以用Read方法。如果当前记录已经是最后一条,调用Read方法将返回false。也就是说,只要该方法返回true,则可以访问当前记录所包含的字段。
11.4 数据读取器对象DataReader 11.4.2 DataReader的方法 (3) bool NextResult()方法 bool NextResult()方法会让记录指针指向下一个结果集。当调用该方法获得下一个结果集后,依然要用Read方法来开始访问该结果集。 (4) Object GetValue(int i)方法 Object GetValue(int i)方法根据传入的列的索引值,返回当前记录行里指定列的值。由于事先无法预知返回列的数据类型,所以该方法使用Object类型来接收返回数据。 (5) int GetValues (Object[] values)方法 int GetValues (Object[] values)方法会把当前记录行里所有的数据保存到一个数组里并返回。可以使用FieldCount属性来获知记录里字段的总数,据此定义接收返回值的数组长度。
11.4 数据读取器对象DataReader 11.4.2 DataReader的方法 (6) 获得指定字段的方法 获得指定字段的方法有GetString、GetChar、GetInt32等,这些方法都带有一个表示列索引的参数,返回均是Object类型。用户可以根据字段的类型,通过输入列索引,分别调用上述方法,获得指定列的值。 (7) 返回列的数据类型和列名的方法 可以调用GetDataTypeName()方法,通过输入列索引,获得该列的类型。这个方法的定义是: string GetDataTypeName (int i) (8) bool IsDBNull(int i)方法: bool IsDBNull(int i)方法的参数用来指定列的索引号,该方法用来判断指定索引号的列的值是否为空,返回True或False。
11.4 数据读取器对象DataReader 11.4.3 创建DataReader对象 使用DataReader 检索数据包括创建Command对象的实例,然后通过调用Command.ExecuteReader创建一个DataReader,以便从数据源检索行。以下示例说明如何使用 SqlDataReader,其中command代表有效的SqlCommand对象。 SqlDataReader reader = command.ExecuteReader(); 使用DataReader对象的Read方法可从查询结果中获取行。通过向DataReader传递列的名称或序号引用,可以访问返回行的每一列。
11.4 数据读取器对象DataReader 11.4.4 使用DataReader对象 下列代码演示了DataReader对象的使用: SqlDataReader result = objCommand.ExecuteReader(); //如果DataRead对象成功获得数据,返回true,否则返回false if (result.Read() == true) { // 输出结果集中的各个字段 Response.Write(result["ID"].ToString()); Response.Write(result["NAME"].ToString()); Response.Write(result["ROLE"].ToString()); }
11.5 数据适配器对象DataAdapter • 11.5.1 DataAdapter对象的属性 • DataAdapter对象的常用属性形式为XXXCommand,用于描述和设置操作数据库。使用DataAdapter对象,可以读取、添加、更新和删除数据源中的记录。对于每种操作的执行方式,适配器支持以下4个属性,类型都是Command,分别用来管理数据操作的“增”、“删”、“改”、“查”动作。 • SelectCommand属性:该属性用来从数据库中检索数据。 • InsertCommand属性:该属性用来向数据库中插入数据。 • DeleteCommand属性:该属性用来删除数据库里的数据。 • UpdateCommand属性:该属性用来更新数据库里的数据。
11.5 数据适配器对象DataAdapter 11.5.2 DataAdapter对象的方法 (1) 构造方法
11.5 数据适配器对象DataAdapter 11.5.2 DataAdapter对象的方法 (2) Fill方法
11.5 数据适配器对象DataAdapter 11.5.2 DataAdapter对象的方法 (3) int Update(DataSet dataSet)方法 当程序调用 Update 方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里的每行是否改变和改变的类型,并依次执行所需的INSERT、UPDATE或DELETE 语句,将改变提交到数据库中。这个方法返回影响DataSet的行数。更准确地说,Update方法会将更改解析回数据源。
11.5 数据适配器对象DataAdapter 11.5.3 DataAdapter对象的事件 DataAdapter对象的事件如下表所示:
11.5 数据适配器对象DataAdapter 11.5.4 创建DataAdapter对象 创建该对象的格式如下: //连接字符串 SqlConnection conn; //创建连接对象conn的语句 //创建DataAdapter对象 SqlDataAdapter myda = new SqlDataAdapter; //给DataAdapter对象的SelectCommand属性赋值 myda.SelectCommand = new SqlCommand("select * from myTable", conn); //后继代码
11.5 数据适配器对象DataAdapter 11.5.5 使用DataAdapter对象填充数据集 使用DataApater对象填充DataSet对象的步骤如下: (1) 根据连接字符串和SQL语句,创建一个SqlDataAdapter对象。 (2) 创建DataSet对象,该对象需要用DataAdapter填充。 (3) 调用DataAdapter的Fill方法,通过DataTable填充DataSet对象。
11.6 数据集对象DataSet 11.6.1 DataSet内部结构 DataSet的特性: (1) 独立性。 (2) 离线(断开)和连接 (3) DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
DataSet DataRelationCollection ExtendedProperties DataTableCollection DataTable DataRowCollection DataView DataRow ChildRelations ParentRelations Constrains DataColumnCollection ExtendedProperties DataColumn PrimaryKey ExtendedProperties 11.6 数据集对象DataSet 11.6.1 DataSet内部结构 DataSet的结构如下图所示:
11.6 数据集对象DataSet 11.6.2 创建DataSet 可以通过调用DataSet构造函数来创建DataSet的实例。可以选择指定一个名称参数。如果没有为DataSet指定名称,则该名称会设置为“NewDataSet”。 也可以基于现有的DataSet来创建新的DataSet。新的DataSet可以是:现有 DataSet的原样副本;DataSet的复本,它复制关系结构(即架构)但不包含现有DataSet中的任何数据;或DataSet的子集,它仅包含现有DataSet中已使用GetChanges方法修改的行。 以下代码示例演示了如何构造DataSet的实例。 DataSet customerOrders = new DataSet("CustomerOrders");
11.6 数据集对象DataSet 11.6.3 使用DataSet访问数据库 DataSet对象一般是和DataAdapter对象配合使用。其一般步骤如下: (1) 创建DataAdapter和DataSet对象,并用DataAdapter的SQL语句生成的表填充到DataSet的DataTable中。 (2) 使用DataTable对表进行操作,例如做增、删、改等动作。 (3) 使用DataAdapter的Update语句将更新后的数据提交到数据库中。
11.7 使用ADO.NET连接数据源 11.7.1 连接ODBC数据源 ODBC.NET Data Provider和ODBC数据源有两种连接方式,分别是: (1) 与已有DSN(Data Source Name),即数据源名,的连接字符串连接 。 (2) 与无DSN的连接字符串连接,示例如下: OdbcConnection conn = new OdbcConnection(@”Driver={SQL Server};Server = localhost;Database = “” User ID =;Password =”) //创建OdbcConnection连接SqlServer conn.open(); //打开连接
11.7 使用ADO.NET连接数据源 11.7.2 连接OLEDB数据源 OLE DB(Object Link and Emberdding Database)即对象链接与嵌套数据库,建立在ODBC的基础之上,可以访问关系型数据库和非关系型数据库。 可以使用如下语句来建立连接: OleDbConnection conn = new OleDbConnection (@”Provider=Microsoft.Jet.OleDb.4.0; Data Source = *.mdb;”); //创建OleDbConnection连接到Access数据库 conn.open(); //打开连接
11.7 使用ADO.NET连接数据源 11.7.3 访问Excel (1) 使用ODBC.NET Data Provider连接Excel 可以使用如下语句来建立连接: //创建OdbcConnection连接Excel OdbcConnection conn = new OdbcConnection (@”Driver= Microsoft Excel Driver (*.xls);Dba=*.xls;”); conn.open(); (2) 使用OLE DB.NET Data Provider连接Excel OleDbConnection conn = new OleDbConnection (@”Provider=Microsoft.Jet.OleDb4.0;Data Source = *.xls;Extended Properties = Excel 8.0;”);//创建OleDbConnection连接Excel conn.open();