C# DataSet和DataTable
DataSet:大家知道普通的数据库比如SQL 2000,ACCESS都是存放在电脑硬盘上的。DataSet简单的可以理解为存放在内存中的数据库,而它的数据从哪里来呢?就是用DataAdapter做桥梁从真正的数据库中获取,再用DataAdapter的Fill方法填充DataSet.
DataTable:可以理解为DataSet的表,DataTable有DataRow和DataColumn,分别代表行和列,跟真正的数据库一样,DataSet可以有多个DataTable.DataSet是存放在内容中所以与数据库是断开的,这对于小量数据的处理很有优势,但对于大量数据不太适合.
DataSet与DataTable关系如下表:
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();
}
}