C# DataTable.Select() 筛选数据 返回新DataRow[]

有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法,DataTable.Select(),其用法如下:

Select()

Select(string filterExpression)

Select(string filterExpression, string sort)

Select(string filterExpression,string sort, DataViewRowState record States)

1)  Select()——获取所有 System.Data.DataRow 对象的数组;

2)  Select(string filterExpression)——按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 System.Data.DataRow 对象的数组;

3)  Select(string filterExpression, string sort)——获取按照指定的排序顺序且与筛选条件相匹配的所有System.Data.DataRow 对象的数组;

4)  Select(string filterExpression, string sort, DataViewRowState recordStates)——获取与排序顺序中的筛选器以及指定的状态相匹配的所有。

举例说明:

有一个用户表,名称为 dtUsers,有id、姓名name、性别sex、年龄age

1.筛选所有的用户

DataRow[] drs1 =dtUsers.Select();

2.筛选所有性别为男的用户

DataRow[] drs2 =dtUsers.Select("sex = '男' ");

3.筛选所有性别为男且年龄在18岁以上的用户

DataRow[] drs3 =dtUsers.Select("sex = '男' and age >= 18");

4.筛选所有性别为男或者年龄在18岁以上的用户

DataRow[] drs4 =dtUsers.Select("sex = '男' or age >= 18");

5.筛选所有姓“夏”的用户

DataRow[] drs5 =dtUsers.Select("name like '夏%'");

6.筛选所有18岁以上的用户且按从大到小的顺序排序

DataRow[] drs5 =dtUsers.Select("age >=18","age desc");

7.上面最后一种用法没试过,有机会再列举出来。

注意事项

1.上面的Select操作是不区分大小写的(表字段不敏感,如pl-sql语法),如果需要区分大小写,需要将DataTable的caseSensitive属性设为true,例如上表的

dtUsers.CaseSensitive = true;//区分大小写

C#中DataRow的初始化

那么如何初始化这一个DataRow呢?我们知道,DataRow是DataTable的组件,而且在MSDN上可以看到DataRow的构造函数是protected类型的,它只能在内部进行构造,单独的实例化,DataRow row = new DataRow ()是不允许的。那么我们要使用DataRow就有以下两种方法进行实例化。

1、已知已存在的一个DataTable的对象table,当然这个对象的结构都已经有了,如下

DataRow row=table.NewRow();
这样便实例化了一个和已知的table一样的结构的一个DataRow 对象,可以对列进行赋值操作。

2、没有已知的DataTable,但是又想按自己写的结构保存,那么,就需要先实例化一个和你的需求一样的DataTable,然后,如1进行实例化。

static DataTable dt = null;
        private static DataTable Dt
        {
            get 
            {
                if (dt == null)
                {
                    dt = new DataTable();
 
                    dt.Columns.Add(列名1);
 
                    dt.Columns.Add(列名2);
 
                    dt.Columns.Add(列名3);
                }
                return dt;
            }
        }
实例化DataRow,

DataRow row=Dt.NewRow();
那么如果这个row在别的地方被引用,就可以取值

object value = row[列名1]
这样我们就可以在程序中保存一些数据,而不用再写一个Model类来保存了,避免在其他地方引用不方便。

如何给DataTable、DataRow 手动赋值

DataTable MyDataTable = new DataTable();

MyDataTable.Columns.Add(new DataColumn("学生编号", typeof(string)));
            MyDataTable.Columns.Add(new DataColumn("姓名", typeof(string)));
            MyDataTable.Columns.Add(new DataColumn("学校", typeof(string)));
            MyDataTable.Columns.Add(new DataColumn("联系电话", typeof(string)));
            MyDataTable.Columns.Add(new DataColumn("家庭住址", typeof(string)));

DataRow dr;
            for (int i = 0; i <= 10; i++)
            {
                dr = MyDataTable.NewRow();
                dr["学生编号"] = Guid.NewGuid().ToString();
                dr["姓名"] = "222";
                dr["学校"] = "444";
                dr["联系电话"] = "555";
                dr["家庭住址"] = "666";

MyDataTable.Rows.Add(dr);
            }

