/*在DataTable中选择记录*/
            /* 向DataTable中插入记录如上,更新和删除如下:
             * ----但是在更新和删除前,首先要找出要更新和删除的记录。
             * 一种方法是遍历DataRow,搜索想要的记录,
             * --〉然而更聪明的办法是使用DataTable.Select方法:table.Select();
             * table.Select();//返回DataRow[],可以包含一行或多行,
             * 取决于Select()的参数(filter)
             * gets an array of all Data.DataRow objects that match the
             * filter in the order of the sort 
             * that match the specified state
             */
            DataRow[] arrRows = table.Select("title_id='JP1001'");
            /*
             * 下面这条语句选择(返回)"Price"字段值小于10的DataRow
             */
            DataRow[] arrRows = table.Select("price<10.00");
            /*
             * 下面这条语句选择Pubdate字段日期在2000年1月1日当天或之后的DataRow 
             */
            DataRow[] arrRows = table.Select("pubdate>='#1/1/2000#'");
            /*如果想知道Select返回了多少行,读取数组的Length属性*/
            /*传递给DataTable.Select()的筛选器表达式: 
             * 下面比较操作符可以被支持:<,<=,=,>=,>和<>也可以使用IN和Like
             */
            //返回"state"等于CA、TN或WA的所有行
            DataRow[] arrRows = table.Select("state in('ca','tn','wa')");
            //返回"state"以CA开头的所有行
            DataRow[] arrRows = table.Select("state like 'ca*'");
            //还可以使用一些Sql函数,在DataTable中选择State字段为空的记录
            DataRow[] arrRows = table.Select("isnull(state,0)=0");
            //还可以使用And、Or和Not
            DataRow[] arrRows = table.Select("state='tn' and zip like '37*'");
            /*总之,可以用括号分组,创建复杂的布尔表达式*/

在DataTable中更新数据

/*在DataTable中更新数据*/
            /*
             * 确定了要在DataTable中更新的记录后,
             * 只要把记录的一个或多个字段替换成要更新的值即可,
             * 下面的例子选择Pubs数据库的Titles表中所有ytd_sales大于10000的记录
             * 把它们的价格加10.00
             */
            SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "Titles");

            DataTable table = ds.Tables["Titles"];
            DataRow[] arrRows = table.Select("ytd_sales>10000");
            foreach (DataRow row in arrRows)
            {
                row["price"] = (decimal)row["price"] + 10.00m;
            }


/*从DataTable中删除记录*/
            /*
             * 对每个要删除的行调用Delete就行了。
             */
            /*
             * 下面删除ytd_sales小于10000或等于空的记录
             * 
             */
            SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "Titles");

            DataTable table = ds.Tables["Titles"];
            DataRow[] arrRows = table.Select("ytd_sales<10000 or isnull(ytd_sales,0)=0");
            foreach (DataRow row in arrRows)
            {
                row.Delete();
            }

把更改写回数据库DataAdapter.Update

 /*把更改写回数据库DataAdapter.Update*/
            /*Important: 这种在DataTable中进行的插入、更新和删除并不会自动写回数据库 
             */
            SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "Titles");
            
            //插入记录
            DataTable table = ds.Tables["Titles"];
            DataRow row = table.NewRow();
            row["Title_id"] = "JP1001";
            row["title"] = "programming Microsoft .NET";
            row["price"] = 59.99m;
            row["ytd_sales"] = 100000;
            row["type"] = "business";
            row["pubdate"] = new DateTime(2002, 5, 1);
            table.Rows.Add(row);
            //更新数据库
            adapter.Update(table);
            
            /*DataAdapter的Update方法检查传递给表的每一条记录,把自从上次更新
             * (或自从上次调用table的AcceptChanges方法后)被插入、更新或删除的行
             * 写回数据库。如果DataSet中包含了多个被修改的DataTable,就把整个DataSet
             * 传给Update方法: adapter.Update(ds),所有改变会被一次性写回。
             */
            /*
             * 哦,还有许多演示DataAdapter.Update的用法的示例,演示了通过调用名为GetChanges
             * 的方法创建一个只含有被插入、更新或删除行的新的临时DataSet或者DataTable
             * ,然后把delta传递给DataAdapter.Update,如下:
             * //更新数据库
             * DataTable delta = table.GetChanges();
             * adapter.Update(delta);
             * 这种方法的确好用,但不是必需的。Update会忽略包含已修改和未修改的行的DataTable中
             * 未被修改的行。
             * 当要控制写回数据库中的更改的内容的顺序时,GetChanges方法发挥作用,
             * 如果想在Insert前面执行Delete,以避免主键重复错误,应该这样做: 
             */
            //DataRowState ---->enum System.Data.DataRowState
            //DataRowState.Deleted---->the row was deleted 
            //                        using the row.Delete()
            DataTable deletes = table.GetChanges(DataRowState.Deleted);
            adapter.Update(deletes);
            DataTable inserts = table.GetChanges(DataRowState.Added);
            adapter.Update(inserts);
            /*GetChanges的另一个用处是,
             * 当更新不是在本地执行时,把机器间的数据传输量减到最小,
             * 只传递被改变的DataSet或DataTable比传递整个DataSet或DataTable更高效              
             */

