C# DataSet和DataTable

DataSet:大家知道普通的数据库比如SQL 2000,ACCESS都是存放在电脑硬盘上的。DataSet简单的可以理解为存放在内存中的数据库,而它的数据从哪里来呢?就是用DataAdapter做桥梁从真正的数据库中获取,再用DataAdapter的Fill方法填充DataSet.

DataTable:可以理解为DataSet的表,DataTable有DataRow和DataColumn,分别代表行和列,跟真正的数据库一样,DataSet可以有多个DataTable.DataSet是存放在内容中所以与数据库是断开的,这对于小量数据的处理很有优势,但对于大量数据不太适合.

DataSetDataTable关系如下表:

 

 DataAdapter:在DataSet与源数据之间起到桥梁作用,它可以用Fill方法填充数据集(DataSet), 用Update方法向数据库提交存储在DataSet中的修改.

下面我们来做个用Fill方法的简单例子:

考虑到很多人可能没有装sql server,所以我们采用ACCESS数据库,其实用法都差不多.首先建立名为mydata的数据库,建一个名为student的表.

 

往表中随意输入数据,比如

 

建好后,把mydata数据库放到App_Data目录下.用VS新建一个网站,首页是default.aspx,进入default.aspx.cs写下如下代码:

using System;
using System.Data;
using System.Configuration;
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.OleDb;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
       //定义连接字符串
        string connString = "Provider = Microsoft.Jet.OleDb.4.0;Data source = |DataDirectory|mydata.mdb";
        OleDbConnection conn = new OleDbConnection(connString);
        conn.Open();
        OleDbDataAdapter da = new OleDbDataAdapter("select * from student", conn);
        DataSet ds = new DataSet();
        da.Fill(ds, "student");
        //取得记录的行数,若=0,则说明没有数据
        if (ds.Tables["student"].Rows.Count == 0)
        {
            Response.Write("数据库中无数据");
        }
        else
        {
            for (int i = 0; i < ds.Tables["student"].Rows.Count; i++)
            {
               //Rows[a][b]这里的a表示行,从0开始,b表示列,可以用数字表示,也可以直接用字段名
                Response.Write(ds.Tables["student"].Rows[i]["name"]);
                Response.Write(ds.Tables["student"].Rows[i]["score"]);
                Response.Write("<br>");
            }
        }
        conn.Close();
    }
}

这段代码是读取student表中的数据,简单吧!

------------------------------------------------------------------------------------------------------------

接下来我们来做个用Update方法的简单例子:

使用Update方法自动遍历DataTable中的所有行,以检查需要对数据库作出的变动,它为每一发生更改的行调用Insert,Update或者Delete命令.

它们之间的关系可以用下图表示:

 

DataTable Rows集合的三个常用方法:

Find方法:检索行
Add方法:创建行
Delete方法:删除行

下面是例子,对于OleDbCommandBuilder的使用方法,请参考文章.OleDbCommandBuilder类

复制代码

using System;
using System.Data;
using System.Configuration;
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.OleDb;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        string connString = "Provider = Microsoft.Jet.OleDb.4.0;Data source = |DataDirectory|mydata.mdb";
        OleDbConnection conn = new OleDbConnection(connString);
        conn.Open();
        OleDbDataAdapter da = new OleDbDataAdapter("select * from student", conn);
        //定义cb为OleDbCommandBuilder对象
        OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
        DataSet ds = new DataSet();
        da.Fill(ds, "student");

        #region 创建一个新的行
        DataRow dr = ds.Tables["student"].NewRow();
        dr["name"] = "小强";
        dr["score"] = "88";
        //把行加入DataSet的student表中
        ds.Tables["student"].Rows.Add(dr);
        #endregion

        //输出修改前的数据,此时access数据库没有插入,只在DataSet中更新
        Response.Write("修改之前的数据为:"+ds.Tables["student"].Rows[0][1].ToString()+ds.Tables["student"].Rows[0][2].ToString()+"<br>");

        #region 修改这个行
        ds.Tables["student"].Rows[0]["name"] = "小百";
        ds.Tables["student"].Rows[0]["score"] = "99";
        #endregion

        //输出修改后的数据
        Response.Write("修改之后的数据为:"+ds.Tables["student"].Rows[0][1].ToString() + ds.Tables["student"].Rows[0][2].ToString()+"<br>");

        #region 删除数据
        ds.Tables["student"].Rows[0].Delete();
        #endregion

        //用DataSet的Update方法插入Access数据库中
        da.Update(ds, "student");

        //关闭数据库连接
        conn.Close();
       
    }
}

 

 

posted on 2013-06-21 15:10  j0uz  阅读(311)  评论(0编辑  收藏  举报