当前位置: 首页 > 编程笔记 >

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

李飞翼
2023-03-14
本文向大家介绍C#获取变更过的DataTable记录的实现方法,包括了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#获取根目录实现方法汇总,包括了C#获取根目录实现方法汇总的使用技巧和注意事项,需要的朋友参考一下 1.控制台应用程序 运行结果: 2.winform应用程序 运行结果: 3.MVC和WebForm项目 通过Server.MapPath("/")获取根目录 4.WebApi项目 WebApi Core的根目录获取:HttpRuntime.AppDomainAppPath 补充:We

  • 本文向大家介绍javascript实现获取cookie过期时间的变通方法,包括了javascript实现获取cookie过期时间的变通方法的使用技巧和注意事项,需要的朋友参考一下 javascript和动态页无法获取cookie过期的时间,过期时间由浏览器管理,javascript和动态页只能设置过期时间,无法通过document.cookie(javascript)或者Cookie.Expire

  • 本文向大家介绍C#使用DataSet Datatable更新数据库的三种实现方法,包括了C#使用DataSet Datatable更新数据库的三种实现方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法、DataAdapter 更新数据源以及使用sql语句更新。分享给大家供大家参考之

  • 本文向大家介绍C#实现获取MAC地址的方法,包括了C#实现获取MAC地址的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现获取MAC地址的方法,是一个非常常见而且实用的功能,具体方法如下: 主要功能代码如下: 有些项目中出于安全考虑需要获取MAC地址,然后再判断MAC地址是否合法才可以登陆。本文总结的方法希望对大家有所帮助!

  • 问题内容: 我知道我可以像这样更新一条记录-但是如何获取已更新记录的ID?(我正在使用MSSQL,所以不能使用Oracle的RowId) 如果我要执行插入操作,则可以使用getGeneratedKeys来获取id字段值,但是我不认为有等效的更新吗? 我知道我可以使用可滚动的结果集来做我想做的事 即 但是我担心性能,因为测试显示负载下的锁定超时,我想知道是否有更好/更简单的方法? -编辑:为了最终解

  • 本文向大家介绍python3获取当前目录的实现方法,包括了python3获取当前目录的实现方法的使用技巧和注意事项,需要的朋友参考一下 1. 以前的方法 如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数。 如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。实际上sys.path是Py