DataRow 类

DataRow 和 DataColumn 对象是 DataTable 的主要组件。使用 DataRow 对象及其属性和方法检索、评估、插入、删除和更新DataTable 中的值。DataRowCollection 表示 DataTable 中的实际 DataRow 对象,DataColumnCollection 中包含用于描述DataTable 的架构的 DataColumn 对象。使用重载的 Item 属性返回或设置 DataColumn 的值。

使用 HasVersion 和 IsNull 属性确定特定行值的状态,使用 RowState 属性确定行相对于它的父级 DataTable 的状态。

若要创建新的 DataRow,请使用 DataTable 对象的 NewRow 方法。创建新的 DataRow 之后,请使用 Add 方法将新的 DataRow添加到 DataRowCollection 中。最后,调用 DataTable 对象的 AcceptChanges 方法以确认是否已添加。有关将数据添加到DataTable 中的更多信息,请参见 将数据添加到表中。

您可通过调用 DataRowCollection 的 Remove 方法或调用 DataRow 对象的 Delete 方法,从 DataRowCollection 中删除DataRow。Remove 方法将行从集合中移除。与此相反,Delete 标记要移除的 DataRow。在调用 AcceptChanges 方法时发生实际移除。通过调用 Delete,您可在实际删除行之前以编程方式检查哪些行被标记为移除。有关更多信息,请参见 从表中删除行。

下面的示例通过调用 DataTable 对象的 NewRow 方法创建新的 DataRow

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

关于Datatable的一些用法

C#动态操作DataTable(新增行、列、查询行、列等)

方法一:动态创建一个DataTable ,并为其添加数据

