第12章 ADO.NET数据访问技术
数据库具有强大和灵活的后端管理与存储数据的能力,ADO.NET则是一个中间的数据访问层。ASP.NET通过ADO.NET来操作数据库。大部分开发人员非常喜欢数据源控件带来的便利性,但数据源控件的基础还是ADO.NET数据访问技术对数据库进行的访问。本章我们来详细介绍ADO.NET数据访问技术。
12.1 ADO.NET简介
ADO.NET提供了一套用于访问数据库或者XML数据源的类库。一般访问数据库,获取数据时有三步:首先应用程序与数据库建立连接,然后向数据库下达SQL语句或执行存储过程的命令,最后从数据库中返回结果进行处理。本节我们来简单了解ADO.NET。
12.1.1 ADO.NET架构
知识点讲解:光盘\视频讲解\第12章\ADO.NET架构.wmv
ADO.NET中的大多数类位于System.Data命名空间及其子命名空间中。System.Data命名空间包括ADO.NET提供的各种用于数据访问和处理的类。ADO.NET类位于System.Data.dll中,并与System.Xml.dll中的XML类集成。ADO.NET本身与XML紧密集成。从架构上来说,ADO.NET体系分为两类,分别介绍如下。
- 连接处理:该部分用于处理与数据库连接、获取数据源的数据或者执行数据库命令。
- 断开处理:该部分用于处理离线编辑与处理数据,在处理完成后交由连接处理进行数据更新。
注意:大多数类都属于这两大类中的某一个类,除了DataAdapter对象(该对象用于在连接与断开之间保持桥接作用)。
ADO.NET的总台结构图如图12.1所示。
图12.1 ADO.NET总体结构图
由图12.1可以看出,连接部分直接与数据源进行交互。连接部分包含如下对象。
- Connection对象:数据库连接对象。该对象用来建立与物理数据库的连接。
- Transaction对象:数据库事务对象。该对象是与事务处理相关的类。
- DataAdapter对象:一个中间对象。该对象一方面从数据库中获取数据并填充到DataSet对象中;另一方面用来将DataSet中更改的数据更新到数据库中,该对象介于连接对象与断开连接对象之间,因此可以看成是一个适配器对象。
- Command对象:数据命令对象。ADO.NET中使用这个对象向数据库发送查询、更新、删除和修改操作的SQL语句。
- Parameter对象:参数对象。该对象为Command对象中的SQL语句提供参数。
- DataReader对象:数据读取器对象。该对象提供只读、顺向的游标,用于快速读取数据。
非连接部分也称为断开连接的数据集。断开连接部分主要的对象是DataSet对象,该对象是一个小型的内存数据库。
12.1.2 ADO.NET数据提供者
知识点讲解:光盘\视频讲解\第12章\ADO.NET数据提供者.wmv
ADO.NET为了访问不同的数据模型,使用不同的数据提供者模型。数据提供者提供了用于访问特定数据库、执行SQL语句并且接收数据库数据的命令。
注意:数据提供者在数据库和ASP.NET应用程序之间提供了一座桥梁。
ADO.NET提供者模型是一个可扩展的模型,开发人员可以创建特定数据源的自定义提供者。如图12.1左侧的连接类型即可称为ADO.NET数据提供者。.NET Framework内置了四个数据提供者,具体如下。
- SQL Server提供者:为SQL Server提供优化访问的类。
- OLEDB提供者:提供对有OLEDB驱动程序的任何数据源的访问,如SQL Server或者Oracle。
- Oracle提供者:为Oracle提供优化访问的类。
- ODBC提供者:对具有ODBC驱动的任何数据源的访问。
ADO.NET的提供者模型如图12.2所示。
图12.2 ADO.NET提供者模型图
在System.Data.Common命名空间中,ADO.NET提供了用于访问关系型数据库的基类。这些基类以Db作为前缀,如DbConnection、DbCommand等。ADO.NET从这些基类中派生而实现了特定的数据访问类,这四种类型的提供者各自有其命名空间。
- System.Data.Odbc:包含ODBC数据提供程序类的命名空间。
- System.Data.OracleClient:包含OracleClient数据提供程序类的命名空间。
- System.Data.OleDb:包含OLEDB数据提供程序类的命名空间。
- System.Data.SqlClient:包含用于访问SQL Server数据库的类的命名空间。
12.2 连接数据库
在网站开发中,当需要与数据存储进行交互时,首先要建立应用程序与数据源的连接。ADO.NET提供了Connection对象用于创建应用程序与数据库的连接。微软公司提供了3种数据提供程序的连接对象,分别为SqlConnection、OleDbConnection和OdbcConnection。本节我们来学习如何使用这些对象去连接数据库。
12.2.1 数据库连接类
知识点讲解:光盘\视频讲解\第12章\数据库连接类.wmv
在ADO.NET中,所有的连接类都派生自System.Data.Common命名空间中的DbConnection类。由于不同的数据库需要不同的连接和管理方式,需要为连接类指定要连接的服务器、用户名称和密码。本小节我们学习数据库连接类、创建连接字符串以及关闭和释放数据库连接。
1. DbConnection数据库连接类
面对不同种类的数据源,ADO.NET从DbConnection派生了几种数据库连接类。这些类分别位于不同的提供者命名空间内。例如,当访问SQL Server数据库时,使用定义在System.Data.SqlClient命名空间中的SqlConnection类,就可以得到更好的性能和可操作性。
注意:为了防止在连接过程中出现异常,最好使用try/catch/finally语句。
2. DbConnectionStringBuilder创建连接字符串
连接字符串的指定通常比较严格,而且各种不同的数据源、数据库的验证方式都会影响到连接字符串的定义。不同的提供者通过派生该类,提供了适合其自身连接字符串构建的类,如SqlConnectionStringBuilder。DbConnectionStringBuilder对象把连接字符串的各个部分拆解为各个不同的属性,如DataSource指定数据源服务器位置,Database指定数据库名称等。
3. 连接的关闭和释放
连接使用完后,应该尽量使用Close()方法关闭连接,这样可以节省服务器端资源。每次打开一个连接,都要消耗一定的服务器端资源。在关闭连接后,应用程序可以多次调用Close()方法而不会引发异常。另外,还可以调用Open()方法申请一个新的连接。
12.2.2 使用SqlConnection对象连接SQL Server数据库
知识点讲解:光盘\视频讲解\第12章\使用SqlConnection对象连接SQL Server数据库.wmv
对数据库进行任何操作之前,先要建立数据库的连接。ADO.NET专门提供了SQL Server.NET数据提供程序用于访问SQL Server数据库。该数据提供程序提供了专门用于访问SQL Server数据库的数据访问类集合。本小节学习如何使用SqlConnection对象连接SQL Server数据库。
SqlConnection类是用于建立与SQL Server服务器连接的类。为了构建一个ASP.NET应用程序到数据库的连接,需要为SqlConnection对象提供一个到指定数据源的连接字符串。使用SqlConnection对象连接数据库的语法如下:
SqlConnection con=new SqlConnection("Server=服务器名;User Id=用户;Pwd=密码;DataBase=数据库名称");
在使用SqlConnection对象连接数据库时,State属性用来判断当前的连接状态。该属性是一个ConnectionState枚举类型的属性值,目前具有两个可选值,具体说明如下。
- Closed:连接处于关闭状态。
- Open:连接处于打开状态。
通过使用State属性,可以随时获取当前连接的状态,以便应用程序进一步处理。DbConnection基类还提供了一个StateChange事件,当连接的状态发生变化时,通过处理该事件,使得应用程序可以记录连接状态的变化信息、弹出提示性的信息等。
【示例12-1】下面演示使用SqlConnection对象连接SQL Server数据库的方法(这里使用的SQL Server数据库版本为SQL Server 2012)。
(1)创建一个网站,命名为“使用SqlConnection对象连接数据库”。
(2)选择“开始”|“所有程序”|Microsoft SQL Server 2012|SQL Server Management Studio命令,打开SQL Server 2012。在“对象资源管理器”面板中右击“数据库”,选择“新建数据库”命令,打开“新建数据库”对话框,如图12.3所示。
图12.3 “新建数据库”对话框
(3)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Label控件和一个Button控件。在Button控件的单击事件中添加如下代码:
示例12-1:使用SqlConnection对象连接SQL Server数据库
源码路径:光盘\源文件\Chapter12\示例12-1\使用SqlConnection对象连接数据库\Default.aspx.cs
注意:需要在此文件中引入两个命名空间System.Data和System.Data.SqlClient。
Default.aspx页面的代码如下:
示例12-1:使用SqlConnection对象连接SQL Server数据库
源码路径:光盘\源文件\Chapter12\示例12-1\使用SqlConnection对象连接数据库\Default.aspx
运行结果如图12.4所示。
图12.4 运行结果图
在该示例中,在SQL Server 2012中建立一个名为Express的数据库,然后使用连接字符串连接数据库。DataSource为localhost,数据库名为Express,User ID为sa,密码为123456。数据库连接成功后,在Label控件上输出“数据库连接成功。”字符串和连接字符串内容。
12.2.3 使用OleDbConnection对象连接OLEDB数据源
知识点讲解:光盘\视频讲解\第12章\使用OleDbConnection对象连接OLEDB数据源.wmv
OLEDB数据源包含具有OLEDB驱动程序的任何数据源,如SQL Server、Access、Excel和Oracle等。OLEDB数据源连接字符串必须提供Provide属性及其值。使用OleDbConnection对象连接OLEDB数据源的语法格式如下:
1. 连接Access数据库
OleDbConnection oledbcon=new OleDbConnection("rovide=提供者;Data Source=Access文件路径");
【示例12-2】下面演示使用OleDbConnection对象连接Access数据库的方法(这里使用的Access数据库版本为Microsoft Office中自带的Microsoft Access 2010)。
(1)创建一个网站,命名为“使用OleDbConnection对象连接Access数据库”。
(2)选择“开始”|“所有程序”|Microsoft Office|Microsoft Access 2010命令,打开Access 2010。如图12.5所示。
图12.5 新建数据库
在图12.5右侧的“空数据库”面板上单击“文件名”文本框右侧的按钮,打开“文件新建数据库”对话框,如图12.6所示。将Access数据库创建到当前示例目录下,即与网站的Web.config文件在同一文件夹下。
图12.6 新建数据库access.accdb
(3)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Label控件和一个Button控件。在Button控件的单击事件中添加如下代码:
示例12-2:使用OleDbConnection对象连接Access数据库
源码路径:光盘\源文件\Chapter12\示例12-2\使用OleDbConnection对象连接Access数据库\Default.aspx.cs
注意:需要在代码后置文件中引用System.Data和System.Data.OleDb命名空间。
Default.aspx页面的代码如下:
示例12-2:使用OleDbConnection对象连接Access数据库
源码路径:光盘\源文件\Chapter12\示例12-2\使用OleDbConnection对象连接Access数据库\Default.aspx
运行结果如图12.7所示。
图12.7 运行结果图
在该示例中,在Access中建立了一个名为access.accdb的数据库,然后使用连接字符串连接数据库。数据库连接成功后,在Label控件上输出“数据库连接成功。”字符串和连接字符串内容。
注意:在连接字符串中的数据库所在路径为相对路径。
2. 连接SQL Server数据库
OleDbConnection oledbcon=new OleDbConnection("Provide=OLEDB提供程序的名称;Data Source=存储要连接数据库的SQL服务器;Initial Catalog=连接数据库名;Uid=用户名;Pwd=密码");
【示例12-3】下面演示使用OleDbConnection对象连接SQL Server数据库的方法(这里使用的SQL Server数据库版本为SQL Server 2012)。
(1)创建一个网站,命名为“使用OleDbConnection对象连接SQL Server数据库”。
(2)选择“开始”|“所有程序”|Microsoft SQL Server 2012|SQL Server Management Studio命令,打开SQL Server 2012。在“对象资源管理器”面板中右击“数据库”,选择“新建数据库”命令,打开“新建数据库”对话框,如图12.8所示。
图12.8 “新建数据库”对话框
(3)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Label控件和一个Button控件。在Button控件的单击事件中添加如下代码:
示例12-3:使用OleDbConnection对象连接SQL Server数据库
源码路径:光盘\源文件\Chapter12\示例12-3\使用OleDbConnection对象连接SQL Server数据库\Default.aspx.cs
注意:需要在代码后置文件中引用System.Data和System.Data.OleDb命名空间。
Default.aspx页面的代码如下:
示例12-3:使用OleDbConnection对象连接SQL Server数据库
源码路径:光盘\源文件\Chapter12\示例12-3\使用OleDbConnection对象连接SQL Server数据库\Default.aspx
运行结果如图12.9所示。
图12.9 运行结果图
在该示例中,在SQL Server 2012中建立了一个名为Express的数据库,然后使用连接字符串连接数据库。DataSource为localhost,数据库名为Express,User ID为sa,密码为123456。数据库连接成功后,在Label控件上输出“数据库连接成功。”字符串和连接字符串内容。
12.2.4 使用OdbcConnection对象连接ODBC数据源
知识点讲解:光盘\视频讲解\第12章\使用OdbcConnection对象连接ODBC数据源.wmv
与ODBC数据源连接需要使用ODBC.NET Framework数据提供程序,其命名空间位于System.Data.Odbc。
【示例12-4】下面演示使用OdbcConnection对象连接ODBC数据源的方法。
(1)创建一个网站,命名为“使用OdbcConnection对象连接ODBC数据源”。
(2)设置ODBC数据源。首先选择“开始”|“控制面板”|“系统和安全”|“管理工具”命令,打开“管理工具”窗口。在该窗口中双击“数据源(ODBC)”图标,打开“ODBC数据源管理器”对话框,如图12.10所示。在图12.10中选择“系统DSN”选项卡,然后单击“添加”按钮,弹出“创建新数据源”对话框,如图12.11所示。
图12.10 “ODBC数据源管理器”对话框
图12.11 “创建新数据源”对话框
在“创建新数据源”对话框中的“选择您想为其安装数据源的驱动程序”列表中选择SQL Server Native Client 11.0选项。
单击“完成”按钮后,弹出“创建到SQL Server的新数据源”对话框,如图12.12所示。
图12.12 “创建到SQL Server的新数据源”对话框(1)
在图12.12的名称后的文本框中输入数据源的名称odbc_sql。在服务器中选择安装的数据库实例,这里的服务器名称为WIN-RKPKQFBLG6C\SMILE。然后单击“下一步”按钮,弹出“创建到SQL Server的新数据源”对话框。在该对话框中选中“使用用户输入登录ID和密码的SQL Server验证”单选按钮,登录ID为sa,密码为123456,如图12.13所示。
图12.13 指定登录ID和密码
单击“下一步”按钮,弹出如图12.14所示的对话框。
图12.14 “创建到SQL Server的新数据源”对话框(2)
单击“下一步”按钮,弹出如图12.15所示的对话框。
图12.15 “创建到SQL Server的新数据源”对话框(3)
单击“完成”按钮后,弹出“ODBC Microsoft SQL Server安装”对话框,如图12.16所示。在该对话框中单击“测试数据源”按钮,如果数据源连接成功,会弹出如图12.17所示的对话框。
图12.16 测试数据源 | 图12.17 测试成功 |
至此,SQL Server数据库作为ODBC数据源建立成功。
(3)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Label控件和一个Button控件。在Button控件的单击事件中添加如下代码:
示例12-4:使用OdbcConnection对象连接ODBC数据源
源码路径:光盘\源文件\Chapter12\示例12-4\使用OdbcConnection对象连接ODBC数据源\Default.aspx.cs
注意:需要在代码后置文件中引用System.Data、System.Data.Odbc和System.Configuration命名空间。
Default.aspx页面的代码如下:
示例12-4:使用OdbcConnection对象连接ODBC数据源
源码路径:光盘\源文件\Chapter12\示例12-4\使用OdbcConnection对象连接ODBC数据源\Default.aspx
运行结果如图12.18所示。
图12.18 运行结果图
在该示例中,在SQL Server 2012中建立了一个名为Express的数据库。以SQL Server数据库为ODBC数据源,然后使用连接字符串连接数据库。数据库连接成功后,在Label控件上输出“数据库连接成功。”字符串和连接字符串内容。
12.3 操作数据库
在建立应用程序与数据库的连接后,通常是执行从数据库中读取、添加、更改和删除数据库中的数据的操作。ADO.NET提供了Command对象用于向数据库下达SQL指令,以及从数据库获取查询结果等功能。本节介绍如何使用Command对象操作数据库。
12.3.1 Command对象简介
知识点讲解:光盘\视频讲解\第12章\Command对象简介.wmv
DbCommand是位于System.Data.Common命名空间的一个基类。该类提供了对数据源执行SQL语句或存储过程的能力。不同的提供者通过派生该类具有了特定的执行命令的能力。派生自不同数据源的命令对象,可以执行不同数据源的命令。
根据所用的.NET Framework数据提供程序的不同,Command对象可以分为4种,分别是SqlCommand、OleDbCommand、OdbcCommand和OracleCommand。以SqlCommand对象为例,下面介绍该对象常用的属性和方法。SqlCommand对象常用的属性如表12.1所示。
注意:在实际编程过程中应根据访问的数据源的不同,选择相应的Command对象。
表12.1 SqlCommand对象的常用属性
下面对SqlCommand对象的部分属性进行详细介绍。
(1)CommandText属性
该属性用来获取或设置要对数据源执行的SQL语言或存储过程名或表名。语法如下:
public override string CommandText { get; set; }
(2)CommandTimeOut属性
该属性用来获取或设置在终止对执行命令的尝试并生成错误之前的等待时间。语法如下:
public int CommandTimeOut{get; set ;}
该属性值的等待命令执行时间以秒为单位。如果分配的CommandTimeout属性值小于0,将生成一个ArgumentException异常。
(3)CommandType属性
该属性用来获取或设置Command对象要执行命令的类型。语法如下:
public override CommandType CommandType {get; set;}
属性CommandType的默认值为Text。当将CommandType设置为StoredProcedure时,应将CommandText属性设置为存储过程的名称。当调用Execute方法之一时,该命令将执行此存储过程。
除了属性,SqlCommand对象常用的方法如表12.2所示。
表12.2 SqlCommand对象的常用方法
方法 | 描述 |
ExecuteNonQuery | 执行SQL语句并返回受影响的行数 |
ExecuteScalar | 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行 |
ExecuteReader | 执行返回数据集Select语句 |
下面具体介绍SqlCommand对象方法中的ExecuteNonQuery、ExecuteReader和ExecuteScalar三种方法。
(1)ExecuteNonQuery方法
该方法执行更新操作,诸如那些与UPDATE、INSERT和DELETE语句有关的操作,在这些情况下,返回值是命令影响的行数。对于其他类型的语句,诸如SET或CREATE语句,则返回值为-1;如果发生回滚,返回值也为-1。语法如下:
public override Object ExecuteNonQuery ();
(2)ExecuteReader方法
该方法通常与查询命令一起使用,并且返回一个数据阅读器对象SqlDataReader类的一个实例。数据阅读器是一种只读的、向前移动的游标,客户端代码滚动游标并从中读取数据(后面会具体介绍数据阅读器)。如果通过ExecuteReader方法执行一个更新语句,则该命令成功地执行,但是不会返回任何受影响的数据行。
(3)ExecuteScalar方法
该方法执行查询,并返回查询所返回的结果集中第一行的第一列。如果只想检索数据库信息中的一个值,而不需要返回表或数据流形式的数据库信息。例如,只需要返回COUNT(*)、SUM(Price)或AVG(Quantity)等聚合函数的结果,那么Command对象的ExecuteScalar方法就很有用。如果在一个常规查询语句当中调用该方法,则只读取第一行第一列的值,而丢弃所有其他值。语法如下:
public override Object ExecuteScalar ();
Command对象可以根据指定的SQL语言实现的功能来选择SelectCommand、InsertCommand、UpdateCommand和DeleteCommand命令。下面以SqlConnection对象连接数据库Express为例,针对这几种对象进行讲解。
12.3.2 查询数据
知识点讲解:光盘\视频讲解\第12章\查询数据.wmv
查询数据库中的记录时,首先需要创建SqlConnection对象连接数据库,然后定义查询字符串,最后将查询的数据记录绑定到数据控件上。
【示例12-5】下面演示的是如何查询数据库中的数据。
(1)创建一个网站,命名为“使用Command对象查询数据库中的记录”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个TextBox控件、一个Button控件和一个GridView控件。将Button控件的Text属性设置为“查询”,且为该控件添加单击事件。Default.aspx页面代码如下:
示例12-5:使用Command对象查询数据库中的记录
源码路径:光盘\源文件\Chapter12\示例12-5\使用Command对象查询数据库中的记录\Default.aspx
(3)在Web.config文件中配置数据库连接字符串。该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-5:使用Command对象查询数据库中的记录
源码路径:光盘\源文件\Chapter12\示例12-5\使用Command对象查询数据库中的记录\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx页面的后置代码中编写一个方法GetConnction(),该方法用来获取Web.config文件中配置节的连接字符串,代码如下:
示例12-5:使用Command对象查询数据库中的记录
源码路径:光盘\源文件\Chapter12\示例12-5\使用Command对象查询数据库中的记录\Default.aspx.cs
(6)在按钮“查询”的单击事件中,使用Command对象查询数据库中的记录。具体代码如下所示:
示例12-5:使用Command对象查询数据库中的记录
源码路径:光盘\源文件\Chapter12\示例12-5\使用Command对象查询数据库中的记录\Default.aspx.cs
bind()方法用来查询数据库中的内容,并将其显示在GridView控件中。该方法的具体代码如下:
示例12-5:使用Command对象查询数据库中的记录
源码路径:光盘\源文件\Chapter12\示例12-5\使用Command对象查询数据库中的记录\Default.aspx.cs
运行结果图12.19~图12.21所示。
图12.19 运行结果图(1) | 图12.20 运行结果图(2) | 图12.21 运行结果图(3) |
在该示例中,从数据库Express的表Student中查询数据,并将查找到的数据显示在GridView控件上。如果txtName文本框中无内容,即显示表Student中的所有数据。当查找的数据不存在时,会弹出一个对话框,显示“没有相关记录”。
注意:在从数据库中查找数据前,一定要保证数据库及数据表是存在且能正常使用的,而且需要引入相应的命名空间,如System.Data、System.Data.SqlClient和System.Configuration等。
12.3.3 添加数据
知识点讲解:光盘\视频讲解\第12章\添加数据.wmv
向数据库中添加记录时,首先要创建SqlConnection对象连接数据库,然后定义添加记录的SQL字符串,最后调用SqlCommand对象的ExecuteNonQuery方法执行记录的添加操作。
【示例12-6】下面演示的是如何使用Command对象向数据库添加数据。
(1)创建一个网站,命名为“使用Command对象向数据库添加数据”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Button控件和一个GridView控件。将Button控件的Text属性设置为“添加一条记录”,且为该控件添加单击事件。Default.aspx页面代码如下:
示例12-6:使用Command对象向数据库添加数据
源码路径:光盘\源文件\Chapter12\示例12-6\使用Command对象向数据库添加数据\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-6:使用Command对象向数据库添加数据
源码路径:光盘\源文件\Chapter12\示例12-6\使用Command对象向数据库添加数据\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx页面的后置代码中编写一个方法GetConnction(),该方法用来获取Web.config文件中配置节的连接字符串,代码如下:
示例12-6:使用Command对象向数据库添加数据
源码路径:光盘\源文件\Chapter12\示例12-6\使用Command对象向数据库添加数据\Default.aspx.cs
(6)在按钮“添加一条记录”的单击事件中,使用Command对象查询数据库中的记录。具体代码如下所示:
示例12-6:使用Command对象向数据库添加数据
源码路径:光盘\源文件\Chapter12\示例12-6\使用Command对象向数据库添加数据\Default.aspx.cs
bind()方法用来查询数据库中的内容,并将其显示在GridView控件中。该方法的具体代码如下:
示例12-6:使用Command对象向数据库添加数据
源码路径:光盘\源文件\Chapter12\示例12-6\使用Command对象向数据库添加数据\Default.aspx.cs
运行结果图12.22和图12.23所示。
图12.22 运行结果图(1) | 图12.23 运行结果图(2) |
在该示例中,给数据库Express的表Student中插入一条记录。插入操作完成后,调用bind()方法,将Student表中的所有记录显示在GridView控件上。
注意:在从数据库中查找数据前,一定要保证数据库及数据表是存在且能正常使用的,而且需要引入相应的命名空间,如System.Data、System.Data.SqlClient和System.Configuration等。
12.3.4 修改数据
知识点讲解:光盘\视频讲解\第12章\修改数据.wmv
修改数据库中的记录时,首先创建SqlConnection对象连接数据库。然后定义修改数据库的SQL字符串。最后调用SqlCommand对象的ExecuteNonQuery方法执行修改记录的操作。
【示例12-7】下面演示的是如何使用Command对象修改数据库中的数据。
(1)创建一个网站,命名为“使用Command对象修改数据库中的数据”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Button控件和一个GridView控件。将Button控件的Text属性设置为“修改数据”,且为该控件添加单击事件。Default.aspx页面代码如下:
示例12-7:使用Command对象修改数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-7\使用Command对象修改数据库中的数据\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-7:使用Command对象修改数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-7\使用Command对象修改数据库中的数据\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx页面的后置代码中编写一个方法GetConnction(),该方法用来获取Web.config文件中配置节的连接字符串,代码如下:
示例12-7:使用Command对象修改数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-7\使用Command对象修改数据库中的数据\Default.aspx.cs
(6)在按钮“修改数据”的单击事件中,使用Command对象查询数据库中的记录。具体代码如下所示:
示例12-7:使用Command对象修改数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-7\使用Command对象修改数据库中的数据\Default.aspx.cs
bind()方法用来查询数据库中的内容,并将其显示在GridView控件中。该方法的具体代码如下:
示例12-7:使用Command对象修改数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-7\使用Command对象修改数据库中的数据\Default.aspx.cs
运行结果图12.24和图12.25所示。
图12.24 运行结果图(1) | 图12.25 运行结果图(2) |
在该示例中,修改数据库Express中的表Student的数据。将ID为6的记录的Name修改为“马四”。修改操作完成后,调用bind()方法,将Student表中的所有记录显示在GridView控件上。
注意:在从数据库中查找数据前,一定要保证数据库及数据表是存在且能正常使用的,而且需要引入相应的命名空间,如System.Data、System.Data.SqlClient和System.Configuration等。
12.3.5 删除数据
知识点讲解:光盘\视频讲解\第12章\删除数据.wmv
删除数据库中的记录时,首先创建SqlConnection对象连接数据库,然后定义删除字符串,最后调用SqlCommand对象的ExecuteNonQuery方法完成删除数据的操作。
【示例12-8】下面演示的是如何使用Command对象删除数据库中的数据。
(1)创建一个网站,命名为“使用Command对象删除数据库中的数据”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Button控件和一个GridView控件。将Button控件的Text属性设置为“删除数据”,且为该控件添加单击事件。Default.aspx页面代码如下:
示例12-8:使用Command对象删除数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-8\使用Command对象删除数据库中的数据\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-8:使用Command对象删除数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-8\使用Command对象删除数据库中的数据\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx页面的后置代码中编写一个方法GetConnction(),该方法用来获取Web.config文件中配置节的连接字符串,代码如下:
示例12-8:使用Command对象删除数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-8\使用Command对象删除数据库中的数据\Default.aspx.cs
(6)在按钮“删除数据”的单击事件中,使用Command对象查询数据库中的记录。具体代码如下所示:
示例12-8:使用Command对象删除数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-8\使用Command对象删除数据库中的数据\Default.aspx.cs
bind()方法用来查询数据库中的内容,并将其显示在GridView控件中。该方法的具体代码如下:
示例12-8:使用Command对象删除数据库中的数据
源码路径:光盘\源文件\Chapter12\示例12-8\使用Command对象删除数据库中的数据\Default.aspx.cs
运行结果如图12.26和图12.27所示。
图12.26 运行结果图(1) | 图12.27 运行结果图(2) |
在该示例中,删除数据库Express中的表Student的数据。将ID为6的记录删除掉。删除数据操作完成后,调用bind()方法,将Student表中的所有记录显示在GridView控件上。
注意:在从数据库中查找数据前,一定要保证数据库及数据表是存在且能正常使用的,而且需要引入相应的命名空间,如System.Data、System.Data.SqlClient和System.Configuration等。
12.4 使用DataSet对象和DataReader对象
DataSet是离线数据集,用来将数据库中的数据读取到内存中。DataReader对象是数据读取器,它以基于连接的、快速的、未缓冲的及只向前移动的方式来读取数据,一次读取一条记录,然后遍历整个结果集。本节我们来学习如何使用这两种重要的数据类型。
12.4.1 DataSet对象和DataReader对象概述
知识点讲解:光盘\视频讲解\第12章\DataSet对象和DataReader对象概述.wmv
DataSet是ADO.NET的中心概念,是支持ADO.NET断开式、分布式数据方案的核心对象。DataReader是数据读取器,是专门用于从数据库中获取数据的一个轻量级保存数据的类。本节我们来初步认识这两个对象。
1. DataSet对象
DataSet对象是创建在内存中的集合对象,它可以包含任意数量的数据表,以及所有表的约束、索引和关系,相当于一个小型关系数据库。一个DataSet对象包括一组DataTable对象和DataRelation对象,其中每个DataTable对象由DataColumn、DataRow和DataRelation对象组成。DataSet的结构如图12.28所示。
图12.28 DataSet对象结构图
从图12.28看到,一个DateSet对象由一个或者多个DataTable组成,这些DataTable组成了DataTableCollection集合。多个DataTable之间具有一些主从关系,这些关系保存在DataSet对象的DataRelation集合中。在ADO.NET中,创建数据集DataSet的方法有三种:
- 使用XML加载和保持DataSet内容。
- 以编程方式在DataSet中创建DataTable、DataRelation和Constraint,并使用数据填充表。
- 通过DataAdapter用现有关系数据源中的数据表填充DataSet。
DataAdapter对象是DataSet对象和数据源之间联系的桥梁。大多数情况下,使用DataAdapter从数据源中取出数据,直接填充到DataSet中。这样可以从数据库的架构中获取到完整的表、关系以及约束信息。
注意:DataSet是在内存中保存数据的,因此尽可能只保存小量的数据在DataSet中。若保存来自数据库的大量数据,会影响应用程序的性能。
2. DataReader对象
DataReader对象是一个简单的数据集,用于从数据源中检索只读数据集,该对象常用于检索大量数据。根据.NET Framework数据提供程序的不同,DataReader可以分为SqlDataReader、OleDbDataReader等。
下面介绍DataReader对象常用的属性和方法。DataReader对象常用的属性如表12.3所示。
表12.3 DataReader对象的常用属性
属性 | 描述 |
FieldCount | 获取当前行的列数 |
RecordsAffected | 获取执行SQL语句所更改、添加或删除的行数 |
除了属性,DataReader对象常用的方法如表12.4所示。
表12.4 DataReader对象的常用方法
方法 | 描述 |
Read | 使DataReader对象前进到下一条记录 |
Close | 关闭DataReader实例 |
Get | 用来读取数据集的当前行的某一列的数据 |
12.4.2 使用DataAdapter对象填充DataSet对象
知识点讲解:光盘\视频讲解\第12章\使用DataAdapter对象填充DataSet对象.wmv
DataAdapter对象介于连接与非连接之间,是连接与离线数据之间的通信桥梁。DataAdapter对象可以从数据库中读取数据,将其填充到DataSet对象中;也可以将离线状态下编辑的数据更新回数据库。DataAdapter对象的架构如图12.29所示。
图12.29 DataAdapter架构
从图12.29中可以看到,要使DataAdapter对象能够从数据库中获取数据,将离线状态下的数据更新回数据库,需要为DataAdapter对象的四个Command对象赋予相应的命令对象。
注意:这四个命令对象用于完成检索、插入、更新及删除数据库中的数据。
【示例12-9】下面演示如何使用DataAdapter对象填充DataSet对象。
(1)创建一个网站,命名为“使用DataAdapter对象填充DataSet对象”。
(2)在该网站上添加一个Web页面,命名为“Default.aspx”。在该页面上添加一个Button控件和一个GridView控件。将Button控件的Text属性设置为“填充数据集”,且为该控件添加单击事件。Default.aspx页面代码如下:
示例12-9:使用DataAdapter对象填充DataSet对象
源码路径:光盘\源文件\Chapter12\示例12-9\使用DataAdapter对象填充DataSet对象\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-9:使用DataAdapter对象填充DataSet对象
源码路径:光盘\源文件\Chapter12\示例12-9\使用DataAdapter对象填充DataSet对象\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在按钮“填充数据集”的单击事件中,使用Command对象查询数据库中的记录。具体代码如下所示:
示例12-9:使用DataAdapter对象填充DataSet对象
源码路径:光盘\源文件\Chapter12\示例12-9\使用DataAdapter对象填充DataSet对象\Default.aspx.cs
运行结果如图12.30所示。
图12.30 运行结果图
在该示例中,从数据库Express的表Student中查询数据。使用SqlDataAdapter对象填充DataSet对象,将DataSet对象作为GridView控件的数据源。最终将查找到的数据显示在GridView控件上。
12.4.3 对DataSet中的数据进行操作
知识点讲解:光盘\视频讲解\第12章\对DataSet中的数据进行操作.wmv
在开发过程中,有这样一种情况:当使用数据适配器DataAdapter从数据库中读取数据填充到DataSet数据集中,并对DataSet数据集中的数据做适量的修改,然后绑定到数据控件中,但数据库中原有的数据信息保持不变。本节我们来讨论这种情况。
【示例12-10】下面演示对DataSet中的数据进行操作的方法。
(1)创建一个网站,命名为“对DataSet中的数据进行操作”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个GridView控件。Default.aspx页面代码如下:
示例12-10:对DataSet中的数据进行操作
源码路径:光盘\源文件\Chapter12\示例12-10\对DataSet中的数据进行操作\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-10:对DataSet中的数据进行操作
源码路径:光盘\源文件\Chapter12\示例12-10\对DataSet中的数据进行操作\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx后置代码文件中,自定义一个SubStr()方法,用于截取字符串内容。当页面加载时,在页面的Page_Load事件下添加代码。该段代码使用DataAdapter从数据库中读取Name值填充到DataSet数据集中。然后调用自定义方法SubStr()对DataSet中的数据信息进行截取,将数据绑定到控件GridView上。具体代码如下所示:
示例12-10:对DataSet中的数据进行操作
源码路径:光盘\源文件\Chapter12\示例12-10\对DataSet中的数据进行操作\Default.aspx.cs
运行结果如图12.31所示。
图12.31 运行结果图
在该示例中,使用数据适配器DataAdapter从数据库中读取Name值填充到DataSet数据集中。然后调用自定义方法SubStr()对DataSet中的数据进行截取。将截取的数据绑定到数据控件GridView中,从而实现在界面中的名字只显示一个字,其他内容用“...”代替。
注意:DataSet中的数据必须至少存在一个主键列或者唯一的列。如果不存在主键列或唯一列,调用Update()时将会产生InvalidOperation异常。
12.4.4 使用DataSet对象中的数据更新数据库
知识点讲解:光盘\视频讲解\第12章\使用DataSet对象中的数据更新数据库.wmv
在开发过程中还有一种情况:当通过数据适配器DataAdapter从数据库中读取数据填充到DataSet数据集中,对数据集DataSet进行修改后,将数据更新回SQL Server数据库。本节我们来讨论这种情况。
【示例12-11】下面演示如何使用DataSet对象中的数据更新数据库。
(1)创建一个网站,命名为“使用DataSet对象中的数据更新数据库”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个GridView控件。Default.aspx页面代码如下:
示例12-11:使用DataSet对象中的数据更新数据库
源码路径:光盘\源文件\Chapter12\示例12-11\使用DataSet对象中的数据更新数据库\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-11:使用DataSet对象中的数据更新数据库
源码路径:光盘\源文件\Chapter12\示例12-11\使用DataSet对象中的数据更新数据库\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)在Default.aspx后置代码文件中,自定义一个SubStr()方法,用于截取字符串内容。当页面加载时,在页面的Page_Load事件下添加代码。该段代码使用DataAdapter从数据库中读取Name值填充到DataSet数据集中,然后调用自定义方法SubStr()对DataSet中的数据信息进行截取,将数据绑定到控件GridView上,同时将对数据集DataSet所作的更改保存到SQL Server数据库中。具体代码如下所示:
示例12-11:使用DataSet对象中的数据更新数据库
源码路径:光盘\源文件\Chapter12\示例12-11\使用DataSet对象中的数据更新数据库\Default.aspx.cs
运行结果如图12.32所示。
图12.32 运行结果图
在该示例中,使用数据适配器DataAdapter从数据库中读取Name值填充到DataSet数据集中。然后调用自定义方法SubStr()对DataSet中的数据进行截取。将截取的数据绑定到数据控件GridView中。从而实现在界面中的名字只显示一个字,其他内容用“...”代替,并且将数据集DataSet所作的更改保存到SQL Server数据库中。图12.33所示为数据库中表Student中的数据。
图12.33 数据库中Student表的数据
注意:使用该种方法可以将数据集中的更改更新到数据库中。
12.4.5 使用DataReader对象读取数据
知识点讲解:光盘\视频讲解\第12章\使用DataReader对象读取数据.wmv
DataReader读取器以基于连接的、快速的、未缓冲的及只向前移动的方式来读取数据,一次读取一条记录,然后遍历整个结果集。
【示例12-12】下面演示的是如何使用DataReader对象读取数据。
(1)创建一个网站,命名为“如何使用DataReader对象读取数据”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个Label控件。Default.aspx页面代码如下:
示例12-12:如何使用DataReader对象读取数据
源码路径:光盘\源文件\Chapter12\示例12-12\如何使用DataReader对象读取数据\Default.aspx
(3)在Web.config文件中配置数据库连接字符串,该连接字符串添加在<configuration>下的<appSetting>中。具体配置代码如下:
示例12-12:如何使用DataReader对象读取数据
源码路径:光盘\源文件\Chapter12\示例12-12\如何使用DataReader对象读取数据\Web.config
(4)在数据中新建一张表,命名为Student,并为该表添加记录。
(5)当页面加载时,在Default.aspx页面的Page_Load事件中添加代码。在该事件中使用DataReader对象读取数据库中的信息,并将读取的数据信息通过Label控件显示出来。Default.aspx页面的后置代码如下:
示例12-12:如何使用DataReader对象读取数据
源码路径:光盘\源文件\Chapter12\示例12-12\如何使用DataReader对象读取数据\Default.aspx.cs
运行结果如图12.34所示。
图12.34 运行结果图
在该示例中,在Default.aspx页面的Page_Load事件中添加代码。
注意:在该事件中使用DataReader对象读取数据库中的信息,并将读取的数据信息通过Label控件显示出来。
12.4.6 比较DataSet对象和DataReader对象
知识点讲解:光盘\视频讲解\第12章\比较DataSet对象和DataReader对象.wmv
DataSet对象和DataReader对象都用于检索关系数据,并将其保存在内存中。DataSet提供内存中关系数据的表现,DataReader提供快速、只向前和只读的来自数据库的数据流。本节来比较DataSet对象和DataReader对象的区别。
(1)二者在为用户查询数据时的区别
DataSet对象为用户查询数据时的过程如图12.35所示。DataReader对象为用户查询数据时的过程如图12.36所示。
图12.35 DataSet对象查询数据过程
图12.36 DataReader对象查询数据过程
(2)在实现应用程序功能方面的区别
使用DataSet对象时,一般使用DataAdapter与数据源交互,用DataView对DataSet中的数据进行排序和过滤。使用DataSet对象可以为应用程序实现下述功能:
- 结果中的多个分离的表。
- 来自多个源的数据库。
- 层之间交换数据或使用XML Web服务。与DataReader不同,DataSet能被传递到远程客户端。
- 缓冲重复使用相同的行集合以提高性能。
- 对数据执行大量的处理,而不需要与数据源保持打开的连接,从而将该连接释放给其他客户端使用。
- 提供关系数据的分层XML视图并使用XSL转换或XML路径与查询等工具来处理数据。
在应用程序需要下述功能时使用DataReader对象:
- 需要缓冲数据。
- 正在处理的结果集太大而不能全部放入内存中。
- 需要迅速一次性地访问数据,采用只向前的只读方式。
注意:DataSet提供内存中关系数据的表现,DataReader提供快速、只向前和只读的来自数据库的数据流。
12.5 数据绑定
数据绑定是指数据与控件如何相互结合的方式。在ASP.NET中,可以直接使用ADO.NET访问数据库,获取数据源并绑定到服务器控件。ASP.NET提供了一系列的数据源控件,采用声明式编程的方式指定数据源,简化了编写数据库应用程序的复杂性。本节我们来学习如何绑定数据库中的数据。
12.5.1 数据绑定的页面生存周期
知识点讲解:光盘\视频讲解\第12章\数据绑定的页面生存周期.wmv
当使用ADO.NET编写代码绑定到数据源时,可以控制绑定的时机。使用数据源控件,需要先了解一些数据绑定的页面生成周期。数据源控件可以完成两个任务:
- 向连接控制提供数据源数据。
- 向数据源更新在控件中所做的更改。
为了理解数据控件的工作方式,需要理解数据源控件在页面中的生命周期。数据绑定控件的产生顺序如图12.37所示:
图12.37 数据绑定控件的产生顺序
每当有页面请求产生时,都将重复图12.37的过程,即数据源控件每次页面回发时都会查询数据库。
注意:这种情况会造成一定的性能开支,最好的解决方法是在内存中缓存数据以便重用。
12.5.2 数据源控件简介
知识点讲解:光盘\视频讲解\第12章\数据源控件简介.wmv
ASP.NET内置了多种数据源控件,它们可以帮助开发人员迅速开发出复杂的数据绑定页面和数据操作功能。数据源控件允许开发人员连接至多种数据库、数据文件(XML文件),并提供了数据检索及数据操作等多种复杂的功能。
注意:数据源控件可以极大地减轻开发人员的工作量,使他们不编写任何代码或者编写很少的代码,就可以完成页面数据绑定和数据操作功能。
常见的数据源控件如表12.5所示。
表12.5 常见的数据源控件
SiteMapDataSource控件只用于界面导航功能的开发,不是一个常用的数据源控件。在实际开发中,除SiteMapDataSource控件外,表12.5中的数据源控件都会被广泛使用。只需要设定此类控件的DataSourceID属性为页面上某一数据源控件的ID即可,不需要任何编码就可实现数据绑定。
12.5.3 数据源控件SqlDataSource
知识点讲解:光盘\视频讲解\第12章\数据源控件SqlDataSource.wmv
SqlDataSource控件与ADO.NET集成紧密,该控件可以调用ADO.NET中的类来访问数据库,获取数据以及更新数据库。使用SqlDataSource控件可以访问SQL Server、Access和Oracle等数据源,只要这些数据源具有ADO.NET的提供程序。
注意:SqlDataSource控件以一种声明性的方式来定义数据访问,大大简化了ASP.NET开发人员的工作。
SqlDataSource控件的常用属性如表12.6所示。
表12.6 SqlDataSource控件的常用属性
SqlDataSource控件常用的方法如表12.7所示。
表12.7 SqlDataSource控件的常用方法
使用SqlDataSource控件通常需要执行如图12.38所示的操作过程:
图12.38 SqlDataSource操作过程
12.5.4 使用数据源控件SqlDataSource
知识点讲解:光盘\视频讲解\第12章\使用数据源控件SqlDataSource.wmv
SqlDataSource控件是较为常用的数据源控件之一,它可以帮助开发人员迅速创建与数据库的连接。该控件还提供了数据操作功能,如完成数据更新、删除和插入等功能,还可以使用UpdateCommand属性和一些辅助标记来完成数据更新操作。
【示例12-13】下面演示的是SqlDataSource控件的使用方法。
(1)创建一个网站,命名为“数据源控件SqlDataSource更新数据”。
(2)在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个SqlDataSource控件和一个GridView控件。
(3)为SqlDataSource控件配置数据源。
① 在设计视图中单击SqlDataSource控件右上角的智能标签,在打开的SqlDataSource任务菜单中选择“配置数据源”选项,打开“配置数据源”对话框。在该对话框中单击“新建连接”按钮,如图12.39所示。
图12.39 “配置数据源”对话框
② 单击“新建连接”按钮,弹出“选择数据源”对话框。在左侧数据源列表中选择Microsoft SQL Server项,单击“继续”按钮,如图12.40所示。
图12.40 “选择数据源”对话框
③ 单击“继续”按钮后,弹出“添加连接”对话框。在该对话框中选择服务器名、登录服务器方式和连接到的数据库等信息,如图12.41所示。
图12.41 “添加连接”对话框
④ 单击“测试连接”按钮,可以测试数据库Express是否连接成功,如图12.42所示。单击“确定”按钮后,弹出如图12.43所示的对话框。
图12.42 测试成功
图12.43 “配置数据源”对话框
⑤ 单击“下一步”按钮后,在弹出的对话框中选择“指定来自表或视图的列”项,如图12.44所示。
图12.44 “配置数据源”对话框
⑥ 单击“下一步”按钮,为SqlDataSource控件配置数据源操作即完成。
(4)为GridView控件选择数据源。在设计视图中单击GridView控件右上角的智能标签,为GridView控件选择数据源为SqlDataSource控件,即默认的SqlDataSource1。Default.aspx页面代码如下:
示例12-13:使用数据源控件SqlDataSource
源码路径:光盘\源文件\Chapter12\示例12-13\使用数据源控件SqlDataSource\Default.aspx
Web.config配置文件代码如下:
示例12-13:使用数据源控件SqlDataSource
源码路径:光盘\源文件\Chapter12\示例12-13\使用数据源控件SqlDataSource\Web.config
运行结果如图12.45所示。
图12.45 运行结果图
在该示例中,为SqlDataSource控件配置数据源为SQL Server数据库Express。
注意:在该示例中,SQL语句为SELECT * FROM [Student],因此将表Student中的数据输出到GridView控件上。
12.5.5 数据源控件ObjectDataSource和LinqDataSource
知识点讲解:光盘\视频讲解\第12章\数据源控件ObjectDataSource和LinqDataSource.wmv
在实际开发中,大量使用SqlDataSource控件会造成显示逻辑与业务逻辑、数据逻辑的紧耦合。所以在大型网站或Web程序开发中不使用SqlDataSource控件,而使用分层开发的架构模式。LinqDataSource控件基于Linq To SQL技术,使用DataContext对象作为界面数据源的数据源控件。本节我们来了解这两种数据源控件。
1. 数据源控件ObjectDataSource
在分层开发的架构模式下,ObjectDataSource控件可以完成分层开发模式下的快速开发。它可以通过业务对象获取数据,并迅速绑定到数据绑定控件中。还可以迅速、简单地与页面数据绑定控件进行交互,并将数据回传至业务对象,从而实现复杂的数据操作。即ObjectDataSource控件搭建了页面与业务对象之间的数据桥梁,并提供了快速开发的可能。ObjectDataSource控件的常见属性如表12.8所示。
表12.8 ObjectDataSource控件的常用属性
ObjectDataSource控件常用的方法如表12.9所示。
表12.9 ObjectDataSource控件的常用方法
ObjectDataSource控件的作用是数据桥梁,并不具备连接字符串、SQL语句等属性。
注意:使用该控件之前,首先需要创建业务类和业务方法。
2. 数据源控件LinqDataSource
LinqDataSource控件是.NET 3.5框架发布后在ASP.NET中新添加的数据源控件,它基于Linq To SQL技术,并使用DataContext对象作为界面数据源的数据源控件。LinqDataSource控件常用的属性如表12.10所示。
表12.10 LingDataSource控件的常用属性
LinqDataSource控件常用的方法如表12.11所示。
表12.11 LingDataSource控件的常用方法
方法 | 描述 |
Delete | 执行删除操作 |
Insert | 执行插入操作 |
Update | 执行更新操作 |
LinqDataSource控件本身不具有与数据库紧密联系的属性和方法,如连接字符串。但它可以配合Linq To SQL实体类来完成各种数据操作,并且它不需要使用任何SQL语句,保证了界面数据与数据之间的松散耦合。该控件支持使用Linq语句查询或操作数据,可以帮助开发人员迅速开发出基于Linq To SQL的数据操作界面。
12.6 小结
本章主要介绍了ASP.NET的ADO.NET数据访问技术,包括ADO.NET简介、连接数据库的方法、操作数据库的方法、DataSet对象的使用、DataReader对象的使用和数据绑定。重点是对连接数据库和操作数据的方法的掌握,难点是DataSet对象和DataReader对象的使用。有兴趣的读者可以尝试着给自己的网站连接数据库,将数据库中的数据应用到Web页面上。
12.7 本章习题
习题12-1 在Visual Studio 2012中新建一个网站,命名为chapter12_1。在该网站上添加一个Web页面,命名为Default.aspx。在该网页上添加一个Button控件和一个Label控件。在Button控件的单击事件中使用SqlConnection对象连接在习题11-3中创建的SQL Server数据库MySQLData。运行结果如图12.46所示。
图12.46 运行结果图
【分析】本题目主要考查的是对使用SqlConnection对象连接数据库的掌握情况。
【关键代码】Default.aspx.cs文件代码如下:
using System.Data; using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string Connection = "Data Source=Localhost;User ID=sa;Password=123456;Database=MySQLData"; SqlConnection con = new SqlConnection(Connection); try { con.Open(); if (con.State == ConnectionState.Open) { Label1.Text = "数据库连接成功。<br><br />"; Label1.Text += con.ConnectionString; } con.Close(); } catch (Exception ee) //抛出异常 { Label1.Text = ee.Message; } } }
习题12-2 在Visual Studio 2012中新建一个网站,命名为chapter12_2。在该网站上添加一个Web页面,命名为Default.aspx。在该网页上添加一个Button控件和一个Label控件。在Button控件的单击事件中使用OleDbConnection对象连接在习题11-1中创建的Access数据库MyData。运行结果如图12.47所示。
图12.47 运行结果图
【分析】本题目主要考查的是对使用OleDbConnection对象连接Access数据库的掌握情况。
【关键代码】Default.aspx.cs文件代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.OleDb; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("MyData.accdb") + ""; OleDbConnection olecon = new OleDbConnection(str); try { olecon.Open(); Label1.Text = "数据库连接成功。<br /><br />"; Label1.Text += olecon.ConnectionString; olecon.Close(); } catch (Exception ee) { Label1.Text = ee.Message; } } }
习题12-3 在Visual Studio 2012中新建一个网站,命名为chapter12_3。在该网站上添加一个Web页面,名称为Default.aspx。在该页面上添加一个TextBox控件、一个Button控件和一个GridView控件。使用代码连接数据库MySQLData,然后用Command对象查询数据,运行结果如图12.48和图12.49所示。
图12.48 运行结果图(1) | 图12.49 运行结果图(2) |
【分析】本题目主要考查的是对使用Conmmand对象查询数据的掌握程度。
【关键代码】Default.aspx.cs文件代码如下:
using System.Data; using System.Data.SqlClient; using System.Configuration; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnSelect_Click(object sender, EventArgs e) { string s = ConfigurationManager.AppSettings["ConnectionString"].ToString(); SqlConnection sqlcon = new SqlConnection(s); if (this.txtName.Text != "") { sqlcon.Open(); string str = "select * from fruit where taste=@taste"; SqlCommand sqlcom = new SqlCommand(str, sqlcon); sqlcom.Parameters.Add("@taste", SqlDbType.VarChar, 20).Value = this.txtName.Text.Trim(); SqlDataAdapter sqlda = new SqlDataAdapter(sqlcom); DataSet ds = new DataSet(); sqlda.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { GridView1.DataSource = ds; GridView1.DataBind(); } else { Response.Write("<script>alert('没有相关记录')</script>"); } sqlda.Dispose(); ds.Dispose(); sqlcon.Close(); } else this.bind(); } protected void bind() { string s = ConfigurationManager.AppSettings["ConnectionString"].ToString(); SqlConnection sqlcon = new SqlConnection(s); sqlcon.Open(); string str = "select * from fruit "; SqlDataAdapter sqlda = new SqlDataAdapter(str, sqlcon); DataSet ds = new DataSet(); sqlda.Fill(ds); GridView1.DataSource = ds; GridView1.DataBind(); sqlda.Dispose(); ds.Dispose(); sqlcon.Close(); } }
Web.config文件代码如下:
<configuration> <appSettings> <add key="ConnectionString" value="Data Source=Localhost;User ID=sa; Password= 123456; Database =MySQLData"/> </appSettings> </configuration>
习题12-4 在Visual Studio 2012中新建一个网站,命名为chapter12_4。在该网站上添加一个Web页面,命名为Default.aspx。在该页面上添加一个TextBox控件、一个Button控件和一个GridView控件。使用代码连接数据库MySQLData,然后用Command对象查询数据,运行结果如图12.50所示。
图12.50 运行结果图
【分析】本题目主要考查的是对使用DataReader对象读取数据的掌握程度。
【关键代码】Default.aspx.cs文件代码如下:
using System.Configuration ; using System.Data ; using System.Data .SqlClient ; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string myStr = ConfigurationManager.AppSettings["ConnectionString"].ToString(); SqlConnection myConn = new SqlConnection(myStr); string sqlStr = "select * from fruit "; SqlCommand myCmd = new SqlCommand(sqlStr, myConn); myCmd.CommandType = CommandType.Text; try { myConn.Open(); SqlDataReader myDr = myCmd.ExecuteReader(); this.Label1.Text = "序号 水果名<br><br />"; while (myDr.Read()) { this.Label1.Text += " " + myDr["ID"] + " " + myDr["Name"] + "<br>"; } myDr.Close(); } catch (SqlException ex) { Response.Write(ex.ToString()); } finally { myConn.Close(); } } } }
Web.config文件代码如下:
<configuration> <appSettings> <add key="ConnectionString" value="Data Source=Localhost;User ID=sa;Password=123456; Database= MySQLData"/> </appSettings> </configuration>
习题12-5 在Visual Studio 2012中新建一个网站,命名为chapter12_5。在该网站上添加一个Web页面,名称为Default.aspx。在该页面上添加一个TextBox控件、一个Button控件和一个GridView控件。使用代码连接数据库MySQLData,然后用Command对象查询数据,运行结果如图12.51所示。
图12.51 运行结果图
【分析】本题目主要考查的是对数据源控件SqlDataSource的掌握程度。
【关键代码】自动生成的Web.config文件代码如下:
<?xml version="1.0"?> <configuration> <connectionStrings> <add name="MySQLDataConnectionString" connectionString="Data Source=WIN-RKPKQFBLG6C\SMILE;Initial Catalog=MySQLData;User ID=sa;Password=123456" providerName="System.Data.SqlClient"/> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> </system.web> </configuration>