ado.net

来源:互联网 发布:手机淘宝店铺故事 编辑:程序博客网 时间:2024/05/22 14:11
第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数据访问