DataTable.Clear和DataTable.Rows.Clear之间有区别吗?

Tob*_*obi 6 .net

我记得有一些方法/属性直接呼吁之间的差异的DataTable类,并在该相同名称的方法/属性DataTable.Rows财产.(可能是我读过这个的RowCount/Count属性.)不同之处在于它们中的一个忽略了DataRow.RowState,而另一个则尊重/使用它.

在这个特殊情况下,我想知道DataTable.ClearDataTable.Rows.Clear之间的区别.我可以想象其中一个实际上删除了所有行,另一个只是将它们标记为已删除.

所以我的问题是,两种Clear方法之间是否有区别,如果有,那有什么区别?

(哦,这是针对.NET 1.1顺便说一句,以防语义从一个版本变为另一个版本.)

SLa*_*aks 7

在.Net 1.1中,DataRowCollection.Clear调用DataTable.Clear

但是,在.Net 2.0中,存在差异.如果我正确理解了源,DataTable.Clear将清除未连接的行(使用创建DataTable.NewRow),而DataRowCollection.Clear则不会.

不同之处在于RecordManager.Clear(源于下面,来自v3.5 SP 0 的.Net参考源); clearAll只有在被召唤时才是真的DataTable.Clear.

    internal void Clear(bool clearAll) { 
        if (clearAll) {
            for(int record = 0; record < recordCapacity; ++record) { 
                rows[record] = null;
            }
            int count = table.columnCollection.Count;
            for(int i = 0; i < count; ++i) { 
                //

                DataColumn column = table.columnCollection[i]; 
                for(int record = 0; record < recordCapacity; ++record) {
                    column.FreeRecord(record); 
                }
            }
            lastFreeRecord = 0;
            freeRecordList.Clear(); 
        }
        else { // just clear attached rows 
            freeRecordList.Capacity = freeRecordList.Count + table.Rows.Count; 
            for(int record = 0; record < recordCapacity; ++record) {
                if (rows[record]!= null && rows[record].rowID != -1) { 
                    int tempRecord = record;
                    FreeRecord(ref tempRecord);
                }
            } 
        }
    } 
Run Code Online (Sandbox Code Playgroud)


Tob*_*obi 5

我现在一直在 .NET 1.1/VS2003 中测试不同的方法,似乎 Matt Hamilton 是对的。

  • DataTable.Clear 和 DataTable.Rows.Clear 似乎在我测试的两件事方面表现相同:都删除所有行(他们没有将它们标记为已删除,他们确实将它们从表中删除),并且都不删除列表的。
  • DataTable.Reset 清除行和列。
  • DataTable.Rows.Count 确实包括已删除的行。(这可能是 1.1 特定的)
  • foreach 遍历已删除的行。(我很确定删除的行在 2.0 中被跳过。)