/*在DataTable中更新、删除数据*/

来源:互联网 发布:学编程学费要多少钱 编辑:程序博客网 时间:2024/05/24 05:03

原文地址:http://www.cnblogs.com/simhare/archive/2007/07/21/826465.html

在DataTable中选择记录

 /*在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更高效              
             
*/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 硫酸铬钾中毒怎么办 门锁能扭动却打不开怎么办 防盗门保险坏了怎么办 厦门工会卡过期怎么办 阴雨天被子受潮怎么办 衣服晾臭了怎么办 喷砂机油水分离泵有油怎么办 水太烫玻璃瓶盖打不开怎么办 玻璃罐的玻璃盖打不开怎么办? 开红酒没有开瓶器怎么办 手机卡突然坏了怎么办 滚筒洗衣机打不开门怎么办 全自动洗衣机门开不开怎么办 好期待评分不足怎么办 单片机数码管亮度低怎么办 猫的同轴灯不亮怎么办 楼下邻居太吵怎么办 冰箱冷却液内露怎么办 冷却水没有了会怎么办 金立m7信号不好怎么办 csgo凉了饰品怎么办 模型拟合度低怎么办 石膏线用发泡胶怎么办 电表上显示err10怎么办 电表显示欠压怎么办 tcl电视遥控器失灵怎么办 玩具汽车遥控器失灵怎么办 玩具车遥控丢了怎么办 按压扣坏了怎么办 电脑用不了鼠标怎么办 多肉上的肉虫子怎么办 警察被取消警衔怎么办 隐形眼镜带歪了怎么办 gta5正在加载慢怎么办 gta5线上卡住了怎么办 皮子掉的颜色怎么办 gta5死了之后车怎么办 潜水口里有水怎么办 800度近视潜水怎么办 不会游泳深潜怎么办 高度近视浮潜怎么办