【问题标题】:How do I populate a DataRow and assign it to one of two tables based on a condition?如何填充 DataRow 并根据条件将其分配给两个表之一?
【发布时间】:2019-01-09 17:38:10
【问题描述】:

我有一个应用程序正在处理数据,该应用程序需要根据是否翻转来对数据进行排序。这些表完全相同。代码看起来像这样:

DataTable dt2 = dt1.Clone();

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

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

现在,我遇到的一个明显问题是,如果该行尚未附加到表格,ImportRow() 会静默失败,我最终会得到一个空表格。当我将其更改为:

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

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

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 的尝试仍然表明该行属于另一个表,但如果我注释掉dt2 if 语句并尝试ImportRow()dt2.Rows.Count保持为 0 且未分配任何记录。

我需要先填充DataRow,然后才能知道它属于哪个表,但我不知道该行在触发此函数之前将包含哪些列。指示它应该转到哪个表的条件DataTable中的数据一起存储。

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

【问题讨论】:

  • 找出哪个表首先然后从该表创建NewRow...或直接添加数据。 dt1.NewRow() 为 dt1 创建一个新行。尝试将其添加到 dt2 将......有问题

标签: c# .net datatable datarow datarowcollection


【解决方案1】:

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

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

这有效地克隆了行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2015-05-22
    • 2021-02-20
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多