在学习DataTable知识之前,我们有必要了解下ADO.NET。以下摘自MSDN:
ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、处理和更新所包含的数据。 ADO.NET中包含的对象及其关系如下图:
1、DataTable简介
1.1 DataTable的定义
表示内存中数据的一个表。 我们知道数据库中存储的是实体表,实体表中有一系列的数据。而DataTable即存储在内存中的表,在持久化到数据库之前,是不会对数据库产生影响的,持久化到数据库可以使用dataAdapter.Update的方法(dataAdapter是某个实例化的DataAdapter对象)。 注意:当访问 DataTable 对象时,请注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。
得到DataTable有许多方法,下面简单罗列出来: 1.2.1通过构造函数得到DataTable 1.2.2通过DataSet获取DataTable DataTable dt=ds.Tables["TableName"];//TableName是表名 1.2.3 通过DataRow自定义DataTable的结构 DataTable dt= new DataTable("TB_USER");
DataColumn colUserID = new DataColumn("USER_ID", Type.GetType("System.Int"));
dt.Columns.Add(colCurrency);
DataColumn colUserName= new DataColumn("USER_NAME", Type.GetType("System.String"));
dt.Columns.Add(colUserName);
这样得到是一个表的结构,里面没有任何数据,表面为TB_USER。
1.2.4通过已有的DataTable得到新的DataTable
可以使用DataTable.Clone()方法获得现有DataTable的表的结构,这在实际中也是常用的
1.2.5通过DataAdapter填充DataTable
DataAdapter.Fill(dt);来填充DataTable,这也是新手常用的方法,通常是些sql语句,然后使用command,是最基础的方法。
1.2.6通过DataRow数组导入DataTable
DataRow [] drs;//drs是某个有数据的DataRow数组
foreach(DataRow dr in drs) { dt.ImportRow(dr); }
1.3 DataTable常用属性 CaseSensitive 指示表中的字符串比较是否区分大小写。 ChildRelations 获取此DataTable 的子关系的集合。 Columns 获取属于该表的列的集合。 Constraints 获取由该表维护的约束的集合。 DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图。 HasErrors 获取一个值,该值指示该表所属的 DataSet 的任何表的任何行中是否有错误。 MinimumCapacity 获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为 50。 Rows 获取属于该表的行的集合。 TableName 获取或设置DataTable 的名称。
1.4 DataTable是ADO.NET中的重要成员
DataSet中可包括多个 DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的 Update方法。
2、DataTable成员之DataRow
DataTable是由一个个DataRow组合而成,DataTable.Rows[i]即表示其中的第i行。 DataRow有一个十分重要的状态(RowState),这个状态经常被我们忽略,从而导致一些莫名其妙的bug。RowState 的值是一个枚举类型的,RowState 有 Added, Modified, Unchanged, Deleted, Detached 几种, 分别表示 DataRow 被添加, 修改, 无变化, 删除, 从表中脱离. 在调用一些方法或者进行某些操作之后, 这些状态可以相互转化。我们不做什么判断就开始操作DataRow,这就有可能导致某些状态为Deleted的行也同时被操作,这样就有可能导致脏数据的产生。
3、DataTable成员之DataColumn
DataColumn 表示 DataTable 中列的架构。
3.1 DataColumn中常见的熟悉及其说明如下:
3.2 DataColumn.Expression 表达式 表达式语法
在创建表达式时,使用 ColumnName 属性来引用列。例如,如果一个列的 ColumnName 是“UnitPrice”,而另一个是“Quantity”,则表达式将是: "UnitPrice * Quantity"
4、DataTable成员之DataView
DataView类似数据库中的视图。 DataView 使您能够创建 DataTable 中所存储的数据的不同视图,这种功能通常用于数据绑定应用程序。使用 DataView,您可以使用不同排序顺序显示表中的数据,并且可以按行状态或基于筛选器表达式来筛选数据。 DataView 提供基础 DataTable 中的数据的动态视图:内容、排序和成员关系会实时反映其更改。此行为不同于 DataTable 的 Select 方法,后者从表中按特定的筛选器和/或排序顺序返回 DataRow 数组,虽然其内容反映对基础表的更改,但其成员关系和排序却则保持静态。DataView 的动态功能使其成为数据绑定应用程序的理想选择。 在实际运用中,我们时常使用如下代码: DataView dv = dt.DefaultView; DataTable dtNew=dv.ToTable();//将DataView重新转为DataTable 4.1 DataViewRowState: 其实DataView是类似于DataTable,它里面也有RowState,我们可以使用RowStateFilter来过滤不同状态的行。
4.2 DataView的过滤器
设置过滤 RowFilter是一个可读写的属性,用来读取和设置表过滤的表达式。public virtual string RowFilter {get; set;} 你可以用列名,逻辑和数字运算符和常量的任意合法组合组成表达式。以下是一些例子:
4.3 DataView 的排序
DataView支持Sort属性,可以用来对视图中的内容排序。Sort由用逗号分隔的列名表达式进行排序。通过在任何列名后加ASC或者DESC限定词,可以使得字段按照上升或者下降的顺序排列。如果没有方向限定词,默认顺序为ASC。
实例篇 实例1.DataTable分组统计数据
如上表是dt中的数据,如果要分组进行统计各学生的平均科目成绩, 可以使用如下的方法(当然如果你的.Net版本支持Linq的话,可以使用Linq) 思路:找出所有的学生,遍历表,计算该学生的平均成绩,参考代码如下: //获取所有的学生
DataView myDataView = new DataView(dt);
string[] strComuns ={ "Name"};
DataTable dtTemp = myDataView.ToTable(true, strComuns);
//新建DataTable存储结构,结构同dt
DataTable dtNew=dt.Clone();
//根据学生统计数据
for (int i = 0; i < dtTemp.Rows.Count; i++)
{
DataRow drDetail = dtNew.NewRow();
drDetail["Name"] = dtTemp.Rows[i]["Name"].ToString();
drDetail["Scores"] = dt.Compute("AVer(Scores)", "Name='" + dtTemp.Rows[i]["Name"].ToString() + "'");
dtNew.Rows.Add(drDetail);
} |
|
来自: 悟静 > 《.net和asp.net》