第7章 ADO.NET数据访问 ASP.NET应用程序的数据访问是通过ADO.NET进行的,ADO.NET可以使Web应用程序从各种数据源中快速访问数据。从传统的数据库到XML数据存储,各种各样的数据源都能连接到ADO.NET,从而更加灵活地访问数据,减少访问数据所需的代码,提高了开发效率和Web应用程序的性能。 本章首先介绍ADO.NET的基本知识,然后再详细介绍在ASP.NET中的几种数据访问方法,而有关数据绑定的内容则放到第8章再进行介绍。 本章的学习目标● 了解ADO.NET的基本知识● 掌握ADO.NET与数据库的连接方法● 掌握利用Command访问数据库的方法● 掌握利用DataAdapter访问数据库的方法7.1 ADO.NET概述 ADO.NET是.NET Framework提供的数据访问的类库,ADO.NET 对 Microsoft SQL Server、Oracle 和 XML 等数据源提供一致的访问。应用程序可以使用 ADO.NET 连接到这些数据源,并检索和更新所包含的数据。 ADO.NET用于数据访问的类库包含.NET Framework数据提供程序和DataSet两个组件。.NET Framework数据提供程序与DataSet之间的关系如图7-1所示。图7-1 ADO.NET的组成 .NET Framework数据提供程序包含以下4个核心类。● Connection:建立与数据源的连接。● Command:对数据源执行操作命令,用于修改数据、查询数据和运行存储过程等。● DataReader:从数据源获取返回的数据。● DataAdapter:用数据源数据填充DataSet,并可以处理数据更新。 DataSet是ADO.NET的断开式结构的核心组件。设计DataSet的目的是为了实现独立于任何数据源的数据访问,可以把它看成是内存中的数据库,是专门用来处理数据源中读出的数据。 DataSet的优点就是离线式,一旦读取到数据库中的数据后,就在内存中建立数据库的副本,在此之后的操作,直到执行更新命令为止,所有的操作都是在内存中完成的。不管底层的数据库是哪种形式,DataSet的行为都是一致的。 DataSet是数据表(DataTable)的集合,它可以包含任意多个数据表,而且每个DataSet中的数据表对应一个数据源中的数据表(Table)或者是数据视图(View)。DataSet的结构如图7-2所示。图7-2 DataSet的结构 ASP.NET数据访问程序的开发流程有以下几个步骤: (1) 利用Connection对象创建数据连接。 (2) 利用Command对象数据源执行SQL命令。 (3) 利用DataReader对象读取数据源的数据。 (4) DataSet对象与DataAdapter对象配合,完成数据的查询和更新操作。 在ADO.NET中,连接数据源有4种接口:SQLClient、OracleClient 、ODBC、OLEDB。其中SQLClient是Microsoft SQL Server数据库专用连接接口,OracleClient是Oracle数据库专用的连接接口,ODBC和OLEDB可用于其他数据源的连接。在应用程序中使用任何一种连接接口时,必须在后台代码中引用对应的名称空间,类的名称也随之发生变化,如表7-1所示。 表7-1 数据连接方式名称空间与对应的类名称名 称 空 间对应的类名称System.Data.SqlClientSqlConnection;SqlCommand;SqlDataReader;SqlDataAdapterSystem.Data.OdbcOdbcConnection;OdbcCommand;OdbcDataReader;OdbcDataAdapterSystem.Data.OleDbOleDbConnection;OleDbCommand;OleDbDataReader;OleDbDataAdapterSystem.Data.OracleClientOracleConnection;OracleCommand;OracleDataReader;OracleDataAdapter7.2 使用Connection连接数据库 本书数据源以Microsoft SQL Server 2005数据库为例,也就是说,使用SQLClient连接接口,访问数据库使用SqlConnection、SqlCommand、SqlDataReader和SqlDataAdapter对象。 在建立数据库连接之前,首先在Web.Config配置文件中建立一个连接字符串,然后建立数据库连接。 【例7-1】演示如何建立Microsoft SQL Server 2005数据库连接。 (1) 运行VWD 2008,新建一个名为Accessdatabase的ASP.NET网站。 (2) 在【解决方案资源管理器】中,用鼠标右键单击网站名,选择【添加新项】命令,在弹出的对话框中选择【SQL Server数据库】模板,更改名称为MyDatabase.mdf,创建数据库。如图7-3所示。图7-3 新建数据库 (3) 单击【添加】按钮,弹出如图7-4所示的对话框,单击【确定】按钮,将数据库MyDatabase.mdf保存到App_Data文件夹中。图7-4 创建数据库文件夹 (4) 在【数据库资源管理器】中,双击数据库名MyDatabase.mdf,数据库资源管理器显示如图7-5所示。图7-5 数据库资源管理器 (5) 用鼠标右键单击【表】结点,创建student表,表的结构和记录如表7-2所示。表7-2 student表的结构和记录No(varchar,10)(编号,主键)Name(varchar,50)(姓名)Sex(char,2) (性别)birth (datetime)(出生日期)Address(varchar,50)(地址)Photo(varchar,50)(照片)1张小兵男1989-6-29北京1.jpg2李明男1988-5-1上海2.jpg3王彬男1989-9-25郑州3.jpg4陈飞男1988-6-8洛阳4.jpg5王燕女1989-12-11沈阳5.jpg6陈武男1987-7-21广州6.jpg7刘华女1990-3-15广州7.jpg8翟力女1989-6-11深圳8.jpg9大侠男1989-6-1沈阳9.jpg (6) 打开web.config配置文件,将<connectionStrings/>标记用下面代码替换。 <connectionStrings> <add name="ConnectionString" connectionString="Data Source=./SQLEXPRESS; AttachDbFilename=|DataDirectory|/mydatabase.mdf;Integrated Security=True;User Instance=True"/> </connectionStrings> 其中,Data Source表示SQL Server 2005数据库服务器名称,AttachDbFilename表示数据库的路径和文件名,|DataDirectory| 表示网站默认数据库路径App_Data。 (7) 在网站中添加一个名为connection.aspx的网页,切换到【设计】视图,向该页面拖放一个Label控件,使用默认控件名称,然后在connection.aspx.cs页面中添加下面代码。 //引用数据库访问名称空间 using System.Data.SqlClient; … protected void Page_Load(object sender, EventArgs e) { //从web.config配置文件取出数据库连接串 string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; //建立数据库连接对象 SqlConnection sqlconn = new SqlConnection(sqlconnstr); //打开连接对象 sqlconn.Open(); Label1.Text = "成功建立Sql Server 2005数据库连接"; //关闭连接对象 sqlconn.Close(); sqlconn = null; } (8) 程序运行效果如图7-6所示。图7-6 connection.aspx运行效果 在访问数据库的数据之前,需要使用Connection对象的Open方法把数据库打开,并在完成数据库的操作之后使用Connection对象的Close方法将数据库关闭。7.3 使用Command对象执行数据库命令 Command对象是用来执行数据库操作命令的,比如对数据库中数据表记录的查询、增加、修改或删除等都是要通过Command对象来实现的。一个数据库操作命令可以用SQL语句来表达,包括SELECT语句、UPDATE语句、DELETE语句、INSERT语句等。Command对象可以传递参数并返回值,同时Command也可以调用数据库中的存储过程。 像Connection对象一样,对于操作SQL Server数据库而言,使用SqlCommand对象。Command对象的属性如表7-3所示。表7-3 Command对象的属性属 性说 明Connection包含了数据库连接信息的Connection对象CommandText要运行的SQL命令CommandType命令类型ParametersParameters对象集合 7.3.1 使用Command对象查询数据库的数据 使用Command对象查询数据库数据的一般步骤为:先建立数据库连接;然后创建Command对象,并设置它的Connection和CommandText两个属性,分别表示数据库连接和需要执行的SQL命令;接下来使用Command对象的ExecuteReader方法,把返回结果放在DataReader对象中;最后通过循环,处理数据库查询结果。 【例7-2】在【例7-1】基础上,介绍如何使用Command对象查询数据库的数据。 (1) 在Accessdatabase网站中添加一个名为command_select.aspx的网页,切换到【设计】视图,向该页面拖放一个Label控件,使用默认控件名称。 (2) 在command_select.aspx.cs页面中添加下面代码。 //引用数据库访问名称空间 using System.Data.SqlClient; ??? protected void Page_Load(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立Command对象 SqlCommand sqlcommand = new SqlCommand(); //给sqlcommand的Connection属性赋值 sqlcommand.Connection = sqlconn; //打开连接 sqlconn.Open(); //SQL命令赋值 sqlcommand.CommandText = "select * from student"; //建立DataReader对象,并返回查询结果 SqlDataReader sqldatareader=sqlcommand.ExecuteReader(); //逐行遍历查询结果 while(sqldatareader.Read()) { Label1.Text += sqldatareader.GetString(0) + " "; Label1.Text += sqldatareader.GetString(1) + " "; Label1.Text += sqldatareader.GetString(2) + " "; Label1.Text += sqldatareader.GetDateTime(3) + " "; Label1.Text += sqldatareader.GetString(4) + " "; Label1.Text += sqldatareader.GetString(5) + "<br />"; }; sqlcommand = null; sqlconn.Close(); sqlconn = null; } (3) 程序运行效果如图7-7所示。图7-7 command_select.aspx运行效果7.3.2 使用Command对象增加数据库的数据 使用Command对象增加数据库数据的一般步骤为:先建立数据库连接;然后创建Command对象,设置它的Connection和CommandText两个属性,并使用Command对象的Parameters属性来设置输入参数;最后使用Command对象的ExecuteNonquery方法执行数据库数据增加命令,其中ExecuteNonquery方法表示要执行的是没有返回数据的命令。 【例7-3】演示如何使用Command对象增加新数据。 (1) 在【解决方案资源管理器】中,用鼠标右键单击网站名,选择【新建文件夹】命令,新建文件夹,改名为image,用于存放学生照片。 (2) 在Accessdatabase网站中添加一个名为command_insert.aspx的网页。 (3) 将command_insert页面设计为如图7-8所示的形式。图7-8 command_insert.aspx的设计页面 对应【源】视图中的代码如下: <table style="width: 320px; height: 240px"> <tr> <td style="width: 100px; text-align: right"> 学号:</td> <td style="width: 220px"> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px; text-align: right"> 姓名:</td> <td style="width: 220px"> <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px; text-align: right"> 性别:</td> <td style="width: 220px"> <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem Selected="True">男</asp:ListItem> <asp:ListItem>女</asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td style="width: 100px; text-align: right"> 年龄:</td> <td style="width: 220px"> <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px; text-align: right"> 地址:</td> <td style="width: 220px"> <asp:TextBox ID="TextBox4" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px; text-align: right"> 照片:</td> <td style="width: 220px"> <asp:FileUpload ID="FileUpload1" runat="server" /></td> </tr> <tr> <td colspan="2" style="text-align: center"> <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" /></td> </tr> </table> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> (4) 双击设计视图中的【提交】按钮,添加如下所示的后台代码。 protected void Button1_Click(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立Command对象 SqlCommand sqlcommand = new SqlCommand(); sqlcommand.Connection = sqlconn; //把SQL语句赋给Command对象 sqlcommand.CommandText = "insert into student(no,name,sex,birth,address,photo) values (@no,@name,@sex,@birth,@address,@photo)"; sqlcommand.Parameters.AddWithValue("@no",TextBox1.Text); sqlcommand.Parameters.AddWithValue("@name",TextBox2.Text); sqlcommand.Parameters.AddWithValue("@sex",DropDownList1.Text); sqlcommand.Parameters.AddWithValue("@birth",TextBox3.Text); sqlcommand.Parameters.AddWithValue("@address",TextBox4.Text); sqlcommand.Parameters.AddWithValue("@photo",FileUpload1.FileName); try { //打开连接 sqlconn.Open(); //执行SQL命令 sqlcommand.ExecuteNonQuery(); //把学生的照片上传到网站的image文件夹中 if (FileUpload1.HasFile == true) { FileUpload1.SaveAs(Server.MapPath(("~/image/") + FileUpload1.FileName)); } Label1.Text = "成功增加记录"; } catch (Exception ex) { Label1.Text = "错误原因:"+ ex.Message; } finally { sqlcommand = null; sqlconn.Close(); sqlconn = null; } } (5) 程序运行效果如图7-9所示。图7-9 command_insert.aspx的运行效果7.3.3 使用Command对象删除数据库的数据 使用Command对象删除数据库数据的一般步骤为:先建立数据库连接;然后创建Command对象,设置它的Connection和CommandText两个属性,并使用Command对象的Parameters属性来传递参数;最后使用Command对象的ExecuteNonquery方法执行数据库数据删除命令。 【例7-4】使用Command对象删除数据。 (1) 在Accessdatabase网站中添加一个名为command_delete.aspx的网页。 (2) 向command_delete页面添加2个Label控件,1个TextBox控件,1个Button控件,其中Button控件作为【删除】按钮。 (3) 双击设计视图中的【删除】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { int intDeleteCount; string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立Command对象 SqlCommand sqlcommand = new SqlCommand(); //给Command对象的Connection和CommandText属性赋值 sqlcommand.Connection = sqlconn; sqlcommand.CommandText = "delete from student where no=@no"; sqlcommand.Parameters.AddWithValue("@no",TextBox1.Text); try { sqlconn.Open(); intDeleteCount=sqlcommand.ExecuteNonQuery(); if (intDeleteCount>0) Label1.Text = "成功删除记录"; else Label1.Text = "该记录不存在"; } catch (Exception ex) { Label1.Text = "错误原因:"+ex.Message; } finally { sqlcommand = null; sqlconn.Close(); sqlconn = null; } } (4) 程序运行效果如图7-10所示。图7-10 command_delete.aspx的运行效果7.3.4 使用Command对象修改数据库的数据 使用Command对象修改数据库数据的一般步骤为:先建立数据库连接;然后创建Command对象,设置它的Connection和CommandText两个属性,并使用Command对象的Parameters属性来传递参数;接下来使用Command对象的ExecuteNonquery方法执行数据库数据修改命令。【例7-5】同时说明存储过程的调用方法。 【例7-5】演示如何使用Command对象修改数据。 (1) 打开Accessdatabase网站,为MyDatabase.mdf数据库建立名为update_student的存储过程。在【数据库资源管理器】中,用鼠标右键单击【存储过程】结点,如图7-11所示。图7-11 数据库资源管理器 选择【添加新存储过程】命令,在存储过程定义窗口中,添加如下代码,最后单击工具栏中的【保存】按钮,保存存储过程到数据库中。 CREATE PROCEDURE dbo.update_student ( //入口参数 @no varchar(10), @name varchar(50), @sex varchar(2) , @birth datetime, @address varchar(50), @photo varchar(50) ) AS //修改学号为@no的学生信息 update student set name=@name,sex=@sex,birth=@birth,address=@address, photo=@photo where no=@no RETURN (2) 在Accessdatabase网站中添加一个名为command_update.aspx的网页,将command_ update页面设计为如图7-8所示的形式。 (3) 双击设计视图中的【提交】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { int intUpdateCount; string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立Command对象 SqlCommand sqlcommand = new SqlCommand(); sqlcommand.Connection = sqlconn; //把存储过程名称赋给Command对象的CommandText属性 sqlcommand.CommandText = "update_student"; //说明命令类型为存储过程 sqlcommand.CommandType = CommandType.StoredProcedure; sqlcommand.Parameters.AddWithValue("@no", TextBox1.Text); sqlcommand.Parameters.AddWithValue("@name", TextBox2.Text); sqlcommand.Parameters.AddWithValue("@sex", DropDownList1.Text); sqlcommand.Parameters.AddWithValue("@birth", TextBox3.Text); sqlcommand.Parameters.AddWithValue("@address", TextBox4.Text); sqlcommand.Parameters.AddWithValue("@photo", FileUpload1.FileName); try { //打开连接 sqlconn.Open(); //执行SQL命令 intUpdateCount=sqlcommand.ExecuteNonQuery(); //把学生的照片上传到网站的image文件夹中 if (FileUpload1.HasFile == true) { FileUpload1.SaveAs(Server.MapPath(("~/image/") + FileUpload1.FileName)); } if (intUpdateCount > 0) Label1.Text = "成功修改记录"; else Label1.Text = "该记录不存在"; } catch (Exception ex) { Label1.Text = "错误原因:" + ex.Message; } finally { sqlcommand = null; sqlconn.Close(); sqlconn = null; } } (4) 程序运行效果如图7-12所示。图7-12 command_ update.aspx的运行效果7.3.5 数据库事务处理 对于数据库管理系统来说,如果没有显式定义事务的开始和结束,就默认一条SQL语句为一个单独事务,多数情况下采用这种默认方式就足够了。但是,有时需要将一组SQL语句作为一个事务,要不全做,要不全不做。 在ASP.NET中,可以使用Connection和Transaction对象开始、提交和回滚事务。一般步骤为:调用Connection对象的BeginTransaction方法来标记事务的开始,BeginTransaction方法返回对Transaction的引用;将Transaction对象赋给Command的Transaction属性;执行事务操作;如果事务操作成功,使用Transaction对象的Commit方法提交事务,否则,使用Rollback方法回滚事务。 【例7-6】演示事务处理。 (1) 在Accessdatabase网站中添加一个名为transaction.aspx的网页。 (2) 向transaction页面添加1个Label控件,1个Button控件,其中Button控件作为【事务提交】按钮。 (3) 双击设计视图中的【事务提交】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); sqlconn.Open(); //开始事务 SqlTransaction tran=sqlconn.BeginTransaction(); SqlCommand sqlcommand = new SqlCommand(); sqlcommand.Connection = sqlconn; sqlcommand.Transaction = tran; try { sqlcommand.CommandText = "update student set address='beijing' where no=1"; sqlcommand.ExecuteNonQuery(); sqlcommand.CommandText = "update student set address='zhengzhou' where no=2"; sqlcommand.ExecuteNonQuery(); tran.Commit(); Label1.Text = "事务提交成功"; } catch (Exception ex) { tran.Rollback(); Label1.Text = "事务提交失败:" + ex.Message; } finally { sqlcommand = null; sqlconn.Close(); sqlconn = null; } } 从7.3节例子中可以看出,Command对象的ExecuteNonQuery方法在执行数据更新SQL语句(如INSERT,UPDATE或DELETE)时使用,这些语句的共同特点是没有返回数据。此外,ExecuteNonQuery方法可以返回一个整数,表示已经执行语句在数据库中影响数据的行数。 如果需要执行有返回结果的SQL语句(如SELECT),那么就需要使用Command对象的ExecuteReader方法,并将执行结果放到DataReader中。这个对象是一个专门读取数据的对象,除了能做读取数据工作之外,其他什么也不能做,所以这是一种简单的读取数据的方法。7.4 使用DataAdapter对象执行数据库命令 对于SQL SERVER接口,使用的是SqlDataAdapter对象,在使用DataAdapter对象时,只需分别设置表示SQL命令和数据库连接的两个参数,就可以通过它的Fill方法把查询结果放在一个DataSet对象中。 在一个DataSet对象实例中,可以包含多个DataTable,而一个DataTable可以包含多个DataRow。 当把一个DataSet中的一个数据表复制到一个DataTable中之后,可以通过对DataTable数据的访问来实现对DataSet中数据的访问了。除此之外,还可以通过修改DataTable中的数据来更新DataSet。 DataRow表示DataTable的数据行,一个DataTable中的数据行会有很多。针对一个DataTable,它的Rows属性表示这个表的所有数据行,是一个集合,类名为DataRowCollection,它的每个元素的类型是DataRow。 通过7.4节的例子说明使用DataAdapter和DataSet读取和修改数据库数据的方法。7.4.1 使用DataAdapter对象查询数据库的数据 使用DataAdapter对象查询数据库数据的一般步骤为:首先建立数据库连接;然后利用数据库连接和SELECT语句建立DataAdapter对象,并使用DataAdapter对象的Fill方法把查询结果放在DataSet对象的一个数据表中;接下来将该数据表复制到DataTable对象中;最后实现对DataTable对象中数据的查询。 【例7-7】演示如何使用DataAdapter对象查询数据库的数据。 (1) 在Accessdatabase网站中添加一个名为DataAdapter_select.aspx的网页,切换到【设计】视图,向该页面拖放一个Label控件,使用默认控件名称。 (2) 在DataAdapter _select.aspx.cs页面中添加如下所示的代码。 //引用数据库访问名称空间 using System.Data.SqlClient; ??? protected void Page_Load(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立DataSet对象 DataSet ds = new DataSet(); //建立DataTable对象 DataTable dtable; //建立DataRowCollection对象 DataRowCollection coldrow; //建立DataRow对象 DataRow drow; //打开连接 sqlconn.Open(); //建立DataAdapter对象 SqlDataAdapter sqld = new SqlDataAdapter("select * from student", sqlconn); //用Fill方法返回的数据,填充DataSet,数据表取名为tabstudent sqld.Fill(ds, "tabstudent"); //将数据表tabstudent的数据复制到DataTable对象 dtable = ds.Tables["tabstudent"]; //用DataRowCollection对象获取这个数据表的所有数据行 coldrow = dtable.Rows; //逐行遍历,取出各行的数据 for (int inti = 0; inti < coldrow.Count; inti++) { drow = coldrow[inti]; Label1.Text += "学号:" + drow[0]; Label1.Text += " 姓名:" + drow[1]; Label1.Text += " 性别:" + drow[2]; Label1.Text += " 出生日期:" + drow[3]; Label1.Text += " 地址:" + drow[4] + "<br />"; } sqlconn.Close(); sqlconn = null; } (3) 程序运行效果如图7-13所示。图7-13 DataAdapter _select.aspx运行效果 关于显示DataSet中的数据还有更简单的方法,就是绑定GridView控件等,详细内容在第8章中进行介绍。7.4.2 使用DataAdapter对象修改数据库的数据 使用DataAdapter对象修改数据库数据的一般步骤为:首先建立数据库连接;然后利用数据库连接和SELECT语句建立DataAdapter对象;并配置它的UpdateCommand属性,定义修改数据库的UPDATE语句;使用DataAdapter对象的Fill方法把SELECT语句的查询结果放在DataSet对象的数据表中;接下来将该数据表复制到DataTable对象中;最后实现对DataTable对象中数据的修改,并通过DataAdapter对象的Update方法向数据库提交修改数据。 【例7-8】演示如何使用DataAdapter对象修改数据库的数据。 (1) 在Accessdatabase网站中添加一个名为DataAdapter_update.aspx的网页。 (2) 向DataAdapter_ update页面添加1个Label控件,1个Button控件,其中Button控件作为【更新】提交按钮。 (3) 双击设计视图中的【更新】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立DataSet对象 DataSet ds = new DataSet(); //建立DataTable对象 DataTable dtable; //建立DataRowCollection对象 DataRowCollection coldrow; //建立DataRow对象 DataRow drow; //打开连接 sqlconn.Open(); //建立DataAdapter对象 SqlDataAdapter sqld = new SqlDataAdapter("select * from student", sqlconn); //自己定义Update命令,其中@NAME,@NO是两个参数 sqld.UpdateCommand = new SqlCommand("UPDATE student SET NAME = @NAME WHERE NO = @NO", sqlconn); //定义@NAME参数,对应于student表的NAME列 sqld.UpdateCommand.Parameters.Add("@NAME", SqlDbType.VarChar, 50, "NAME"); //定义@NO参数,对应于student表的NO列,而且@NO是修改前的原值 SqlParameter parameter = sqld.UpdateCommand.Parameters.Add("@NO", SqlDbType.VarChar, 10); parameter.SourceColumn = "NO"; parameter.SourceVersion = DataRowVersion.Original; //用Fill方法返回的数据,填充DataSet,数据表取名为tabstudent sqld.Fill(ds, "tabstudent"); //将数据表tabstudent的数据复制到DataTable对象 dtable = ds.Tables["tabstudent"]; //用DataRowCollection对象获取这个数据表的所有数据行 coldrow = dtable.Rows; //修改操作,逐行遍历,取出各行的数据 for (int inti = 0; inti < coldrow.Count; inti++) { drow = coldrow[inti]; //给每位学生姓名后加上字母A drow[1]=drow[1]+"A"; } //提交更新 sqld.Update(ds, "tabstudent"); sqlconn.Close(); sqlconn = null; Label1.Text = "更新成功"; } (4) 程序运行效果如图7-14所示。图7-14 DataAdapter_ update.aspx的运行效果7.4.3 使用DataAdapter对象增加数据库的数据 使用DataAdapter对象增加数据库数据的一般步骤为:首先建立数据库连接;然后利用数据库连接和SELECT语句建立DataAdapter对象;并建立 CommandBuilder 对象自动生成 DataAdapter的Command命令,否则就要自己给UpdateCommand、InsertCommand、DeleteCommand属性定义SQL更新语句;使用DataAdapter对象的Fill方法把SELECT语句的查询结果放在DataSet对象的数据表中;接下来将该数据表复制到DataTable对象中;最后实现对DataTable对象中数据的增加,并通过DataAdapter对象的Update方法向数据库提交数据。 【例7-9】演示如何使用DataAdapter对象增加一条学生记录。 (1) 在Accessdatabase网站中添加一个名为DataAdapter_insert.aspx的网页。 (2) 向DataAdapter_insert页面添加1个Label控件,1个Button控件,其中Button控件作为【增加】提交按钮。 (3) 双击设计视图中的【增加】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); //建立DataSet对象 DataSet ds = new DataSet(); //建立DataTable对象 DataTable dtable; //建立DataRow对象 DataRow drow; //打开连接 sqlconn.Open(); //建立DataAdapter对象 SqlDataAdapter sqld = new SqlDataAdapter("select * from student", sqlconn); //建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写 //Insertcommand ,deletecommand , updatecommand 命令。 SqlCommandBuilder cb = new SqlCommandBuilder(sqld); //用Fill方法返回的数据,填充DataSet,数据表取名为tabstudent sqld.Fill(ds, "tabstudent"); //将数据表tabstudent的数据复制到DataTable对象 dtable = ds.Tables["tabstudent"]; //增加新记录 drow = ds.Tables["tabstudent"].NewRow(); //给该记录赋值 drow[0] = "19"; drow[1] = "陈峰"; drow[2] = "男"; ds.Tables["tabstudent"].Rows.Add(drow); //提交更新 sqld.Update(ds, "tabstudent"); sqlconn.Close(); sqlconn = null; Label1.Text = "增加成功"; } (4) 程序运行效果如图7-15所示。图7-15 DataAdapter_insert.aspx的运行效果7.4.4 使用DataAdapter对象删除数据库的数据 使用DataAdapter对象删除数据库数据的一般步骤为:首先建立数据库连接;然后利用数据库连接和SELECT语句建立DataAdapter对象;并建立 CommandBuilder 对象自动生成 DataAdapter的Command命令;使用DataAdapter对象的Fill方法把SELECT语句的查询结果放在DataSet对象的数据表中;接下来将该数据表复制到DataTable对象中;最后实现对DataTable对象中数据的删除,并通过DataAdapter对象的Update方法向数据库提交数据。 【例7-10】演示如何使用DataAdapter对象删除符合条件的学生记录。 (1) 在Accessdatabase网站中添加一个名为DataAdapter_delete.aspx的网页。 (2) 向DataAdapter_delete页面添加1个Label控件,1个Button控件,其中Button控件作为【删除】按钮。 (3) 双击设计视图中的【删除】按钮,添加如下所示的后台代码。 using System.Data.SqlClient; ??? protected void Button1_Click(object sender, EventArgs e) { string sqlconnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection sqlconn = new SqlConnection(sqlconnstr); DataSet ds = new DataSet(); DataTable dtable; DataRowCollection coldrow; DataRow drow; sqlconn.Open(); //建立DataAdapter对象 SqlDataAdapter sqld = new SqlDataAdapter("select * from student", sqlconn); //建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写 //Insertcommand ,deletecommand , updatecommand 命令。 SqlCommandBuilder cb = new SqlCommandBuilder(sqld); //用Fill方法返回的数据,填充DataSet,数据表取名为tabstudent sqld.Fill(ds, "tabstudent"); dtable = ds.Tables["tabstudent"]; coldrow = dtable.Rows; //逐行遍历,删除地址为空的记录 for (int inti = 0; inti < coldrow.Count; inti++) { drow = coldrow[inti]; if (drow["address"].ToString()== "") drow.Delete(); } //提交更新 sqld.Update(ds, "tabstudent"); sqlconn.Close(); sqlconn = null; Label1.Text = "删除成功"; } (4) 程序运行效果如图7-16所示。图7-16 DataAdapter_delete.aspx的运行效果实验7 ADO.NET数据库访问1. 实验目的 熟悉ADO.NET数据库访问技术,掌握Command和DataAdapter对象操作数据库数据的方法。2. 实验内容和要求 (1) 新建名字为Accessdatabase_ Exercise的网站。 (2) 在网站的App_Data文件夹中,建立数据库MyDatabase_ Exercise.mdf。 (3) 在该数据库中建立一张职工表,并且添加一些模拟的职工记录。其关系模式如下: Employees(ID,NAME,SEX,AGE,Dateofwork,FilenameofPhoto) (4) 在web.config配置文件中,修改<connectionStrings/>标记如下。 <connectionStrings> <add name="ConnectionString" connectionString="Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/ MyDatabase_ Exercise.mdf;Integrated Security=True;User Instance=True"/> </connectionStrings> (5) 添加一个网页,利用Command对象实现新职工的录入。 (6) 添加一个网页,利用Command对象实现删除指定编号的职工记录。 (7) 添加一个网页,利用Command对象实现修改指定编号的职工信息。 (8) 添加一个网页,利用DataAdapter对象实现查询职工信息,并显示到网页的Label控件上。 ? 158 ?ASP.NET 3.5网站开发实例教程 ? 157 ?第7章 ADO.NET数据访问