在能够使用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); }
} |