public void CreateTable(){//创建表DataTable dt = new DataTable();//1、添加列dt.Columns.Add("Name", typeof(string)); //数据类型为 文本//2、通过列架构添加列DataColumn age = new DataColumn("Age", typeof(Int32));   //数据类型为 整形DataColumn Time = new DataColumn("Time", typeof(DateTime)); //数据类型为 时间dt.Columns.Add(age);dt.Columns.Add(Time);//1、添加空行DataRow dr1 = dt.NewRow();dt.Rows.Add(dr1);//2、添加空行dt.Rows.Add();//3、添加数据行DataRow dr2 = dt.NewRow();dr2[0] = "张三"; //通过索引赋值dr2[1] = 23;dr2["Time"] = DateTime.Now;//通过名称赋值dt.Rows.Add(dr2);//4、通过行框架添加dt.Rows.Add("李四", 25, DateTime.Now);//Add你们参数的数据顺序要和dt中的列顺对应}

方法二:为已有DateTable添加一新列,其值可设为默认值,也可设这列不可为空。

        public void CreateTable(DataTable vTable){//为已有DataTable添加一新列DataColumn dc1 = new DataColumn("Tol", typeof(string));vTable.Columns.Add(dc1);//添加一新列,其值为默认值DataColumn dc2 = new DataColumn("Sex", typeof(string));dc2.DefaultValue = "男";dc2.AllowDBNull = false;//这在初床表的时候,其作用,在为已有表新增列的时候,不起作用vTable.Columns.Add(dc2);}

方法三:筛选DataTable中的数据,使用 Select()方法,把赛选结果可以保存到 DataRow[] drArr; 数据里面,也可以另存为一个新DataTable

            DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FROM T1"查询出来的结果for (int i = 0; i < dt.Rows.Count; i++){if (dt.Rows[i]["C1"].ToString() == "abc")//查询条件{//进行操作}}

//但这种做法用一两次还好说,用多了就累了。那有没有更好的方法呢?就是dt.Select(),上面的操作可以改成这样:

DataRow[] drArr = dt.Select("C1='abc'");//查询(如果Select内无条件,就是查询所有的数据)

//还可以这样操作:
            DataRow[] drArr1 = dt.Select("C1 LIKE 'abc%'");//模糊查询(如果的多条件筛选,可以加 and 或 or )
            DataRow[] drArr2 = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC");//另一种模糊查询的方法
            DataRow[] drArr3 = dt.Select("C1='abc'", "C2 DESC");//排序

//问题又来了,如果要把DataRow赋值给新的DataTable,怎么赋值呢?你可能会想到: 
            DataTable dtNew1 = dt.Clone();
            for (int i = 0; i < drArr.Length; i++)
            {
                dtNew1.Rows.Add(drArr[i]);
            }
            
            //但这样程序就会出错,说该DataRow是属于其他DataTable的,那要怎么做呢?很简单,这样就可以解决了: 
            DataTable dtNew2 = dt.Clone();
            for (int i = 0; i < drArr.Length; i++)
            {
                dtNew2.ImportRow(drArr[i]);//ImportRow 是复制
            }
        }

方法四:对DataTable筛选指定字段,并保存为新表

public void SelectColumnDataTable(DataTable dt)
        {
            //对DataTable筛选指定字段,并保存为新表
            DataTable dtNew = dt.DefaultView.ToTable(false, new string[] { "列名", "列名", "列名" });//这些列名,确保dt中存在,否则会报错误
        }

方法五:对DataTable进行排序设置(sort)

public void SortDataTable(DataTable dt)
        {
            dt.DefaultView.Sort = "id desc";//重新设置排序
            DataTable dtNew = dt.DefaultView.ToTable(); //保存在一张新表中
        }

方法六:对DataTable去除重复行
   1 数据库直接去除重复
   select distinct * from 表名
    去除了重复行distinct

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"
方法七:DataTable 修改列名 删除列 增加列 调整列顺序

DataTable myDt =dt;  
    //删除列  
    myDt.Columns.Remove("minArea");  
    myDt.Columns.Remove("maxArea");  
      
    //调整列顺序 ,列排序从0开始  
    myDt.Columns["num"].SetOrdinal(1);  
      
    //修改列标题名称  
    dt.Columns["num"].ColumnName = "搜索量";  
    dt.Columns["rate"].ColumnName = "百分比";  
    
    DataColumn priceColumn = new DataColumn();
        //该列的数据类型
        priceColumn.DataType = System.Type.GetType("System.String");
        //该列得名称
        priceColumn.ColumnName = "price";
        //该列得默认值
        priceColumn.DefaultValue ="test";
        
    dt.Columns.Add(priceColumn);

DataTable添加列和行的三种方法

 #region 方法一: DataTable tblDatas = new DataTable("Datas");DataColumn dc = null;dc = tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));dc.AutoIncrement = true;//自动增加 dc.AutoIncrementSeed = 1;//起始为1 dc.AutoIncrementStep = 1;//步长为1 dc.AllowDBNull = false;dc = tblDatas.Columns.Add("Product", Type.GetType("System.String"));dc = tblDatas.Columns.Add("Version", Type.GetType("System.String"));dc = tblDatas.Columns.Add("Description", Type.GetType("System.String"));DataRow newRow;newRow = tblDatas.NewRow();newRow["Product"] = "这个地方是单元格的值";newRow["Version"] = "2.0";newRow["Description"] = "这个地方是单元格的值";tblDatas.Rows.Add(newRow);newRow = tblDatas.NewRow();newRow["Product"] = "这个地方是单元格的值";newRow["Version"] = "3.0";newRow["Description"] = "这个地方是单元格的值";tblDatas.Rows.Add(newRow);#endregion
            #region 方法二: DataTable tblDatas = new DataTable("Datas");tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));tblDatas.Columns[0].AutoIncrement = true;tblDatas.Columns[0].AutoIncrementSeed = 1;tblDatas.Columns[0].AutoIncrementStep = 1;tblDatas.Columns.Add("Product", Type.GetType("System.String"));tblDatas.Columns.Add("Version", Type.GetType("System.String"));tblDatas.Columns.Add("Description", Type.GetType("System.String"));tblDatas.Rows.Add(newobject[] { null, "a", "b", "c"});tblDatas.Rows.Add(newobject[] { null, "a", "b", "c"});tblDatas.Rows.Add(newobject[] { null, "a", "b", "c"});tblDatas.Rows.Add(newobject[] { null, "a", "b", "c"});tblDatas.Rows.Add(newobject[] { null, "a", "b", "c"});#endregion
#region 方法三: DataTable table = new DataTable();//创建table的第一列 DataColumn priceColumn = new DataColumn();priceColumn.DataType = System.Type.GetType("System.Decimal");//该列的数据类型 priceColumn.ColumnName = "price";//该列得名称 priceColumn.DefaultValue = 50;//该列得默认值 // 创建table的第二列 DataColumn taxColumn = new DataColumn();taxColumn.DataType = System.Type.GetType("System.Decimal");taxColumn.ColumnName = "tax";//列名 taxColumn.Expression = "price * 0.0862";//设置该列得表达式,用于计算列中的值或创建聚合列 // 创建table的第三列 DataColumn totalColumn = new DataColumn();totalColumn.DataType = System.Type.GetType("System.Decimal");totalColumn.ColumnName = "total";totalColumn.Expression = "price + tax";//该列的表达式,是第一列和第二列值得和 // 将所有的列添加到table上 table.Columns.Add(priceColumn);table.Columns.Add(taxColumn);table.Columns.Add(totalColumn);//创建一行 DataRow row = table.NewRow();table.Rows.Add(row);//将此行添加到table中 //将table放在视图中 DataView view = new DataView(table);//绑定到DataGrid dg.DataSource = view;dg.DataBind();#endregion

将DataTable一行放入另一个DataTable中

【概述】从一个DataTable中取一行放到另一个DataTable里报错: 该行已经属于另一个表

第1种方法:

DataTable dt = new DataTable();
dt = ds.Tables["All"].Clone();//克隆All的结构传递给dt
DataRow[] dr = this.dataSet31.Tables["Product"].Select("bc=1"); //通过条件得到符合条件的行for(int i=0;i<dr.Length;i++)
{//将数组元素加入表...dt.Rows.Add(dr[i]);//出错提示为:该行已经属于另一个表
}// 修改后DataTable dt = new DataTable();dt = ds.Tables["All"].Clone();//克隆All的结构传递给dtDataRow[] dr = this.dataSet31.Tables["Product"].Select("bc=1"); //通过条件得到符合条件的行
for(int i=0;i<dr.Length;i++)
{//将数组元素加入表...dt.Rows.Add(dr[i].ItemArray);
}

第2种方法:

DataTable dt1 = new DataTable();
DataTable calcdt = new DataTable();
// dt1只是获取表结构,无数据;
// calcdt 有表结构,有数据
// 原方法
foreach (DataRow dr in calcdt.Rows)
{dt1.Rows.Add(dr);
}// 改进后的方法DataRow drcalc;
foreach (DataRow dr in calcdt.Rows)
{drcalc = dt1.NewRow();drcalc.ItemArray = dr.ItemArray;dt1.Rows.Add(drcalc);
}

【淘宝ERP-资料收集】关于Datatable的一些用法相关推荐

  1. OpenERP的淘宝ERP方案

    一.系统功能 OpenERP是欧洲中小企业使用人数最多的ERP软件,是世界上排名第一的开源ERP软件.OpenERP软件功能丰富,平台先进,源码开放,可扩展性强,软件免费. 基于OpenERP软件的淘 ...

  2. 收集淘宝店铺资料的小程序

    Ruby学习持续进行中 看到业务人员不停的在Ctrl+c与Ctrl+v,还是把固定格式的淘宝搜索结果加入到excel表格中. 还好每人分了几个类目,不过也够浪费体力的了. 我虽然很懒,但也忍不住了,直 ...

  3. 采集淘宝API数据,抓取淘宝商品资料无需申请appkey

    为了进行淘宝的API开发,首先我们需要做下面几件事情. 1)开发者注册一个账号 2)然后为每个淘宝应用注册一个应用程序键(App Key) . 3)下载淘宝API的SDK并掌握基本的API基础知识和调 ...

  4. 如何借助内容营销快速提升新品流量[淘宝erp、打单发货接口]

    大家好,我是小编v兔.我们都知道,做电商,流量是必须要争取的.因为只有有了流量,才可能有其他的数据的产生,比如收藏.加购.转化等数据.说通俗一点,这就好比线下生意,好的商圈,好的位置,大的人流,你的店 ...

  5. 【淘宝ERP】WinForm(C#):登录页面实现+SQL Server数据库连接方式

    登录窗口后台验证 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  6. 【淘宝ERP-资料收集】C# 类型 对应 SQLserver类型

    C#操作SQL float类型数据,在C#中用double类型就OK了,C#数据类型和SQL数据类型对照 C#操作SQL Float类型,数据会多很多小数,原来是C#的float和sql的float类 ...

  7. 拼多多店铺被投诉出现降权怎么办?【淘宝erp、打单发货接口】

    店铺做久了免不了会偶尔出现店铺降权,但是我们如何应对降权,如何能把店铺的损失减小呢,接下来从六个方面为您讲解 1.老客户 若你的产品是可以重复消费者,需尽快制定一个优惠活动,然后通知你的老客户,让老客 ...

  8. 获取匹配产品规则、淘宝erp、淘宝打单发货接口

    获取匹配产品规则 接口地址: http://api.vv-tool.com/tool/erps/schema 接口介绍: ISV 发布商品前,需要先查找到产品 ID,这个接口返回查找产品规则入参规则 ...

  9. 【淘宝ERP】C#与SQLServer数据库连接

    连接数据库一般有两种方式        1.使用SQL用户名.密码验证 Data Source = 服务器名:Initial Catalog = 数据库名:User ID = 用户名:Pwd = 密码 ...

最新文章

  1. RxJava 过滤操作符 throttleFirst 与 throttleLast 以及 sample
  2. Tensorflow图像通道合并,IndexError: too many indices for array
  3. u盘排序软件_总有一款U盘适合你
  4. 机器人学习--视觉定位数据集介绍
  5. 印度打车软件Ola将登陆伦敦,或将取代被吊销伦敦执照的Uber
  6. 玩转spring boot——开篇
  7. AC自动机(Aho-Corasick automation)(转)
  8. iOS、OSX恶意软件风险大增 果粉稍不留神即遭“黑手”
  9. 安装USB--RS232驱动,提示设备无法启动,解决方法
  10. 快手分享链接,实战解析无水印视频源码
  11. 2018python教程百度云盘_python基础教程视频网盘_python教学视频2018百度云
  12. 零碎技术栈01_UML画图分析
  13. Mentor许可、许可分析、分析许可
  14. 如何使用工资短信生成器
  15. 网件刷breed_小白爱折腾 篇二:矿渣小娱C1刷breed以安装固件(适用其他路由器)...
  16. 右键添加cmd命令快捷键,右键cmd快捷键丢失
  17. 经典指标:SAR算法和应用
  18. Linux基础 - 服务管理(systemd)
  19. python中repr_Python中的repr()函数
  20. 拼多多存在多种重大风险

热门文章

  1. 官方确认:新增一所“双一流”大学!
  2. Java Swing基础使用教程
  3. 调用pyspark.ml库对信用卡逾期进行预测
  4. 计算机病毒通过读写或复制移动,计算机病毒除通过读写或复制移动存储器上带病毒的文件传染外,另一条主要的传染途径是...
  5. 看书要仔细----自定义控件库摸索记
  6. 二、农村土地家庭承包改革
  7. 前端使用setInterval定时器,使用clearInterval()清除时,清楚不彻底的原因。
  8. 基于Android网上在线学生选课系统
  9. stagefright 架构分析(四) MediaExtractor
  10. SEO歪解:SEO与厨师的联想