当我们频繁的对数据库进行操作时,可能造成CPU使用率过高,这时我们可以先将数据表读取到DataTable,然后在必要的时候再更新到数据库中。
以下是DataTable中对数据的选择和更新操作。采用DataTable.Select()方法。采用该方法获取的结果是DataRow对象数组。Select()有三种重载(以下资料来自MSDN):
MSDN关于Select()方法内容链接

以下依次进行说明:
1.Select() 获取DataTable中的所有行,转换成DataRow的格式。这里不做过多说明,以下对dtTest(非空的DataTable)使用Select()

DataRow[] rows = dtTest.Select();
1
2.Select(String expression) 如以下例子所示,expression代表筛选的表达式(sql语句where之后的部分),但不包含排序方式。

DataRow[] rows = dtTest.Select("id<5");
1
3.Select(String expression , String sortOrder ) 其中sortOrder 代表排序方式(字段名称+正序或者倒序)。

DataRow[] rows = dtTest.Select("id<5","id ASC");
1
4.DataTable.Select (String expression , String sortOrder , DataViewRowState dVRState) 其中dVRState代表这一个数据集合的状态。枚举类型。详细内容可参考以下链接:
DataViewState详细介绍

DataRow[] rows = dtTest.Select("id<5","id ASC",DataViewRowState.Added);
1
!!!更新DataTable
有了以上的基础我们即可以根据条件轻松的获取DataTable中的想要的内容了。只不过通过Select()方法获取的结果是DataRow[ ]形式,如果需要将其转换为DataTable格式,可采用如下的方法(全是自己码的,觉得好用给我点个赞,^_^):

//建立一张数据表
DataTable dtInitial = new DataTable("Orders");
dtInitial.Columns.Add("id", typeof(Int32));
dtInitial.Columns.Add("name", typeof(string));

//向表中添加数据
for (int i = 0; i < 10; i++)
{
DataRow newRow = dtInitial.NewRow();
newRow["id"] = i;
newRow["name"] = "未命名";
dtInitial.Rows.Add(newRow);
}
//更新表的条件
string expression = "id < 5 ";
//要更新的字段
string variable = "name";
//更新字段的值
string value = "Clear_mind";
//不重复字段
string primaryKey = "id";

DataTable dtReturn = null; //用于返回结果的DataTable
DataRow[] arrRow = dtInitial.Select(expression); //选出满足更新条件的行
dtReturn = arrRow[0].Table.Clone(); //复制需要更新的表的结构

bool[] rowChanged = new bool[dtInitial.Rows.Count]; //用于保存修改的行的索引号
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
rowChanged[i] = false;
}

//将修改的行存入dtReturn
foreach (DataRow row in arrRow)
{
row[variable] = value; //将要更新的值写入需要更新的行的对应字段
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
//找到修改过的行
if (dtInitial.Rows[i][primaryKey].ToString() == row[primaryKey].ToString())
{
dtReturn.ImportRow(row); //将修改过的行存入dtReturn
rowChanged[i] = true; //将修改过的行号对应的标志位置1
break;
}
}

}

//将未修改的行存入dtReturn
for (int i = 0; i < dtInitial.Rows.Count; i++)
{
if (rowChanged[i] == false)
dtReturn.ImportRow(dtInitial.Rows[i]);
}
//打印结果
for (int i = 0; i < dtReturn.Rows.Count; i++)
{
Console.WriteLine(dtReturn.Rows[i]["name"].ToString());
}
---------------------
作者:DurableHumor
来源:CSDN
原文:https://blog.csdn.net/my_clear_mind/article/details/79673205
版权声明:本文为博主原创文章,转载请附上博文链接!

C# 对DataTable中按条件进行筛选和更新。的更多相关文章

  1. 关于c#在DataTable中根据条件删除某一行

    我们经常会将数据源放在DataTable里面,但是有时候也需要移除不想要的行,下面的代码告诉你们 DataTable dts:                DataRow[] foundRow;   ...

  2. mysql中运用条件判断筛选来获取数据

    ### part1 单表查询 sql查询完整语法: select .. from .. where .. group by .. having .. order by .. limit .. 一.wh ...

  3. [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法

    -- :09关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 在实际编程工程中,常常遇到这样的情况:DataTable并不 ...

  4. C#如何对DataTable中的数据进行条件搜索

    经常遇到将数据库中的数据读取到DataTable中的时候再次对DataTable进行条件筛选,下面的筛选的一个例子: DataRow[] dr = dt.Select("token = '& ...

  5. 在DataTable中执行DataTable.Select("条件")返回DataTable;

    转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...

  6. 在DataTable中执行DataTable.Select("条件")

     .在DataTable中执行DataTable.Select("条件")返回DataTable:  // <summary> // 执行DataTable中的查询返回 ...

  7. DataTable中执行DataTable.Select("条件"),

    我们在使用Sql ******这些数据库时,可以轻松的通过Sum.Aver.Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Serv ...

  8. python基础一 -------如何在列表字典集合中根据条件筛选数据

    如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) fi ...

  9. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

随机推荐

  1. CRM 安装不规范,亲人两行泪

    安装CRM需要严格按照CRM部署文档的要求进行,比如设置CRM服务的服务账号一定要加入到CRM所在组织库用户里,不然会遇到下面错误.这个就是传递到SQL 的账号,在SQL那边不识别 <s:Env ...

  2. Uninstall Tool3.5.3

    2.卸载所有和MySQL相关的程序,有好几个,注意,一定要删除与MySQL相关的所有的数据,不能用MySQL自带的卸载,我是用Uninstall Tool3.5.3,在卸载程序界面,右键选择与MySQ ...

  3. Vue实战指南之依赖注入(provide / inject)

    案例 UI美眉说咱家的选项菜单太丑了,小哥哥能不能美化一下呀,洒家自然是说小意思啦~自定义一个select组件,so easy~ 简单粗暴型: <el-select v-model=" ...

  4. Gym - 100676F Palindrome —— 并查集

    题目链接:https://vjudge.net/contest/155789#problem/E 题解: 由于是回文串,所以可以先将在对称位置的字符放在同一个集合(如果期间有两个非‘?’,且不相等,则 ...

  5. 使用NSTask调用shell

    - (NSString *)cmd:(NSString *)cmd { // 初始化并设置shell路径 NSTask *task = [[NSTask alloc] init]; [task set ...

  6. 多线程之:volatile变量的一次写操作的过程

    一:对volatile修饰的变量进行一次写操作的完整过程   在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配.其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程 ...

  7. [SDOI 2015] 星际战争

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3993 [算法] 首先发现问题具有单调性 , 不妨二分答案mid 考虑网络流 : 将源 ...

  8. Tutte矩阵求一般图最大匹配

    [集训队2017论文集] 一张无向图的Tutte矩阵为 其中xi,j为一个random的值. Tutte矩阵的秩(一定为偶数)/2 就是这张图的最大匹配. 原理大概就是: 一个图有完美匹配,则det( ...

  9. web2py远程开发

    Hyper-v下安装测试环境: CentOS 6.5, 默认的Python 2.6, web2py 主机Win8.1 问题:远程管理显示“管理因不安全通道而关闭”,只能访问网页,不能进入管理界面. 找 ...

  10. Win10设置vs2010总是以管理员身份运行

    有的项目用vs打开后直接运行总是要求提升权限,如下图       1.第一步(这样的方式只能是先运行vs,然后再打开项目,这样才是以管理员的身份运行的.但是如果是通过sln文件的快捷方式打开的,却不是 ...