DataTable相关操作

来源:互联网 发布:长者风靡网络原因 编辑:程序博客网 时间:2024/06/03 20:51


(-)在项目中经常用到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
 
          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使用技巧

     1Create a DataTable
         DataTable dt = new DataTable("Table_AX"); 

     2Add 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); 

      
3Add 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);  

       4Select row
         //Search the second row
如果没有赋值,则用is nullselect
         DataRow[] drs = dt.Select("column1 is null");
         DataRow[] drss = dt.Select("column0 = 'AX'"); 

       5Copy DataTable include data
         DataTable dtNew = dt.Copy(); 

       
6Copy DataTable only scheme
         DataTable dtOnlyScheme = dt.Clone(); 

       
7Operate 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; 

      
8Evaluate another DataTable's row to current Datatable
         dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray); 

      
9Convert 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();

       
10Filter DataTable
         dt.DefaultView.RowFilter = "column1 <> true";
         dt.DefaultView.RowFilter = "column1 = true";

       
11Sort row
          dt.DefaultView.Sort = "ID ,Name ASC";
          dt=dt.DefaultView.ToTable();

        
12Bind DataTable
           //
绑定的其实是DefaultView
          gvTestDataTable.DataSource = dt;
          gvTestDataTable.DataBind();

        
13judge the DataTables Column name is a string
          //
判断一个字符串是否为DataTable的列名
         dtInfo.Columns.Contains("AX");

        
14DataTable 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;
        }



(二)完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。这时可以使用DataTable.Select方法对结果进行再查询。


Select方法有4个重载,我们经常用到的就是DataTable.Select(String)

这个String的参数是查询的限定式。相当于SQL查询语言中的WHERE语句(不含WHERE),其语法符合SQL语言语法。

Select方法的返回的是包含查询到的数据的DataRow,但是这个DataRow只是被查询的DataTable的一个映射,所以DataRow是随着DataTable的行变化而变化的。例如,DataTable的行都被删除了,那么DataRow中的数据同样被删除了(即便是先Select,再删除的)

所以,要想把返回的DataRow放进数据显示控件中,需要将其放入另一个DataTable中,如果直接放入原DataTable或将原DataTable的行全部清除再放入查询所得的数据都是不行的,程序会显示错误,错误提示是“表中已有此行”。

另外,在一个新表中插入行,不能直接用DataTable.Rows.Add(DataRow)的方式,因为这样是插入一个新表,也就是DataRow是空的。要用导入行的方式,DataTable.ImportRow(DataRow)。当然,前提是这个新表要有与原数据表一样的结构。



DataTable dt = 数据源;
DataTable dtt = new DataTable();
dtt=dt.Clone();//拷贝框架
DataRow[] dr = dt.select("条件");
for(int i=0;i<dr.length;i++)
{
dtt.ImportRow((DataRow)dr[i]);//这一句再确认一下。呵呵
}
this.DataGrid.DataSource=dtt;
this.DataGrid.DataBind();
 


 


实例:


string  strExpr  =  "Country  =  'zh-CN ' ";  
string   strSort   =   "CompanyName   DESC ";  
DataRow   []   resultRows   =   table.Select(strExpr,   strSort);
 

DataRow[] drArr = dt.Select("C1=’abc’");//查询
还可以这样操作:

DataRow[] drArr = dt.Select("C1 LIKE ’abc%’");//模糊查询
DataRow[] drArr = dt.Select("’abc’ LIKE C1 + ’%’", "C2 DESC");//另一种模糊查询的方法
DataRow[] drArr = dt.Select("C1=’abc’", "C2 DESC");//排序

DataTable dtNew = dt.Clone(); 
for (int i = 0; i < drArr.Length; i++) 

    dtNew.ImportRow(drArr[i]); 

}

行数统计:

DataRow[] DrCount=dt.Select("PCState='在用'");
int m=DrCount.Count();

or:

int m=dt.AsEnumerable().Count(d=>d.Field<string>["State"]=="在用");

(三)

因为开发需要,需要在DataTable内存数据表中执行sql聚合函数Count、Sum的查询,着实郁闷了一把,后来才知道原来ms一直都有这个功能,汗。
DataTable实例对象后,有一个Compute方法,具体:
C#
public Object Compute (                string expression,                string filter            )举例:
// Presumes a DataTable named "Orders" that has a column named "Total."DataTable table;table = dataSet.Tables["Orders"];// Declare an object variable.object sumObject;sumObject = table.Compute("Sum(Total)", "EmpID = 5");

   一、调用说明(仅以C#为例,下同):
 
  public object Compute(string strExpression,stringstrFilter)
 
  参数:
 
  strExpression:要计算的表达式字符串,基本上类似于Sql ******中的统计表达式
 
  strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计
 
  二、调用举例:
 
  以下示例,假设一个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(***,0为女,1为男)、生日(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。
 
  1.统计所有性别为女的销售员的数量:
  table.Compute("Count(*)","***=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的统计功能没有Sql******强,这个统计是错误的,因为Compute的统计不具备Sum(Quantity*Price)这样数据的功能。那怎么办呢?
 
  对于这样复杂数据的统计,我们可以在DataTable中创建一个新的字段来完成,比如Amount,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了:
  table.Compute("Sum(Amount)","true"); 
=============================================================

试用实例:    this.lblprice.Text=ds.Tables[0].Compute("Sum(price)","true").ToString();



DataTable 去重复行
2 对 DataTable直接进行操作
DataTable  dt=db.GetDt("select * from 表名");            搜索//获得datatable
DataView dv = new DataView(dt);                           //虚拟视图吧,我这么认为
DataTable dt2 = dv.ToTable(true, "name,age,hobby");
这个时候  dt2就是去除了重复的行了
解释一下
dv.ToTable(true, "name,age,hobby");
第一个参数,true  去除重复,false 不去除
第二个参数,  看意思能明白,你需要显示的字段,我这里显示"name,age,hobby"

0 0
原创粉丝点击