C#获取变更过的DataTable记录的实现方法

 更新时间:2014年08月05日 10:36:33   投稿:shichen2014  
这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下

本文实例讲述了C#获取变更过的DataTable记录的实现方法,是一个非常实用的功能!具体实现方法如下:

首先DataTable可以看做是一个物理表的内存式存储,每一个DataRow都有一个属性叫做RowState。因此任意一行中某一个字段发生改变,那么整个DataRow的RowState也就发生了改变。RowState是一个枚举,其中包含5个内容:

1)Detached:未被附加(一般刚创建的DataRow,或者已经被Remove或者RemoveAt,或者Delete之后调用过AcceptChanges方法的行,或者是WinForm控件DataGridView默认设置下最后那个永远也留出的空行……都被自动设置该状态)。

2)Added:刚添加的新行。

3)Deleted:刚被删除的行(注意:这里只是从内存表中删除,物理数据表中尚未删除,此时你无法直接去访问该行的某个字段的内容!)。

4)Modified:刚被修改的行。

5)Unchanged:原来的行。

DataTable批量通过内部遍历这些行的RowState,然后借助DataAdapter的CRUD方法根据这些State调用不同的语句批量更新到真实数据表中。

如果要取消可以调用DataTable的RejectChanges方法,确认从内存表中删除才调用AcceptChanges方法。

通过DataRow的RowState最多只能判断哪行被修改,那么调用不同的语句如何进行更新呢?比如说我要更新一行,肯定使用update……where语句,where后面的条件是一个旧值,set是一个新值,如何获取旧值呢?

.NET中的DataColumn有一个属性叫做DataRowVersion,这个属性有4个:

1)Current:当前数值(DataRowState=Deleted时候无效)。

2)Original:原来数值(DataRowState=Added或者Unchanged时候无效)。

3)Proposed:建议数值(仅在DataRowState=Detached的时候有效)。

3)Default:默认数值(DataRowState=Added,Modified或者Unchanged时,等于Current;如果DataRowState=Deleted,等于Original;如果DataRowState=Detached,那么等于Proposed)。该属性可以自动调整,你吃不准哪一行的属性,一律可以使用这个属性获取特定字段的内容。

根据这个法则,我们再结合微软DataTable的GetChanges方法轻易可以获取做了任意变更的源数据和现实数据,具体C#实现代码如下:

DataTable dt = new DataTable();
dt.Columns.Add("Id");
for (int i = 1; i < 11; i++)
{
dt.Rows.Add(i);
}
dt.AcceptChanges();
//添加第十一行
dt.Rows.Add(11);
//修改第二行
dt.Rows[1][0] = 21;
//删除第一行
dt.Rows[0].Delete();
//检索情况
DataTable cdt = dt.GetChanges();
for (int i = 0; i <cdt.Rows.Count; i++)
{
if (cdt.Rows[i].RowState == DataRowState.Deleted)
{
  Console.WriteLine("删除的行索引{0},原来数值是{1}",i,cdt.Rows[i][0,DataRowVersion.Original]);
}
else if (cdt.Rows[i].RowState == DataRowState.Modified)
{
  Console.WriteLine("修改的行索引{0},原来数值是{1},现在的新数值{2}", i, cdt.Rows[i][0, DataRowVersion.Original],cdt.Rows[i][0,DataRowVersion.Current]);
}
else if (cdt.Rows[i].RowState == DataRowState.Added)
{
  Console.WriteLine("新添加行索引{0},数值是{1}", i, cdt.Rows[i][0, DataRowVersion.Current]);
}
}

相关文章

  • C#实现SSE(Server-Sent Events)服务端和客户端的示例代码

    C#实现SSE(Server-Sent Events)服务端和客户端的示例代码

    这篇文章主要为大家详细介绍了C#实现SSE(Server-Sent Events)服务端和客户端的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2024-03-03
  • C#泛型约束的深入理解

    C#泛型约束的深入理解

    本篇文章是对C#中的泛型约束进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#逐行读取txt文件的方法

    C#逐行读取txt文件的方法

    这篇文章主要介绍了C#逐行读取txt文件的方法,是C#程序设计中非常实用的一个技巧,需要的朋友可以参考下
    2014-09-09
  • C# TaskScheduler任务调度器的实现

    C# TaskScheduler任务调度器的实现

    本文主要介绍了C# TaskScheduler任务调度器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2023-05-05
  • C#使用IronPython库调用Python脚本

    C#使用IronPython库调用Python脚本

    这篇文章介绍了C#使用IronPython库调用Python脚本的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 使用C#实现一个PPT遥控器

    使用C#实现一个PPT遥控器

    由于本人需要参加的讨论会比较多,每次都会涉及到PPT,有时候坐在电脑旁讲会比较不生动,前人就发明了PPT遥控器,今天就给大家介绍下基于C#实现ppt遥控器,感兴趣的朋友一起看看吧
    2021-05-05
  • NGUI实现滑动翻页效果实例代码

    NGUI实现滑动翻页效果实例代码

    本文通过一段实例代码给大家介绍NGUI实现滑动翻页效果,代码简单易懂,对ngui 滑动翻页相关知识感兴趣的朋友一起学习吧
    2016-04-04
  • Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析

    Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析

    这篇文章主要为大家介绍了Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C#实现简单合并word文档的方法

    C#实现简单合并word文档的方法

    这篇文章主要介绍了C#实现简单合并word文档的方法,涉及C#针对word文档的读取、插入、保存等技巧,非常具有实用价值,需要的朋友可以参考下
    2015-09-09
  • IIS下调用证书出现异常的解决方法 (C#)

    IIS下调用证书出现异常的解决方法 (C#)

    这篇文章主要为大家详细介绍了IIS下调用证书出现异常的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论