下面的代码讲述了如何综合地使用DataTable、DataColumn和DataRow对象进行数据库操作。
private void DemonstrateRowBeginEdit()
{
//创建DataTable对象
DataTable table = new DataTable("table1");
//创建DataColumn对象,并设置其属性为Int32类型
DataColumn column=new DataColumn("col1",Type.GetType("System.Int32"));
//添加Column到dataTable中
table.Columns.Add(column);
// 使用for循环,创建5个DataRow对象并添加到DataTable中
DataRow newRow;
for(int i = 0;i<5; i++)
{
// RowChanged event will occur for every addition
newRow= table.NewRow();
newRow[0]= i;
table.Rows.Add(newRow);
}
// 使用dataTable的AcceptChanges方法,将更改提交到数据库中
table.AcceptChanges();
// 开始操作DataRow中的每个对象
foreach(DataRow row in table.Rows)
{
//使用BeginEdit方法开始操作
row.BeginEdit();
row[0]=(int) row[0]+10;
}
table.Rows[0].BeginEdit();
table.Rows[1].BeginEdit();
table.Rows[0][0]= 100;
table.Rows[1][0]=100;
try
{
// 终止对DataRow对象进行操作
table.Rows[0].EndEdit();
table.Rows[1].EndEdit();
}
catch(Exception e)
{
//出错处理
Console.WriteLine("Exception of type {0} occurred.",
e.GetType());
}
}
上述代码的主要业务逻辑如下:
(1) 创建DataTable和DataColumn类型的对象,并把DataColumn对象的数据类型设置成System.Int32。也就是说,使用该DataColumn对象可以对应地接收int类型的字段数据。
(2) 把DataColumn对象添加到DataTable中。
(3) 依次创建5个DataRow对象,同时通过for循环给其赋值。完成赋值后,将这5个DataRow对象添加到DataTable中。
(4) 使用AcceptChanges方法,实现DataColumn和DataRow对象的更新。
(5) 使用BeginEdit方法,开始编辑DataRow对象,使用EndEdit方法来表示编辑结束。
使用DataTable、DataColumn和DataRow对象访问数据的一般方式有以下几种。
(1) 使用Table名和Table索引来访问DataTable。为了提高代码的可读性,推荐使用Table名的方式来访问Table。代码如下:
DataSet ds = new DataSet();
DataTable dt = new DataTable("myTableName");
//向DataSet的Table里添加一个dataTable
ds.Tables.Add(dt);
//访问dataTable
//1 通过表名访问,推荐使用
ds.Tables["myTableName"].NewRow();
//2 通过索引访问,索引值从0开始,不推荐使用
ds.Tables[0].NewRow();
(2) 使用Rows属性访问数据记录,例如:
foreach(DataRow row in table.Rows)
{
row[0]=(int) row[0]+10;
}
(3) 使用Rows属性,访问指定行的指定字段,例如:
//首先为DataTable对象创建一个数据列
DataTable table = new DataTable("table1");
DataColumn column = new
DataColumn("col1",Type.GetType("System.Int32"));
table.Columns.Add(column);
// 其次为DataTable添加行数据
newRow= table.NewRow();
newRow[0]= 10;
table.Rows.Add(newRow);
//设置索引行是0,列名是col1的数据
table.Rows[0]["col1"]= 100;
//设置索引行是0,索引列是0的数据,这种做法不推荐
//table.Rows[0][0]= 100;
(4) 综合使用DataRow和DataColumn对象访问DataTable内的数据。从以下代码可以看出,DataTable对象中的Rows属性对应于它的DataRow对象,而Columns属性对应于DataColumn。
foreach(DataRow dr in dt.Rows)
{
foreach(DataColumn dc in dt.Columns)
{
//用数组访问数据
dr[dc] = 100;
}
}
4 使用DataSet对象访问数据库
当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为added、deleted或changed,最终的更新数据源动作将通过 DataAdapter对象的update方法来完成。
DataSet对象的常用方法如下。
Ü void AcceptChanges():该方法用来提交DataSet里的数据变化。
Ü void clear():该方法用来清空DataSet里的内容。
Ü DataSet copy():该方法把DataSet的内容复制到其他DataSet中。
Ü DataSet GetChanges():该方法用来获得在DataSet里已经被更改后的数据行,并把这些行填充到Dataset里返回。
Ü bool HasChanges():如果DataSet在创建后或执行AcceptChanges后,其中的数据没有发生变化,返回True,否则返回False。
Ü void RejectChanges():该方法撤销DataSet自从创建或调用AcceptChanges方法后的所有变化。
DataSet对象一般是和DataAdapter 对象配合使用。下面的代码演示了如何综合使用DataSet和DataAdapter 对象访问数据库。
//省略获得连接对象的代码
…
//创建DataAdatper
string sql = " select * from user";
SqlDataAdapter sda = new SqlDataAdapter(sql,conn)
//创建并填充DataSet
DataSet ds = new DataSet();
sda.fill(ds,”user”);
//给DataSet创建一个副本,操作对副本进行,以免因误操作而破坏数据
DataSet dsCopy = ds.Copy();
DataTable dt = ds.Table["user"];
//对DataTable中的DataRow和DataColumn对象进行操作
…
//最后将更新提交到数据库中
sda.update(ds, "user");
上述代码的主要业务流程如下。
(1) 创建DataAdapter和DataSet对象,并用DataAdapter的SQL语句生成的表填充到DataSet的DataTable中。
(2) 使用DataTable对表进行操作,例如做增、删、改等动作。
(3) 使用DataAdapter的update语句将更新后的数据提交到数据库中。
另外,上述代码在操作DataSet前,为DataSet创建了一个副本,用来避免误操作。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1687028