在DataTable中更新、删除数据的更多相关文章

  1. oracle插入,更新,删除数据

    插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...

  2. 去除DataTable中的重复数据

    有时需要从DataTable中抽取Distinct数据,遍历比较费劲,C#.NET中其实有更易用的方法,如下: string[] columnArray = { "columnName1&q ...

  3. 【转载】C#如何往DataTable中新增一个数据列

    在C#中的Datatable数据变量的操作过程中,有时候我们需要往现有的DataTable中新增一个自定义数据列,该列在原有的DataTable变量中并不存在,属于用户手工自定义新增的数据列,在往Da ...

  4. 如何删除datatable中的一行数据

    在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...

  5. Hibernate更新删除数据后,再查询数据依然存在的解决办法

    删除数据后,重新查询了数据库,DB中记录已经删除了,但是数据依然能查询到,网上都说是Hibernate的缓冲问题. 我对session进行了clear,flush,并且在事务和查询中都对session ...

  6. MariaDB 插入&更新&删除数据(8)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  7. Mysql添加更新删除数据-表

    例如 此处拥有一个表名为 uuser 为表添加新数据 ,'); ,'); ,'); 假如只想添加uid和uname ,'小张'); 那么pas自动填充为NULL. 为表更新数据 这里把小王的pas改成 ...

  8. 关于C#读取MySql数据时,返回DataTable中某字段数据是System.Array[]形式

    我在使用C#(VS2008)读取MySql数据库(5.1版本)时,返回的DataTable数据中arrivalDate字段数据显示为System.Array[]形式(程序中没有对返回的数据进行任何加工 ...

  9. 比较DataTable中新旧数据

    内容不写了,代码上都做了写注释. 1   /**//// <summary>  2        /// 比较两个数据表,并返回比较结果表  3        /// 比较条件:  4   ...

随机推荐

  1. navBar

    改变NavgationBar的颜色: [[UINavigationBar appearance] setBarTintColor:[UIColor blackColor]]; 改变NavgationB ...

  2. ios7新特性1-UI变化、UIKit动态行为支持与Text Kit新接口

    iOS 7.0新特性1 iOS 7的UI经过了重新设计.另外,iOS7中引入了新的动画系统,便于创建2D和2.5D的游戏.多任务支持提升,点对点通讯以及其他重要的特征使iOS7相对于以往的SDK来说发 ...

  3. 多线程操作中为什么使用while而不是if来做判断状态是否就绪

    在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景.这里对状态的判断使用的是while而不是单线程下常用的if. 以下示例展示了一个简单的生产者-消费者模型:当队列满的 ...

  4. Keil编译后的各文件介绍

    编译生成的文件: .plg:编译器编译结果 .hex和.bin:可执行文件 .map和.lst:链接文件 .obj:目标文件 .crf..lnp..d和.axf:调试文件 .opt:保存工程配置信息 ...

  5. Java实现字符串反转

    替换原则:index k 的值和 n-k 的值进行交换.(始终记住程序员的n.k都是字符串的实际位置.) 乘除的最基本实现还是来源于移位操作. public String reverse(String ...

  6. bzoj3208: 花神的秒题计划Ⅰ

    3208: 花神的秒题计划Ⅰ Time Limit: 16 Sec  Memory Limit: 128 MBSubmit: 323  Solved: 211[Submit][Status] Desc ...

  7. 杂项(最小表示法):HZOI 2015 Glass Beads

    [题目描述] 给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示. [输入格式] 第一行是串的长度,第二行是字符串. [输出格式] ...

  8. 待解决)leetcode 路径和 dfs 线序遍历

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  9. 关于View和VIewController的关系和理解

    之前看过关老师的视频之后就有写关于视图切换的程序,不过那是很久之前了,那时候也不知道什么是View,什么是VIewController,就知道照着写.这次项目的时候,我又碰到了这个问题,我自以为比较能 ...

  10. octopress 如何添加youku视频和本地视频(octopress how to add a youku video or a local video)

    用octopress 官方的video tag 可以添加视频,但是由于国内经常使用的是youku,所以下面是如何添加youku视频到octopress的教程. 首先添加youku.rb文件到路径:oc ...