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

时间:2020-03-06 15:04:00  来源:igfitidea点击:

我还记得直接在DataTable类上调用的某些方法/属性与在DataTable.Rows属性上使用相同名称的方法/属性之间存在区别。 (可能是我读过的RowCount / Count属性。)不同之处是其中之一忽略了DataRow.RowState,而另一个尊重/使用了它。

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

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

(哦,这是针对.NET 1.1 btw的情况,以防语义从一个版本更改为另一个版本。)

解决方案

AFAIK是datatable.clear和datatable.rows.clear之间的主要区别在于,datatable.clear可以清除行和列。因此,如果要保留表结构(即列),请使用" datatable.rows.clear"。而且,如果我们想从头开始,请使用" datatable.clear"甚至" datatable.reset"重新回到开头。

实际上," datatable.reset"是" datatable.clear"的下一个层次。如果应用了任何可能违反的约束,则使用datatable.clear将失败,但是使用datatable.reset将摆脱自创建数据表以来已放置的所有内容。

我不相信DataTable.Clear会清除列。此代码将" 1"写入标准输出:

var d = new DataTable();
d.Columns.Add("Hello", typeof(string));
d.Clear();
Console.WriteLine(d.Columns.Count);

两者都做同样的事情。一个只是从Collections类继承的方法。并且Table.Clear()只是调用该方法。

我现在已经在.NET 1.1 / VS2003中测试了不同的方法,看来Matt Hamilton是正确的。

  • 就我测试的两件事而言,DataTable.Clear和DataTable.Rows.Clear似乎表现相同:都删除所有行(它们没有将它们标记为已删除,它们实际上是从表中删除了它们),也没有删除列的桌子。
  • DataTable.Reset清除行和列。
  • DataTable.Rows.Count确实包含已删除的行。 (这可能是1.1特有的)
  • foreach遍历已删除的行。 (我很确定在2.0中会跳过已删除的行。)

它们之间没有区别。 DataRowCollection.Clear()调用Table.Clear()

Table.Clear()检查表是否可以清除(约束可以防止此情况发生),删除行并重建任何索引。

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

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

区别在于" RecordManager.Clear"(来自v3.5 SP 0的.Net参考源)。仅当从DataTable.Clear调用时,clearAll才为true。

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);
                }
            } 
        }
    }