如何填充 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 的条件是 not 与 DataTable
.
中的数据一起存储
即使它们具有相同的列,问题是 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);
}
这有效地克隆了行。
我有一个应用程序正在处理数据,该应用程序需要根据位是否翻转对数据进行排序。 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 的条件是 not 与 DataTable
.
即使它们具有相同的列,问题是 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);
}
这有效地克隆了行。