經常遇到這種錯誤,“此行已屬於另一個表”的錯誤,導致這個錯誤的語句如下:
dtPriceTable.Rows.InsertAt(aDataRow,i);
或者
dtPriceTable.Rows.Add(aDataRow);
我分析了一下原因,因為DataRow DataTable 都是傳引用調用的。所以一個行在一個表中了,就不能再增加到另外一個表。
具體的改善策略有兩種:
1、 把原始DataRow的每列依次賦值。如下:
DataRow tempRow = dtItemPrice.NewRow();
tempRow ["First"] = aDataRow ["First "]
tempRow ["second"] = aDataRow ["second "]
tempRow ["third"] = aDataRow ["third "]
tempRow ["forth"] = aDataRow ["forth "]
tempRow ["Fifth"] = aDataRow ["Fifth "]
……
dtPriceTable.Rows.Add(tempRow)
2、 循環DataTable的每列。如下:
DataRow aDataRow = dtItemPrice.NewRow();
foreach(DataColumn aDataColumn in dtItemPrice.Columns)
{
aDataRow[aDataColumn.ColumnName] = drItemPrices[i][aDataColumn.ColumnName];
}
InsertConditionType(aDataRow,dtItemPrice);
測試就可以了。
3、在表結構相同的情況下,如下面所示:
DataRow aDataRow = dtItemPrice.NewRow();
aDataRow.ItemArray = drItemPrices[i].ItemArray;
dtItemPrice.Rows.Add(aDataRow);
4、使用importRow的方法
常用方法 :
有兩個表A和B,兩表結構相同。現在需要將A表中部分行拷貝到B表中。
如果我們直接用 DataTableB.rows.add(dataTableA.rows[0]) 這樣的方法式會報"row已經屬於A表"這樣的錯誤。
所以我們可以用另外的方法。
方法1,使用dataTable.ImportRow()方法。代碼如下:
//得到A表中的部分行
DataRow[] drA = dtA.Select("aimtype=3");
//實例B
DataTable dtB = dtA.Clone();
if (drA.Length > 0)
{
foreach (DataRow drVal in drA)
{
//向B中增加行
dtB.ImportRow(drVal);
}
}
DataRow[] drA = dtA.Select("aimtype=3");
//實例B
DataTable dtB = dtA.Clone();
if (drA.Length > 0)
{
foreach (DataRow drVal in drA)
{
//向B中增加行
dtB.ImportRow(drVal);
}
}
方法2,使用DataTable.Rows.Add(params object[] values)方法,代碼如下:
//得到A表中的部分行
DataRow[] drA = dtA.Select("aimtype=3");
//實例B
DataTable dtB = dtA.Clone();
if (drA.Length > 0)
{
foreach (DataRow drVal in drA)
{
//向B中增加行
dtB.Rows.Add(drVal.ItemArray);
}
}
DataRow[] drA = dtA.Select("aimtype=3");
//實例B
DataTable dtB = dtA.Clone();
if (drA.Length > 0)
{
foreach (DataRow drVal in drA)
{
//向B中增加行
dtB.Rows.Add(drVal.ItemArray);
}
}

