经常遇到这种错误,“此行已属于另一个表”的错误,导致这个错误的语句如下:

DataTable.DataRow的复制-LMLPHPdtPriceTable.Rows.InsertAt(aDataRow,i);

或者

DataTable.DataRow的复制-LMLPHPdtPriceTable.Rows.Add(aDataRow);

我分析了一下原因,因为DataRow DataTable 都是传引用调用的。所以一个行在一个表中了,就不能再增加到另外一个表。

具体的改善策略有两种:

1、   把原始DataRow的每列依次赋值。如下:

DataTable.DataRow的复制-LMLPHPDataRow tempRow = dtItemPrice.NewRow();
DataTable.DataRow的复制-LMLPHP
DataTable.DataRow的复制-LMLPHPtempRow ["First"] = aDataRow ["First "]
DataTable.DataRow的复制-LMLPHPtempRow ["second"] = aDataRow ["second "]
DataTable.DataRow的复制-LMLPHPtempRow ["third"] = aDataRow ["third "]
DataTable.DataRow的复制-LMLPHPtempRow ["forth"] = aDataRow ["forth "]
DataTable.DataRow的复制-LMLPHPtempRow ["Fifth"] = aDataRow ["Fifth "]
DataTable.DataRow的复制-LMLPHP…… 
DataTable.DataRow的复制-LMLPHP
DataTable.DataRow的复制-LMLPHPdtPriceTable.Rows.Add(tempRow)

2、 循环DataTable的每列。如下:

DataTable.DataRow的复制-LMLPHPDataRow aDataRow = dtItemPrice.NewRow();
DataTable.DataRow的复制-LMLPHP
DataTable.DataRow的复制-LMLPHPforeach(DataColumn aDataColumn in dtItemPrice.Columns)
DataTable.DataRow的复制-LMLPHP{
DataTable.DataRow的复制-LMLPHP    aDataRow[aDataColumn.ColumnName] = drItemPrices[i][aDataColumn.ColumnName];
DataTable.DataRow的复制-LMLPHP}
DataTable.DataRow的复制-LMLPHP
DataTable.DataRow的复制-LMLPHPInsertConditionType(aDataRow,dtItemPrice); 

测试就可以了。

3、在表结构相同的情况下,如下面所示:

DataTable.DataRow的复制-LMLPHPDataRow aDataRow = dtItemPrice.NewRow(); 
DataTable.DataRow的复制-LMLPHPaDataRow.ItemArray = drItemPrices[i].ItemArray; 
DataTable.DataRow的复制-LMLPHPdtItemPrice.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);
                            }
                        }

方法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);
                            }
                        }
04-20 13:13