DataSet

 

在能够使用DataSet对象之前,必须要先建立DataAdapter对象,并且以其为桥梁取得底层数据源的内容。

DataAdapter是数据库与断开对象之间的桥梁,同样是数据接口的成员之一。它从Command取得数据,然后将其传给另外一个ADO.NET对象——DataSet,过程如图所示:

 

DataSet是一个数据表示对象,它本身封装从DataAdapter传来的数据,与数据库没有任何关系。

 

SqlDataAdapter对象的建立:

SqlDataAdapter myDa=new SqlDataAdapter( );

myDa.SelectCommand=myCmd;

 

SqlDataAdapter myDa=new SqlDataAdapter(myCmd);  // myCmd为Command对象

 

若不想用Command对象,则用下面方法:

SqlDataAdapter myDa=new SqlDataAdapter(strSql, myConn);  //strSql为Command对象描述,//myConn为SqlConnection对象

 

若只是单纯地用SqlDataAdapter对象来完成一些简单的功能,不需要连接对象,同时也不直接与Command对象互动,则用下面方法:

SqlDataAdapter myDa=new SqlDataAdapter(sql,connString);  //sql为SQL语句,connString为//连接字符串

 

DataSet类属于System.Data命名空间,不同于数据接口类,DataSet通用于所有类型的数据源,因此没有特定的数据源版本。

DataSet由DataAdapter对象所提供的Fill方法取得数据库返回的数据内容,因此在能够使用DataSet之前,你首先必须建立返回数据所需的DataAdapter对象,并且指定其Command对象及搜索数据的SQL语句。这一部分必须通过指定DataAdapter的SelectCommand属性为合适的Command对象来完成。 

DataSet对象本身并不需要连接,因此只要直接建立一个空的DataSet对象就可以使用,语法如下式:

DataSet dataSet=new DataSet( );

它最简单的用法便是直接拿来当做参数,导入Fill方法,取得SQL语句所返回的内容与相关表架构。

theDataAdapter.Fill(dataSet);       //theDataAdapter为DataAdapter对象

 

 

DataSet对象是DataTable对象的集合,而DataTable则由DataColumn和DataRow组成。

一个DataSet对象包含实体数据库中一个或是一个以上表的数据。换句话说,它是表的集体。因此可以使用Tables属性,根据输入的索引值,取出其中特定的DataTable对象,语法如下:

DataTable myDT=myDataSet.Tables[intIndex];

 

Tables属性传回一个DataTablesCollection对象,这个对象包含了DataSet对象中所有表集合,输入索引值则用以指定返回集合中特定的DataTable对象。

DataTableCollection myDTC=myDataSet.Tables;     //myDataSet为DataSet对象

DataTable myDT=myDTC[0];                    //myDTC[0]为表集合中的第1个表对象

以上的程序代码,首先取得表集合对象,然后取出集合中的第1个表对象。

 

DataTable与表相互对应,它由一个以上的列组成,数据本身储存在列中,而列由DataColumn类定义,每一个DataColumn对象代表一个特定的列。DataTable公开了一个名称为Columns的属性,它返回一个包含所有列对象的DataColumnCollection集合对象,取得此集合对象所需的语句如下:

DataColumnCollection myDCC=myDT.Columns;   //myDT为DataTable对象

同样可以由索引值取得特定的域值:

DataColumn myDC=myDCC[0];

或者使用域名代替索引:

DataColumn myDC=myDCC[“CustomerID”];

 

一个DataRow对象代表表中一笔特定的数据,由数目不等的数据列对象DataColumn对象组成。通过这个对象,可以取得表中某笔特定的数据,然后更新其中某个特定列所储存的数据内容。DataTable的Rows属性返回一个包含所有 内容的DataRowCollection集合对象。

DataRowCollection myDRC=myDT.Rows;

 

DataColumn[] dc=new DataColumn[1];

dc[0]=ds.Tables[0].Column[0];

ds.Tables[0].PrimaryKey=dc;

说明:

DataColumn[] dc=new DataColumn[1];

设置一个长度为1的DataColumn数组dc,因为列由DataColumn类定义,每个DataColumn对象代表一个特定的列,所以dc为一列数据(非int型只有一个数据)。

dc[0]=ds.Tables[0].Column[0];

将Tables[0]中的第1列的值赋给dc的第一列(虽然dc为长度为1的列,但还是从0开始计数)。

ds.Tables[0].PrimaryKey=dc;

设置Tables[0]的主键为dc,因为dc中仅有一列,所以Tables[0]只有一个主键。

  

通过DataSet操作数据:

1、查询操作

DataRowCollection集合对象提供了一个搜寻数据的Find。用这个方法,可以根据某个设置为主键值的列,搜索符合特定条件值的行。

另外,DataTable所提供的Select方法,同样可以被用来作为搜索条件。它接受类似SQL语法中的WHERE子句。

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

 

public partial class DataSetSearch : System.Web.UI.Page

{

    private DataSet ds = null; 

    protected void Page_Load(object sender, EventArgs e)

    {

        String connString = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ToString();

        string theSQL = "SELECT * FROM Books";

        SqlDataAdapter adapter = new SqlDataAdapter(theSQL, connString);

 

        ds = new DataSet();

        DataColumn[] dc = new DataColumn[1];

 

        adapter.Fill(ds);

        dc[0] = ds.Tables[0].Columns[0];

        ds.Tables[0].PrimaryKey = dc;

        GVBooks.DataSource = ds;

        GVBooks.DataBind();

    }

