ado.net

第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.SqlClient
SqlConnection;SqlCommand;SqlDataReader;SqlDataAdapter
System.Data.Odbc
OdbcConnection;OdbcCommand;OdbcDataReader;OdbcDataAdapter
System.Data.OleDb
OleDbConnection;OleDbCommand;OleDbDataReader;OleDbDataAdapter
System.Data.OracleClient
OracleConnection;OracleCommand;OracleDataReader;OracleDataAdapter
7.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.jpg
2
李明
男
1988-5-1
上海
2.jpg
3
王彬
男
1989-9-25
郑州
3.jpg
4
陈飞
男
1988-6-8
洛阳
4.jpg
5
王燕
女
1989-12-11
沈阳
5.jpg
6
陈武
男
1987-7-21
广州
6.jpg
7
刘华
女
1990-3-15
广州
7.jpg
8
翟力
女
1989-6-11
深圳
8.jpg
9
大侠
男
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
命令类型
Parameters
Parameters对象集合
  
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数据访问
  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值