如何填充 DataRow 并根据条件将其分配给两个表之一?

How do I populate a DataRow and assign it to one of two tables based on a condition?

我有一个应用程序正在处理数据,该应用程序需要根据位是否翻转对数据进行排序。 table 和 是相同的。目前的代码看起来像这样:

DataTable dt2 = dt1.Clone();

DataRow r = dt1.NewRow();
FillUp(ref r);

if(bitISetEarlier)
   dt2.ImportRow(r);
else
   dt1.ImportRow(r);

现在,我遇到的一个明显问题是,如果该行尚未附加到 table,ImportRow() 会无声地失败,我最终会得到一个空的 table .当我将其更改为:

    if(bitISetEarlier)
       dt2.Rows.Add(r);
    else
       dt1.Rows.Add(r);

我开始收到一个异常,说一个函数正在尝试添加一个存在于另一个 table 的行。所以当我尝试这个时:

if(bitISetEarlier)
    if(r.RowState == DataRowState.Detached) 
         dt2.Rows.Add(r) 
    else dt2.ImportRow(r);
 else
     if(r.RowState == DataRowState.Detached) 
          dt1.Rows.Add(r) 
     else dt1.ImportRow(r);

异常停止,但任何分配给 dt2 的尝试仍然表明该行属于另一个 table,但如果我注释掉 dt2 if语句并尝试 ImportRow()dt2.Rows.Count 保持为 0,没有分配任何记录。

我需要先填充 DataRow,然后才能知道它属于哪个 table,但我不知道该行在调用此函数之前会有哪些列。指示它应该去哪个 table 的条件是 notDataTable.

中的数据一起存储

即使它们具有相同的列,问题是 NewRow() 向行添加了一个属性使其与姐妹 table 不兼容吗?有没有一种方法可以获得与 NewRow() 相同的功能(在不知道任何列提前的情况下复制模式)但我可以动态分配?我知道我可能可以通过将它包装在 for 循环中并在每次我需要使用 DataTable.Columns [=48= 的新行时构建列来手动构建与两者兼容的行],但我想尽可能避免这样做。

我找到了我的解决方案。由于我无法将一个 table 构建的行直接添加到另一个 table,我认为是 DataRow 对象有问题,但 ItemArray 属性 可能是我所需要的。

                    if (isErrorRow)
                    {                           
                        //nr is the NewRow for dt1
                        var nr2 = dt2.NewRow();
                        nr2.ItemArray = nr.ItemArray;
                        dt2.Rows.Add(nr2);
                    }

这有效地克隆了行。