    protected void FindButton_Click(object sender, EventArgs e)

    {

        DataRowCollection drCollection = ds.Tables[0].Rows; //返回DataRowCollection集合对象

        DataRow dr  =  null   ;

        if (FindTextBox.Text.Length > 0)

        {

            dr = drCollection.Find(FindTextBox.Text); //调用DataRowCollection对象的Find方法

            FindLabel.Text = dr["bookTitle"].ToString();

        }

    }

    protected void SelectButton_Click(object sender, EventArgs e)

    {

 

        DataTable dt = ds.Tables[0];  //创建DataTable对象

        DataRow[] drs = null ;

        if (SelectTextBox.Text.Length > 0)

        {

            drs = dt.Select(SelectTextBox.Text ); //调用DataTable对象的Select方法

            ResultListBox.Items.Clear();

            foreach (DataRow dr in drs)  //此处的dr非上面FindButton_Click中的dr,只在此处foreach语句中有效

            {

                ResultListBox.Items.Add(new ListItem(dr["bookTitle"].ToString()));

            }

        }

    }

}

 

2、增、删、改操作

:DataRow myRow=myDT.NewRow( ); //通过DataTable对象的NewRow方法建立一个空的DataRow对象,此对象包含了与原始DataTable对象相同的列结构

myRow[0]=value0;    //依次将对应列的数据值填入适当的列

myRow[1]=value1;

……

myRow[3]=value3;

myDRC.ADD(myRow); //引用DataRowCollection集合对象的Add方法将此数据行加入//集合

 

删:Remove或Delete方法。Remove方法直接从DataRowCollection集合对象中将指定的DataRow移除,Delete方法则是将所要删除的DataRow标识为已删除,而非真正地从集合中移除。

   引用Reomve方法之前,必须预先取得此DataRow,然后用Remove方法将其从DataRowCollection中移除。

   Delete方法由单一的DataRow对象提供,引用这个方法时,必须先找到所要删除的DataRow对象。

改:如同增操作

protected void RemoveButton_Click(object sender, EventArgs e)

    {

        DataRowCollection drc = ds.Tables[0].Rows;  //返回DataRowCollection集合对象

        DataRow dr = drc.Find(BookIDTextBox.Text);  //通过查询获取DataRow对象

        if (dr == null)

            return;

        drc.Remove(dr);    //调用DataRowCollection对象的Remove方法删除DataDow对象

        SetGridViewDataSource(ds);      

    }

    protected void DeleteButton_Click(object sender, EventArgs e)

    {

        DataRowCollection drc = ds.Tables[0].Rows;   //返回DataRowCollection集合对象

        DataRow dr = drc.Find(BookIDDeleteTextBox.Text); //通过查询获取DataRow对象

        if (dr == null)

            return;

        dr.Delete();  //调用DataRow对象本身的Delete方法将对象本身标识为删除

        Session["dRow"] = dr;

        SetGridViewDataSource(ds);    

    }

    protected void AddButton_Click(object sender, EventArgs e)

    {

        DataRow newDataRow = ds.Tables[0].NewRow() ; //创建空的DataRow对象

        ResetDataField(newDataRow);      //调用ResetDataField方法填充相应的列数据

        ds.Tables[0].Rows.Add(newDataRow); //将此DataRow加入到DataRowCollection对象集合中

        SetGridViewDataSource(ds);

    }

    protected void UpdateButton_Click(object sender, EventArgs e)

    {

        DataRowCollection drc = ds.Tables[0].Rows;  //返回DataRowCollection集合

        DataRow dr = drc.Find(BookIDMTextBox.Text);  //通过查询获取DataRow对象     

        if (dr == null)

            return;

        ResetDataField(dr);            //调用ResetDataField方法更新数据

        SetGridViewDataSource(ds);

    }

    public void ResetDataField(DataRow mDataRow)

    {

        mDataRow["bookID"] = BookIDMTextBox.Text;

        mDataRow["bookTitle"] = BookTitleTextBox.Text;

        mDataRow["bookISBN"] = BookISBNTextBox.Text;

        mDataRow["bookPrice"] = int.Parse(BookPriceTextBox.Text);

        mDataRow["bookPublisher"] = BookPublisherTextBox.Text;

        mDataRow["bookAuthor"] = BookAuthorTextBox.Text;

        mDataRow["bookCoverUrl"] = BookCoverUrlTextBox.Text;

        mDataRow["bookDate"] = DateTime.Parse(BookDateTextBox.Text);       

    }

    private void SetGridViewDataSource(DataSet ds)

    {

        GVBooks.DataSource = ds;

        GVBooks.DataBind();

    }

    protected void RejectChangesButton_Click(object sender, EventArgs e)

    {

        if (Session["dRow"] == null)

            return;

        DataRow deleteRow =(DataRow)Session["dRow"];

        deleteRow.RejectChanges();  //调用DataRow的RejectChanges方法恢复数据

        Session["dRow"] = null;

        SetGridViewDataSource(ds);

    }

    protected void AcceptChangesButton_Click(object sender, EventArgs e)

    {

        if (Session["dRow"] == null)

            return;

        DataRow deleteRow = (DataRow)Session["dRow"];

        deleteRow.AcceptChanges();   //调用DataRow的AcceptChanges方法删除数据

        Session["dRow"] = null;

        SetGridViewDataSource(ds);

    }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值