精华内容
下载资源
问答
  • DataTable 详解

    千次阅读 2016-09-29 16:03:00
    一。创建一个内存表,下面的代码会用到它...DataTable auto = new DataTable(); auto.Columns.Add("ID"); auto.Columns.Add("Name"); for(int i=1;i {  auto.Rows.Add(new object[]{i,"baibaoqing"});


    一。创建一个内存表,下面的代码会用到它

    DataTable      auto = new DataTable();

    auto.Columns.Add("ID");

    auto.Columns.Add("Name");

    for(int i=1;i<=10;i++)

    {

             auto.Rows.Add(new object[]{i,"baibaoqing"});

    }

    二。下面介绍DataTable对象经常使用的方法

              1. DataTable 的复制和克隆

               创建DataTable的完全副本(full copu 复制表的结构和数据),通过DataTable的Copy方法实现

               DataTable copy_Table=auto.Copy()

               for(int i=0;i<copy_Table.Rows.Length;i++)

               {

                      Response.Write("<script>alert("+copy_Table.Rows[i][0]+");</script>");

               }

    输出的结果为从0到10 的数字

              有时需要复制DataTable 的表模式(表结果)而不复制数据,可以使用DataTable的Clone方法

               DataTable clone_Table=auto.Clone();

              在克隆了一个DataTable后,可能需要DataTable对象中的某些DataRow对象(行数据)复制到克隆的DataTabel 中,可以使用DataTable 的ImPortRow方法

              clone_Table.ImportRow(auto.Rows[0]);

             2.枚举DataTable

             通过Foreach循环遍历DataTable的行和列

             System.Text.StringBuilder      buffer=new System.Text.StringBuiler();

             foreach(DataColumn dc in auto.Colmns)

            {

                     buffer.Append(String.Format(“{0,15}”,dc.ColumnName));

            }

             buffer.Append("/r/t");

            foreach(DataRow dr in auto.Rows)

            {

                    foreach(DataColumn dc in auto.Colmns)

                   {

                    buffer.Append(String.Format("{0,15}",dr[dc])); 
                   }

                   buffer.Append("/r/t");

    }

    textbox1.Text=buffer.ToString();

    三. 使用DataView

              1. Sort排序

                 DataView view=new DataView(auto);

                 view.Sort="Make ASC,Year DESC";

                 不过我很少使用DataView 的排序功能,我的作法是在SQL语句中使用Order by

               2. 使用RowFilter 精确查找

                   DataView view=new DataView(auto);

                   view.RowFilter="Make like 'AA%' and Year>2001";

                  同样也可以在SQL语句中设置查询条件,看个人的习惯和实际的需要了。

                3 将DataView 导出到一个新表

                 DataTable new_Table=view.ToTable("MyTable",true,"id","name");

                 MyTable 新表的名称,true 表示显示不同的值,将相同的行删除(相当于Sql 的distinct),

               id 和name 为新表的列ID.

               4. 枚举DataView

                和枚举DataTabe大同小异

                  System.Text.StringBuilder      buffer=new System.Text.StringBuiler();

             foreach(DataColumn dc in auto.Colmns)

            {

                     buffer.Append(String.Format(“{0,15}”,dc.ColumnName));

            }

             buffer.Append("/r/t");

            foreach(DataRowView dv in view)

            {

                    foreach(DataColumn dc in auto.Colmns)

                   {

                    buffer.Append(String.Format("{0,15}",dv[dc])); 
                   }

                   buffer.Append("/r/t");

    }

    textbox1.Text=buffer.ToString();

    另外在.net 2.0中DataTable对象可以处理XML文件,和DataSet一样,DataTable对象也有ReadXml和WriteXml 的方法,没有具体用过,有机会使用时再做总结。

    ------------------------------------------------------------------------------------------------------------------------------------------

    通过DataTable获得表的主键

    很多情形下我们需要知道表的主键是什么。在ADO.NET中提供了DataTable可以映射数据库的表。于是便可以利用DataTable的属性PrimaryKey,它是DataColumn[] 类型是一个数组。我们可以使用如下的代码

          DataColumn[] cols;
          cols = Table.PrimaryKey;
     //注意不是cols是DataColumn数组,不是DataColumn变量。这样做主要是为了处理联合主键的问题。
          for(int i = 0; i < cols.Length; i++)
          {
                 MessageBox.Show(cols[i].ColumnName);
          }


    按理这个问题就已经解决了,但是cols.Length却是0。原来在默认的情况下填充DataTable时并没有从数据库中取的主键的信息。如何获得主键呢?经过研究发现在填充Dataset的时候可以使用DataAdapter的MissingSchemaAction属性帮助我们解决这个问题,于是有如下的代码:

           //使用DataAdapter填充DataTable
           dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
           dataadapter.Fill(Table);

           DataColumn[] cols;
           cols = Table.PrimaryKey;
           //注意不是cols是DataColumn数组,不是DataColumn变量。这样做主要是为了处理联合主键的问题。
           for(int i = 0; i < cols.Length; i++)
            {
               MessageBox.Show(cols[i].ColumnName);
           }


    这样我们便可以如愿以偿了。MissingSchemaAction属性是确定现有Dataset(或DataTable)架构与传入数据不匹配时需要执行的操作。MissingSchemaAction.AddWithKey是枚举值,它的作用是添加必需的列和主键信息以完成架构,利用它用户可以在每个 DataTable上显式设置主键约束。

    ------------------------------------------------------------------------------------------------------------------------------------------

    DataTable中数据记录的统计

            我们在使用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);

    好了,大功告成。希望对大家有用。

    -------------------------------------------------------------------------------------------

         在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列。
    如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助。
    using System;
    using System.Data; CHINAZ

    namespace WindowsApplication1
    {
           public class SQLOps
           {
               public SQLOps()
               {            
               }
               public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC)
               {
                   //创建一个新的DataTable
                   DataTable table = new DataTable("Join");
                   // Use a DataSet to leverage DataRelation
                   using(DataSet ds = new DataSet()) CHINAZ

    CHINAZ


                   {
                       //把DataTable Copy到DataSet中


                       ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});

    CHINAZ


                       DataColumn[] parentcolumns = new DataColumn[FJC.Length];

    CHINAZ

                       for(int i = 0; i < parentcolumns.Length; i++)
                       {
                           parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
                       }
                       DataColumn[] childcolumns = new DataColumn[SJC.Length];
                       for(int i = 0; i < childcolumns.Length; i++)
                       {
                           childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName]; CHINAZ

    CHINAZ

                       }


                       //创建关联
                       DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false);
                       ds.Relations.Add(r); CHINAZ

                       //为关联表创建列
                       for(int i = 0; i < First.Columns.Count; i++)
                       {
                           table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
                       }
                       for(int i = 0; i < Second.Columns.Count; i++)
                       {
                           //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second

    CHINAZ

                           if(!table.Columns.Contains(Second.Columns[i].ColumnName))
                               table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
                           else
                               table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
                       } 
                       table.BeginLoadData();
                       foreach(DataRow firstrow in ds.Tables[0].Rows)

    CHINAZ

                       {
                           //得到行的数据
                           DataRow[] childrows = firstrow.GetChildRows(r);
                           if(childrows != null && childrows.Length > 0)
                           {
                               object[] parentarray = firstrow.ItemArray; 
                               foreach(DataRow secondrow in childrows)

    CHINAZ


                               {
                                   object[] secondarray = secondrow.ItemArray;
                                   object[] joinarray = new object[parentarray.Length+secondarray.Length];
                                   Array.Copy(parentarray,0,joinarray,0,parentarray.Length);
                                   Array.Copy(secondarray,0,joinarray,parentarray.Length,secondarray.Length); CHINAZ 
                                   table.LoadDataRow(joinarray,true);
                               }
                           }
                       }
                       table.EndLoadData();
                   }
                   return table;
               }
               public static DataTable Join (DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC)

    CHINAZ


               {
                   return Join(First, Second, new DataColumn[]{FJC}, new DataColumn[]{SJC});
               }
               public static DataTable Join (DataTable First, DataTable Second, string FJC, string SJC)
               {
                   return Join(First, Second, new DataColumn[]{First.Columns[FJC]}, new DataColumn[]{First.Columns[SJC]});
               }
           }


         

                                                                                2016-9-29   荷兰菊

    展开全文
  • DataTable详解

    2016-12-18 10:11:34
     DataSet中可包括多个 DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给...

    ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、处理和更新所包含的数据。
    ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET Framework 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。
    ADO.NET 类在 System.Data.dll 中,并且与 System.Xml.dll 中的 XML 类集成。当编译使用 System.Data 命名空间的代码时,请引用 System.Data.dll 和 System.Xml.dll。有关连接到数据库、从数据库中检索数据并在命令提示中显示该数据的 ADO.NET 应用程序示例,请参见 ADO.NET 示例应用程序。
    ADO.NET 向编写托管代码的开发人员提供了类似于 ActiveX 数据对象 (ADO) 为本机组件对象模块 (COM) 开发人员提供的功能。

    ADO.NET中包含的对象及其关系如下图:

     

     

     

     

    1、DataTable简介

     

    1.1 DataTable的定义

     

      表示内存中数据的一个表。 我们知道数据库中存储的是实体表,实体表中有一系列的数据。而DataTable即存储在内存中的表,在持久化到数据库之前,是不会对数据库产生影响的,持久化到数据库可以使用dataAdapter.Update的方法(dataAdapter是某个实例化的DataAdapter对象)。

    注意:当访问 DataTable 对象时,请注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。


    1.2 得到DataTable

     

      得到DataTable有许多方法,下面简单罗列出来:

    1.2.1通过构造函数得到DataTable 
    DataTable() 不带参数初始化DataTable 类的新实例。 
    DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例。 
    DataTable(string tableName, string tableNamespace) 用指定的表名和命名空间初始化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的行也同时被操作,这样就有可能导致脏数据的产生。

    RowState 

    说明

    Unchanged

    自上次调用 AcceptChanges 之后,或自 DataAdapter.Fill 创建了行之后,未做出过任何更改。

    Added

    已将行添加到表中,但尚未调用 AcceptChanges

    Modified

    已更改了行的某个元素。

    Deleted

    已将该行从表中删除,并且尚未调用 AcceptChanges

    Detached

    该行不属于任何 DataRowCollection。新建行的 RowState 设置为 Detached。通过调用 Add 方法将新的DataRow 添加到 DataRowCollection 之后,RowState 属性的值设置为 Added

    对于已经使用 Remove 方法(或是在使用 Delete 方法之后使用了 AcceptChanges 方法)从DataRowCollection 中移除的行,也设置为 Detached

     

     

    3、DataTable成员之DataColumn

     

     DataColumn 表示 DataTable 中列的架构。

     

    3.1 DataColumn中常见的熟悉及其说明如下:

     

    属性名

    说明

    Unique

    设置DataColumn对象是否不允许重复的数据

    Table 

    DataColumn对象所属的DataTable对象

    ReadOnly

    DataColumn对象是否只读

    Ordinal

    字段集合中的DataColumn对象顺序

    DefaultValue

      DataColumn对象的默认值

    DataType

    DataColumn对象数据类型

    ColumnName

    DataColumns集合对象中的字段名称

    Count 

    DataTable对象中的字段数

    Caption

    DataColumn对象的标题

    AutoIncrement

    加入DataRow时,是否自动增加字段

    AutoIncrementSeed

    DataColumn对象的递增种子

    AllowDBNull

    DataColumn对象是否接受Null

     

    3.2 DataColumn.Expression 表达式

    获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。表达式的返回类型由列的 DataType 来确定。Expression 属性的一个用途是创建计算出的列。例如,若要计算税值,就要将单价乘以特定地区的税率。由于各地税率不同,不可能将单一税率放在一个列中;于是便用 Expression 属性来计算这个值,如下面这一部分中的 Visual Basic 代码所示:DataSet1.Tables("Products").Columns("tax").Expression = "UnitPrice * 0.086"第二个用途是创建聚合列。类似于计算出的值,聚合基于 DataTable 中的整个行集执行操作。一个简单的示例就是计算该集中返回的行数。这便是您将用来计算特定销售人员所完成的交易数的方法,如下面的 Visual Basic 代码所示:DataSet1.Tables("Orders").Columns("OrderCount").Expression = "Count(OrderID)";

    表达式语法

    在创建表达式时,使用 ColumnName 属性来引用列。例如,如果一个列的 ColumnName 是“UnitPrice”,而另一个是“Quantity”,则表达式将是:

    "UnitPrice * Quantity"

     


     

    4、DataTable成员之DataView

     

     

    DataView类似数据库中的视图。 

    DataView 使您能够创建 DataTable 中所存储的数据的不同视图,这种功能通常用于数据绑定应用程序。使用 DataView,您可以使用不同排序顺序显示表中的数据,并且可以按行状态或基于筛选器表达式来筛选数据。

    DataView 提供基础 DataTable 中的数据的动态视图:内容、排序和成员关系会实时反映其更改。此行为不同于 DataTable 的 Select 方法,后者从表中按特定的筛选器和/或排序顺序返回 DataRow 数组,虽然其内容反映对基础表的更改,但其成员关系和排序却则保持静态。DataView 的动态功能使其成为数据绑定应用程序的理想选择。
    与数据库视图类似,DataView 为您提供了可向其应用不同排序和筛选条件的单个数据集的动态视图。但是,与数据库视图不同的是,DataView 不能作为表来对待,无法提供联接的表的视图。另外,还不能排除存在于源表中的列,也不能追加不存在于源表中的列(如计算列)。

    在实际运用中,我们时常使用如下代码:

    DataView dv = dt.DefaultView;
    dv.Sort = "UserName"; //根据UserName排序,得到新的DataView

    DataTable dtNew=dv.ToTable();//将DataView重新转为DataTable

     

    4.1 DataViewRowState:

     

    其实DataView是类似于DataTable,它里面也有RowState,我们可以使用RowStateFilter来过滤不同状态的行。

    urrentRows 包括所有未更新的、新的和修改的数据行
    Deleted 所有自上次调用AcceptChanges后删除的数据行
    ModifiedCurrent 所有自上次调用AcceptChanges后修改过的数据行
    ModifiedOriginal 所有自上次调用AcceptChanges后original版本的数据行
    New 所有自上次调用AcceptChanges后新添加的行
    OriginalRows 返回初始数据行,包含unchanged和deleted 的
    Unchanged 所有未更新的数据行
     

    4.2 DataView的过滤器

        

    设置过滤 RowFilter是一个可读写的属性,用来读取和设置表过滤的表达式。public virtual string RowFilter {get; set;}

     你可以用列名,逻辑和数字运算符和常量的任意合法组合组成表达式。以下是一些例子:
    dv.RowFilter = "Country = 'USA'";
    dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
    dv.RowFilter = "Description LIKE '*product*'"

    让我们来看一下过滤器的基本规则和运算符。
    过滤字符串是表达式的逻辑连接。可以用AND,OR,NOT来连接成一个较短的表达式,也可以使用圆括号来组成子句,指定优先的运算。
    通常包含列名的子句同字母、数字、日期或另一个列名进行比较。这里,可以使用关系运算符和算术运算符,如>=, <, >, +, *, % (取模)等等。
    如果要选取的行并不能方便地通过算术或逻辑运算符表达,你可以使用IN操作符。以下代码显示如何选取一个随机行:
    dv.RowFilter = "employeeID IN (2,4,5)"

    你也可以使用通配符*和%,它们同LIKE运算符一起使用时显得更有用。它们都表示任意数量的字符,可以相互替代使用。
    请注意,如果在LIKE子句中已经有了*或%字符,你必须用方括号将其括起,以免歧义。如果很不幸,字符串中方括号本身也存在了,那么它也必须用将本身括起。这样,匹配语句会如下所示:
    dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]"

    通配符只允许在过滤字符串的开头或结尾处使用,而不能在字符串中间出现。例如,下列语句会产生运行时错误:
    dv.RowFilter = "Description LIKE 'prod*ct"

    字符串必须以单引号括起,而日期型必须以#符号括起。字符型值可以使用小数点和科学计数法。
    RowFilter也支持聚合函数,如SUM, COUNT, MIN,MAX, and AVG。如果表中没有数据行,那么函数将返回NULL。
    在介绍RowFilter表达式的最后,让我们讨论三个很便利的函数:Len,IIF和Substring。
    正如其名,Len()返回特定表达式的长度。该表达式可以是一个列名,也可以是其他合法的表达式。
    Substring()返回指定的表达式自特定位置开始,特定长度的字符子串。
    我最喜欢用的是IIF(),它按照逻辑表达式的值有一到两个值。IIF是IF-THEN-ELSE语句的紧凑表达。语法如下:
    IIF(expression, if_true, if_false)

    通过该函数,可以建立非常复杂的过滤字符串。例如,假定你从SQL Server的Northwind数据库中取得Employees表,下列表达式可以选出那些employeeID小于6且lastname为偶数个字符和employeeID大于6且lastname为奇数个字符的员工。
    IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)

     

    4.3 DataView 的排序 

     

    DataView支持Sort属性,可以用来对视图中的内容排序。Sort由用逗号分隔的列名表达式进行排序。通过在任何列名后加ASC或者DESC限定词,可以使得字段按照上升或者下降的顺序排列。如果没有方向限定词,默认顺序为ASC。
    DataView是内存中的对象,所以排序在本地进行,无需调用数据库服务器。

     

    实例篇 


    实例1.DataTable分组统计数据

     

    Name

    Subject

    Scores

    Jack

    001

    90

    Jack

    002

    85.5

    Tom

    001

    78.5

    Jerry

    001

    59

    Tom

    002

    100

     如上表是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);

    }

    展开全文
  • C# DataTable 详解

    2019-02-19 08:40:28
    C# DataTable 详解 转自:https://www.cnblogs.com/Sandon/p/5175829.html 添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空表 ...

    C# DataTable 详解
    转自:https://www.cnblogs.com/Sandon/p/5175829.html

    添加引用

    using System.Data;
    创建表

    //创建一个空表
    DataTable dt = new DataTable();
    //创建一个名为"Table_New"的空表
    DataTable dt = new DataTable(“Table_New”);
    创建列

    //1.创建空列
    DataColumn dc = new DataColumn();
    dt.Columns.Add(dc);
    //2.创建带列名和类型名的列(两种方式任选其一)
    dt.Columns.Add(“column0”, System.Type.GetType(“System.String”));
    dt.Columns.Add(“column0”, typeof(String));
    //3.通过列架构添加列
    DataColumn dc = new DataColumn(“column1”,System.Type.GetType(“System.DateTime”));
    DataColumn dc = new DataColumn(“column1”, typeof(DateTime));
    dt.Columns.Add(dc);

    创建行

    //1.创建空行
    DataRow dr = dt.NewRow();
    dt.Rows.Add(dr);
    //2.创建空行
    dt.Rows.Add();
    //3.通过行框架创建并赋值
    dt.Rows.Add(“张三”,DateTime.Now);//Add里面参数的数据顺序要和dt中的列的顺序对应 //4.通过复制dt2表的某一行来创建dt.Rows.Add(dt2.Rows[i].ItemArray);

    赋值和取值

    //新建行的赋值
    DataRow dr = dt.NewRow();
    dr[0] = “张三”;//通过索引赋值
    dr[“column1”] = DateTime.Now; //通过名称赋值
    //对表已有行进行赋值
    dt.Rows[0][0] = “张三”; //通过索引赋值
    dt.Rows[0][“column1”] = DateTime.Now;//通过名称赋值
    //取值
    string name=dt.Rows[0][0].ToString();
    string time=dt.Rows[0][“column1”].ToString();

    筛选行

    //选择column1列值为空的行的集合
    DataRow[] drs = dt.Select(“column1 is null”);
    //选择column0列值为"李四"的行的集合
    DataRow[] drs = dt.Select(“column0 = ‘李四’”);
    //筛选column0列值中有"张"的行的集合(模糊查询)
    DataRow[] drs = dt.Select(“column0 like ‘张%’”);//如果的多条件筛选,可以加 and 或 or
    //筛选column0列值中有"张"的行的集合并按column1降序排序
    DataRow[] drs = dt.Select(“column0 like ‘张%’”, “column1 DESC”);

    删除行

    //使用DataTable.Rows.Remove(DataRow)方法
    dt.Rows.Remove(dt.Rows[0]);
    //使用DataTable.Rows.RemoveAt(index)方法
    dt.Rows.RemoveAt(0);
    //使用DataRow.Delete()方法
    dt.Row[0].Delete();
    dt.AcceptChanges();

    //-----区别和注意点-----
    //Remove()和RemoveAt()方法是直接删除
    //Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。
    //用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。
    //如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
    for (int i = dt.Rows.Count - 1; i >= 0; i–)
    {
      dt.Rows.RemoveAt(i);
    }

    复制表

    //复制表,同时复制了表结构和表中的数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    //复制表
    DataTable dtNew = dt.Copy(); //复制dt表数据结构
    dtNew.Clear() //清空数据
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    if (条件语句)
    {
    dtNew.Rows.Add(dt.Rows[i].ItemArray); //添加数据行
    }
    }
    //克隆表,只是复制了表结构,不包括数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Clone();
    //如果只需要某个表中的某一行
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    dtNew.Rows.Clear();//清空表数据
    dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行

    表排序

    DataTable dt = new DataTable();//创建表
    dt.Columns.Add(“ID”, typeof(Int32));//添加列
    dt.Columns.Add(“Name”, typeof(String));
    dt.Columns.Add(“Age”, typeof(Int32));
    dt.Rows.Add(new object[] { 1, “张三” ,20});//添加行
    dt.Rows.Add(new object[] { 2, “李四” ,25});
    dt.Rows.Add(new object[] { 3, “王五” ,30});
    DataView dv = dt.DefaultView;//获取表视图
    dv.Sort = “ID DESC”;//按照ID倒序排序
    dv.ToTable();//转为表

    展开全文
  • C# DataSet和DataTable详解

    2013-07-24 10:29:29
    C# DataSet和DataTable详解
  • C# DataTable 详解及实例

    2019-06-10 17:55:08
    DataTable详解,转由Sandon的文章 添加引用 using System.Data;` 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空表 DataTable dt = new DataTable("Table_New"); ...

    DataTable详解,转由Sandon的文章

    • 添加引用
    using System.Data;`
    
    • 创建表
    //创建一个空表
    DataTable dt = new DataTable();
    
    //创建一个名为"Table_New"的空表
    DataTable dt = new DataTable("Table_New");
    
    • 创建列
    //1.创建空列
    DataColumn dc = new DataColumn();
    dt.Columns.Add(dc);
    
    //2.创建带列名和类型名的列(两种方式任选其一)
    dt.Columns.Add("column0", System.Type.GetType("System.String"));
    dt.Columns.Add("column0", typeof(String));
    
    //3.通过列架构添加列
    DataColumn dc = new DataColumn("column1",System.Type.GetType("System.DateTime"));
    DataColumn dc = new DataColumn("column1", typeof(DateTime));
    dt.Columns.Add(dc);
    
    • 创建行
    //1.创建空行
    DataRow dr = dt.NewRow();
    dt.Rows.Add(dr);
    
    //2.创建空行
    dt.Rows.Add();
    
    //3.通过行框架创建并赋值
    dt.Rows.Add("张三",DateTime.Now);//Add里面参数的数据顺序要和dt中的列的顺序对应 
    
    //4.通过复制dt2表的某一行来创建
    dt.Rows.Add(dt2.Rows[i].ItemArray);
    
    • 赋值和取值
    //新建行的赋值
    DataRow dr = dt.NewRow();
    
    dr[0] = "张三";//通过索引赋值
    dr["column1"] = DateTime.Now; //通过名称赋值
    
    //对表已有行进行赋值
    dt.Rows[0][0] = "张三"; //通过索引赋值
    dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
    
    //取值
    string name=dt.Rows[0][0].ToString();
    string time=dt.Rows[0]["column1"].ToString();
    
    • 筛选行
    //选择column1列值为空的行的集合
    DataRow[] drs = dt.Select("column1 is null");
    
    //选择column0列值为"李四"的行的集合
    DataRow[] drs = dt.Select("column0 = '李四'");
    
    //筛选column0列值中有"张"的行的集合(模糊查询)
    DataRow[] drs = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or
    
    //筛选column0列值中有"张"的行的集合并按column1降序排序
    DataRow[] drs = dt.Select("column0 like '张%'", "column1 DESC");
    
    • 删除行
    //使用DataTable.Rows.Remove(DataRow)方法
    dt.Rows.Remove(dt.Rows[0]);
    
    //使用DataTable.Rows.RemoveAt(index)方法
    dt.Rows.RemoveAt(0);
    
    //使用DataRow.Delete()方法
    dt.Row[0].Delete();
    dt.AcceptChanges();
    
    //-----区别和注意点-----
    //Remove()和RemoveAt()方法是直接删除
    //Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。
    //用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。
    //如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
    for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {
      dt.Rows.RemoveAt(i);
    }
    
    • 复制表
    //复制表,同时复制了表结构和表中的数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    //复制表
    DataTable dtNew = dt.Copy();  //复制dt表数据结构
    dtNew.Clear()  //清空数据
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        if (条件语句)
        {
             dtNew.Rows.Add(dt.Rows[i].ItemArray);  //添加数据行
        }
    }
    //克隆表,只是复制了表结构,不包括数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Clone();
    //如果只需要某个表中的某一行
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    dtNew.Rows.Clear();//清空表数据
    dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行
    
    • 表排序
    DataTable dt = new DataTable();//创建表
    dt.Columns.Add("ID", typeof(Int32));//添加列
    dt.Columns.Add("Name", typeof(String));
    dt.Columns.Add("Age", typeof(Int32));
    dt.Rows.Add(new object[] { 1, "张三" ,20});//添加行
    dt.Rows.Add(new object[] { 2, "李四" ,25});
    dt.Rows.Add(new object[] { 3, "王五" ,30});
    DataView dv = dt.DefaultView;//获取表视图
    dv.Sort = "ID DESC";//按照ID倒序排序
    dv.ToTable();//转为表
    

    DataTable 实例 参考转由晴天天晴的文章

    • 添加行
    private void CreateNewDataRow()
    {
        // Use the MakeTable function below to create a new table.
        DataTable table;
        table = MakeNamesTable();
    
        // Once a table has been created, use the 
        // NewRow to create a DataRow.
        DataRow row;
        row = table.NewRow();
    
        // Then add the new row to the collection.
        row["fName"] = "John";
        row["lName"] = "Smith";
        table.Rows.Add(row);
    
        foreach(DataColumn column in table.Columns)
            Console.WriteLine(column.ColumnName);
        dataGrid1.DataSource=table;
    }
    
    private DataTable MakeNamesTable()
    {
        // Create a new DataTable titled 'Names.'
        DataTable namesTable = new DataTable("Names"); 
    
        // Add three column objects to the table.
        DataColumn idColumn = new  DataColumn();
        idColumn.DataType = System.Type.GetType("System.Int32");
        idColumn.ColumnName = "id";
        idColumn.AutoIncrement = true;
        namesTable.Columns.Add(idColumn);
    
        DataColumn fNameColumn = new DataColumn();
        fNameColumn.DataType = System.Type.GetType("System.String");
        fNameColumn.ColumnName = "Fname";
        fNameColumn.DefaultValue = "Fname";
        namesTable.Columns.Add(fNameColumn);
    
        DataColumn lNameColumn = new DataColumn();
        lNameColumn.DataType = System.Type.GetType("System.String");
        lNameColumn.ColumnName = "LName";
        namesTable.Columns.Add(lNameColumn);
    
        // Create an array for DataColumn objects.
        DataColumn [] keys = new DataColumn [1];
        keys[0] = idColumn;
        namesTable.PrimaryKey = keys;
    
        // Return the new DataTable.
        return namesTable;
    }
    
    • 删除行
    private void DemonstrateAcceptChanges()
    {
        //Run a function to create a DataTable with one column.
        DataTable table = MakeTable();
        DataRow row;
    
        // Create a new DataRow.
        row = table.NewRow();
        // Detached row.
        Console.WriteLine("New Row " + row.RowState);
    
        table.Rows.Add(row);
        // New row.
        Console.WriteLine("AddRow " + row.RowState);
    
        table.AcceptChanges();
        // Unchanged row.
        Console.WriteLine("AcceptChanges " + row.RowState);
    
        row["FirstName"] = "Scott";
        // Modified row.
        Console.WriteLine("Modified " + row.RowState);
    
        row.Delete();
        // Deleted row.
        Console.WriteLine("Deleted " + row.RowState);
    }
    
    private DataTable MakeTable()
    {
        // Make a simple table with one column.
        DataTable table = new DataTable("table");
        DataColumn fnameColumn = new DataColumn(
            "FirstName", Type.GetType("System.String"));
        table.Columns.Add(fnameColumn);
        return table;
    }
    
    展开全文
  • C#_DataSet和DataTable详解

    2012-01-18 17:28:17
    C#_DataSet和DataTable详解
  • C__DataSet和DataTable详解

    2011-01-30 15:02:27
    C__DataSet和DataTable详解
  • C# DataTable详解

    2018-08-19 15:46:00
    添加引用 ...DataTable dt = new DataTable(); //创建一个名为"Table_New"的空表 DataTable dt = new DataTable("Table_New"); 创建列 //1.创建空列 DataColumn dc = new DataColumn...
  • C# 之 DataTable 详解

    2020-12-15 13:41:25
    DataTable dt = new DataTable(); // 方法二:创建一个名为"admin"的空表 DataTable dt = new DataTable("admin"); ▪ 创建列 // 方法一:创建空列 DataColumn dc = new DataColumn(); dt.Columns.Add(dc); // ...
  • DataSet和DataTable详解

    2009-04-28 20:58:00
    C# DataSet和DataTable详解2009-4-211、创建DataSet对象:DataSet ds = new DataSet("DataSetName");2、查看调用SqlDataAdapter.Fill创建的结构 da.Fill(ds,"Orders"); DataTable tbl = ds.Table[0]; foreach...
  • JQuery DataTable 详解

    万次阅读 2017-01-14 18:43:45
    之前博主介绍过一种submit局部刷新的办法,但是单单对于table刷新而去绑定form提交显得太过冗重麻烦,今天介绍下jquery dataTable自带的插件fnReloadAjax实现ajax异步请求刷新表格数据的方法。前提准备:导入...
  • 引用 C# DataSet和DataTable详解

    千次阅读 2011-08-09 09:41:25
    蓝色闪电 的 C# DataSet和DataTable详解 1、创建DataSet对象: DataSet ds = new DataSet("DataSetName"); 2、查看调用SqlDataAdapter.Fill创建的结构 da.Fill(ds,"Orde

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 486
精华内容 194
关键字:

datatable详解