DataTable之增删改总结篇

            由于项目中设计DataSet中的DataTable数据增删改等,而这些和DataTable的行状态和版本,AcceptChange()和 RejectChanges().而理解好这些对于DataTable的增删改等操作有很多帮助。

下面是参考MSDN汇总和总结:

(1)对 DataSet、DataTable 或 DataRow 调用 AcceptChanges 时,会移除行状态为 Deleted 的所有行。 剩余行的行状态为 Unchanged,并且 Original 行版本中的值将被 Current 行版本值覆盖。 调用 RejectChanges 时,会移除行状态为 Added 的所有行。 剩余行的行状态为 Unchanged,并且 Current 行版本中的值将被 Original 行版本值覆盖。

(2)RowState 的值取决于两个因素:已对该行执行的操作的类型,以及是否已对 DataRow 调用了 AcceptChanges。
(3)AcceptChange提交自上次调用 AcceptChanges 以来对该行进行的所有更改:在调用 AcceptChanges 时,EndEdit 方法被隐式调用,以便终止任何编辑。如果行的 RowState 原来是“Added”或“Modified”,则 RowState 将变成“Unchanged”。如果 RowState 是“删除”,则该行将被移除。
(4)DataRow 删除:Remove 方法从 DataRowCollection 中删除 DataRow,而 Delete 方法只将行标记为删除。 当应用程序调用 AcceptChanges 方法时,才会发生实际的删除。 通过使用 Delete,您可以在实际删除之前先以编程方式检查哪些行标记为删除。 如果将行标记为删除,其 RowState 属性会设置为 Deleted。
(5)在将 DataSet 或 DataTable 与 DataAdapter 和关系型数据源一起使用时,用 DataRow 的 Delete 方法移除行。 Delete 方法只是在 DataSet 或 DataTable 中将行标记为 Deleted,而不会移除它。 而 DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行。 然后,就可以用 AcceptChanges 方法永久移除该行。 如果使用 Remove 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行。DataRowCollection 的 Remove 方法采用 DataRow 作为参数

下面是自己的理解的

(1)标记行状态Deleted+AccpetChanges方法《==》Remove 都是删除内存中的DataTable中的行。要想真正删除数据中的行,标记为Deleted,DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行.

(2)所有真正操作关系数据的记录是通过DataAdapter 在遇到行状态(Added,Modeified、Deleted)标记,执行其 DeleteCommand 方法以在数据源添加、修改、删除行信息。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace RowStateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            DemonstrateRowState();
        }
        private static void DemonstrateRowState()
        {
            // Run a function to create a DataTable with one column.
            DataTable table = MakeTable();
            DataRow row1;
            DataRow row2;
            DataRow row3;
            // Create a new DataRow.
            row1 = table.NewRow();
            string colName="Name";
            row1[colName] = "ZhangSan";
            row2 = table.NewRow();
            row2[colName] = "LiSi";
            row3 = table.NewRow();
            row3[colName] = "WangWu";
            DataRow[] rows = table.Select();
            DataRow[] createRows = new DataRow[] { row1, row2, row3 };
            //打印所有
            Console.WriteLine("----------Print Had Created All Row-------------");
            Console.WriteLine("TableRowCount:{0}",table.Rows.Count);
            foreach (DataRow dr in createRows)
            {
                object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default] };
                Console.WriteLine(string.Format("Create A Row Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n", array));
            }
            Console.WriteLine("-------------Print All Had Add Row---------------");            
            // AddRow row.
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            foreach (DataRow dr in createRows)
            {
                table.Rows.Add(dr);
                object[] array = new object[] { dr[colName], dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current] };
                Console.WriteLine(string.Format("AddRow Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n ", array));
            }
            Console.WriteLine("----------Print All Had Add Row-----------");
            //Table AcceptChanges Unchanged row
            table.AcceptChanges();
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            foreach (DataRow dr in table.Rows)
            {
                object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] };
                Console.WriteLine(string.Format("Table AcceptChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n OriginalVersion:{4}\n", array));   
            }
            Console.WriteLine("------------------Print All RowState(Some Rows Had Modify)------------");
            // Modified row.
            row2[colName] = "LiBa";
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            foreach (DataRow dr in table.Rows)
            {
                object[] array = new object[] {dr[colName].ToString(), dr.RowState,dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] };
                Console.WriteLine(string.Format("Modified Operation:Name={0}\n RowState-{1}\nDefalutVersion-{2}\n CurrentVersion{3}\n OriginalVersion{4}\n ", array));  
            }
            // Deleted row.
            Console.WriteLine("--------------Print All RowState(Some Rows Had Deleted)--------------");
            row3.Delete();
            DataRow[] deletRows = table.Select(null, null,DataViewRowState.Deleted);
            //var r = row3[colName].ToString();
            //var s= deletRows[0].RowState;
            //var t=table.Rows.Count;
            //var m=deletRows[0][colName, DataRowVersion.Default];
            //var n=deletRows[0][colName, DataRowVersion.Original];
            //object[] arrayDel = new object[] { s,t ,m ,n  };
            //Console.WriteLine("Deleted Operation: RowState-{0},TableRowCount-{1},DefalutVersion-{2},OriginalVersion{3}  ", arrayDel);
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            object[] arrayDel = new object[] {row3.RowState};
            Console.WriteLine("Deleted Operation: RowState-{0}", arrayDel);
   
            Console.WriteLine("----------------Print All After Table AcceptChanges------------");
            //调用 AcceptChanges 时,会移除行状态为 Deleted 的所有行。 剩余行的行状态为 Unchanged,并且 Original 行版本中的值将被 Current 行版本值覆盖。
            table.AcceptChanges();
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            foreach (DataRow dr in table.Rows)
            {
                object[] array = new object[] { dr[colName].ToString(), dr.RowState, dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] };
                Console.WriteLine(string.Format("Table AcceptChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion{3}\n OriginalVersion{4}\n  ", array));
            }
            Console.WriteLine("------------Print All After Table RejectChanges------------------");
             //调用 RejectChanges 时,会移除行状态为 Added 的所有行。 剩余行的行状态为 Unchanged,并且 Current 行版本中的值将被 Original 行版本值覆盖。
            row1[colName] = "ZhangJiu";
            DataRow newRow= table.NewRow();
            newRow[colName] = "XiHaHa";
            table.Rows.Add(newRow);
            table.RejectChanges();
            Console.WriteLine("TableRowCount:{0}", table.Rows.Count);
            foreach (DataRow dr in table.Rows)
            {
                object[] array = new object[] { dr[colName].ToString(), dr.RowState,dr[colName, DataRowVersion.Default], dr[colName, DataRowVersion.Current], dr[colName, DataRowVersion.Original] };
                Console.WriteLine(string.Format("Table RejectChanges Operation:Name={0}\n RowState:{1}\n DefalutVersion:{2}\n CurrentVersion:{3}\n OriginalVersion{4}\n  ", array));
            }
            Console.ReadKey();
        }

        private static DataTable MakeTable()
        {
            // Make a simple table with one column.
            DataTable table = new DataTable("table");
            DataColumn dcName = new DataColumn(
                "Name", Type.GetType("System.String"));
            table.Columns.Add(dcName);          
            return table;
        }
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值