在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结。
一、DataTable简介
(1)构造函数
DataTable() 不带参数初始化DataTable
类的新实例。
DataTable(string
tableName) 用指定的表名初始化DataTable
类的新实例。
DataTable(string
tableName, string tableNamespace) 用指定的表名和命名空间初始化DataTable
类的新实例。
(2)
常用属性
CaseSensitive 指示表中的字符串比较是否区分大小写。
ChildRelations 获取此DataTable
的子关系的集合。
Columns 获取属于该表的列的集合。
Constraints 获取由该表维护的约束的集合。
DataSet 获取此表所属的DataSet。DataSet相关信息,可见我以前的一篇文章《数据访问(2)-DataSet》
DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图。
HasErrors 获取一个值,该值指示该表所属的DataSet
的任何表的任何行中是否有错误。
MinimumCapacity
获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为
50。
Rows 获取属于该表的行的集合。
TableName 获取或设置DataTable
的名称。
(3)常用方法
AcceptChanges() 提交自上次调用AcceptChanges()
以来对该表进行的所有更改。
BeginInit() 开始初始化在窗体上使用或由另一个组件使用的DataTable。初始化发生在运行时。
Clear() 清除所有数据的DataTable。
Clone() 克隆DataTable
的结构,包括所有DataTable
架构和约束。
EndInit() 结束在窗体上使用或由另一个组件使用的DataTable
的初始化。初始化发生在运行时。
ImportRow(DataRow
row) 将DataRow 复制到DataTable
中,保留任何属性设置以及初始值和当前值。
Merge(DataTable
table) 将指定的DataTable 与当前的DataTable
合并。
NewRow() 创建与该表具有相同架构的新DataRow。
二、DataTable使用技巧
(1)Create a
DataTable
DataTable dt
= new DataTable("Table_AX");
(2)Add columns for
DataTable
//Method
1
dt.Columns.Add("column0",
System.Type.GetType("System.String"));
//Method
2
DataColumn dc = new
DataColumn("column1",
System.Type.GetType("System.Boolean"));
dt.Columns.Add(dc);
(3)Add
rows for
DataTable
//Initialize
the row
DataRow dr =
dt.NewRow();
dr["column0"]
= "AX";
dr["column1"] =
true;
dt.Rows.Add(dr);
//Doesn‘t
initialize the
row
DataRow dr1 =
dt.NewRow();
dt.Rows.Add(dr1);
(4)Select
row
//Search the second
row 如果没有赋值,则用is
null来select
DataRow[]
drs = dt.Select("column1 is
null");
DataRow[] drss
= dt.Select("column0 = ‘AX‘");
(5)Copy DataTable
include data
DataTable
dtNew =
dt.Copy();
(6)Copy
DataTable only
scheme
DataTable
dtOnlyScheme =
dt.Clone();
(7)Operate
one
row
//对dt的操作
//Method
1
DataRow drOperate =
dt.Rows[0];
drOperate["column0"]
=
"AXzhz";
drOperate["column1"]
= false;
//Method
2
drOperate[0] =
"AXzhz";
drOperate[1] =
false;
//Method
3
dt.Rows[0]["column0"]
=
"AXzhz";
dt.Rows[0]["column1"]
= false;
//Method
4
dt.Rows[0][0] =
"AXzhz";
dt.Rows[0][1]
= false;
(8)Evaluate another
DataTable‘s row to current
Datatable
dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);
(9)Convert
to
string
System.IO.StringWriter
sw = new
System.IO.StringWriter();
System.Xml.XmlTextWriter
xw = new
System.Xml.XmlTextWriter(sw);
dt.WriteXml(xw);
string
s =
sw.ToString();
(10)Filter
DataTable
dt.DefaultView.RowFilter
= "column1 <>
true";
dt.DefaultView.RowFilter
= "column1 =
true";
(11)Sort
row
dt.DefaultView.Sort
= "ID ,Name
ASC";
dt=dt.DefaultView.ToTable();
(12)Bind
DataTable
//绑定的其实是DefaultView
gvTestDataTable.DataSource
=
dt;
gvTestDataTable.DataBind();
(13)judge
the DataTable’s Column name is a
string
//判断一个字符串是否为DataTable的列名
dtInfo.Columns.Contains("AX");
(14)DataTable
convert to XML and XML convert to
DataTable
protected
void Page_Load(object sender, EventArgs
e)
{
DataTable
dt_AX = new
DataTable();
//dt_AX.Columns.Add("Sex",
typeof(System.Boolean));
//DataRow
dr =
dt_AX.NewRow();
//dr["Sex"]
=
true;
//dt_AX.Rows.Add(dr);
string
xml=ConvertBetweenDataTableAndXML_AX(dt_AX);
DataTable
dt =
ConvertBetweenDataTableAndXML_AX(xml);
}
public
string ConvertBetweenDataTableAndXML_AX(DataTable
dtNeedCoveret)
{
System.IO.TextWriter
tw = new
System.IO.StringWriter();
//if
TableName is empty, WriteXml() will throw
Exception.
dtNeedCoveret.TableName=dtNeedCoveret.TableName.Length==0?"Table_AX":dtNeedCoveret.TableName;
dtNeedCoveret.WriteXml(tw);
dtNeedCoveret.WriteXmlSchema(tw);
return
tw.ToString();
}
public
DataTable ConvertBetweenDataTableAndXML_AX(string
xml)
{
System.IO.TextReader
trDataTable = new System.IO.StringReader(xml.Substring(0,
xml.IndexOf("<?xml")));
System.IO.TextReader
trSchema = new
System.IO.StringReader(xml.Substring(xml.IndexOf("<?xml")));
DataTable
dtReturn = new
DataTable();
dtReturn.ReadXmlSchema(trSchema);
dtReturn.ReadXml(trDataTable);
return
dtReturn;
}
我们在使用Sql
Server这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web
Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了。那么在DataSet/DataTable中是否可以进行统计呢?
在MSDN中,有一篇MS推荐的统计方法,就是逐行对数据进行求和统计,这个方法,其实有等于无(或许这个方法只是针对于DataGrid求取小计用吧),因为这个方法中采用的是DataGrid的ItemDataBind事件来对数据进行累加,同我们手动写代码统计没有什么区别。
本文介绍一个简单的方法,不需要逐条记录进行计算就可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute。
一、调用说明(仅以C#为例,下同):
public object Compute(string strExpression,string strFilter)
参数:
strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式
strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计
二、调用举例:
以下示例,假设一个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(Sex,0为女,1为男)、生日(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。
1。统计所有性别为女的销售员的数量:
table.Compute("Count(*)","Sex=0");
2。统计所有销售员中年龄大于20岁的
table.Compute("Count(*)","Birthday<‘"+today);//today为今天的日期字符串
3。统计销售产品的平均价格
table.Compute("Aver(Price)","true");
4。统计产品代码为1的产品销售数量:
table.Compute("Sum(Quantity)","ProID=1");
5。统计所有产品的销售总金额:
要统计总销售金额,由于table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如:
table.Compute("Sum(Quantity*Price)","true");
这里一个问题是:DataTable的统计功能没有SqlServer强,这个统计是错误的,因为Compute的统计不具备Sum(Quantity*Price)这样数据的功能。那怎么办呢?
对于这样复杂数据的统计,我们可以在DataTable中创建一个新的字段来完成,比如Amount,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了:
table.Compute("Sum(Amount)","true");
以上都是计算每一列的合计,要添加一行求合计可以使用下面的方法:
System.Data.DataRow
dataRow=dataSet.Tables[0].NewRow()
‘假设你的DataSet为dataSet,表在索引0位置,同时假设你的所有字段都是可以求合计的。
System.DataRow
dataRow = new System.DataRow();
dataRow=DT.NewRow();
然后就是统计了:
int i ;
int fldCnt ;
fldCnt=DT.Cols.Count;
for( i=0 ;i<
fldCnt-1;i++)
dataRow(i)=DT.Compute("Sum("+i.ToString()+")","true");
DT.Rows.Add(dataRow);
(转载)DataTable使用技巧总结,布布扣,bubuko.com
原文:http://www.cnblogs.com/annabook/p/3599911.html