1. 程式人生 > >DataSet、DataTable、DataRow的資料複製方法

DataSet、DataTable、DataRow的資料複製方法

DataSet 物件是支援 ADO.NET的斷開式、分散式資料方案的核心物件 ,用途非常廣泛.我們很多時候需要使用其中的資料,比如取得一個DataTable的資料或者複製另一個DataTabe中的資料或者是DataRow的資料,但是隻有DataSet和DataTable的複製是支援深層複製的,就是說不僅能複製元素的結構,而且能複製元素的資料,而DatatDataRow沒有相關的複製的方法,下面將簡單介紹下這些資料元素的複製問題。

DataTable sourceTable;
DataTable objectTable;
DatatDataRow sourceRow;
DatatDataRow objectRow;
DataRow tempRow;
DataSet souceDataSet = new DataSet();

複製DataSet

  DataSet object = souceDataSet.Copy();//深複製
  DataSet object = souceDataSet.Clone();//淺複製,只複製架構

複製DataTable

  objectTable  = sourceTable .Copy();//深複製
  objectTable  = sourceTable .Clone();//淺複製,只複製架構

那我們應該如何複製DataRow的資料了,下面將著重介紹幾種方法
_____________________________________________________________________________________________________

1  ImportDataRow方法:public void ImportDataRow( DataRow DataRow);

objectTable = sourceTable.clone();//必須先複製表的架構,使具有相同的的列或關係!
foreach (DataRow oRow in sourceTable)

objectTable.ImportDataRow(oRow);//在objectTable中新增一個新行,並將sourceRow的值複製進去,要求表的結構一樣!

}

_____________________________________________________________________________________________________

2  自定義複製

objectTable.Columns.Add ("id");//不需要有一樣的架構,只複製自己需要的列! 
Object [] myArry = new Object [1]; 
   foreach (DataRow oRow in sourceTable)

  tempRow = objectTable.NewRow();//此方法必須呼叫!
  myArry[0] = oRow["id"];//如果myArry中沒有源表中的id列的話就會報錯!
  tempRow.ItemArray = myArry;//ItemArray屬性為Object型別陣列,根據程式的需要需要可自行復制多個列的資料!
  objectTable.Rows.Add(tempRow); //此方法必須呼叫,否則DataRow中的資料將不能顯示!

}
_____________________________________________________________________________________________________

3  LoadDataRow方法:public DataRow LoadDataRow(Object[] values,bool fAcceptChanges);

Object[] newRow = new Object[3];
   // 設定物件陣列的值
    newRow[0] = "Hello";
    newRow[1] = "World";
    newRow[2] = "two";
    DataRow myRow;
    ObjectTable.BeginLoadData();
    // 將新行新增到表中
    myRow = ObjectTable.LoadDataRow(newRow, true);//標誌要設定為true,表示新增新行
    ObjectTable.EndLoadData();
該方法比較複雜,如果只是簡單的複製現有行的資料來新增新行的話建議不要採用,具體用法請參看sdk文擋。

----

DataRow的複製

            如果直接通過RequirDT.Rows.Add(row),則執行時會出現"該行已經屬於一個表"的提示錯誤!

            至於其中的原因,通過DataSet和DataTable類比,從通常意義來說應該不會出現錯誤提示,但是細細

            想來,我覺得應該是由於DataTable的架構設計所致,借鑑關係資料庫中的關係表,datacolumn定義了

            DataTable的整體架構,而具體的datarow是符合該架構的一條記錄罷了!所以具有該架構的行只能新增

           到具有相同架構的表中!同時RequireDT.Rows.Add()實現捕獲 System.ArgumentException(The row

            ther belongs to another table or ready belongs to this table.)我想其實現也限制了不能通過該方法實現!

           鑑於以上

            1.ataTable RequireDT = SourceDT.Clone();

             RequireDT.ImportRow(row);

            2.見網上有這樣實現的 RequireDT.Rows.Add(row.ItemArray)

            但是我編寫程式碼並不能實現,該函式的功能是   Creates a row using specified values and adds it to the

            System.Data.DataRowCollection.所以也需要先拷貝源資料表的結構,方可成功!

           3. 以下方法也可以實現,但是也得先複製表的結構

            ObjectTable.BeginLoadData(); 
  
            myRow = ObjectTable.LoadDataRow(newRow, true);


            ObjectTable.EndLoadData();

___________________________________________________________________________________________________
總結:
當我們要把一個DataTable的行復制到另一個DataTable中去的時候不能直接用ObjectTable.Add(souceDataRow);,或者是用ObjectRow = sourceRow 的賦值,然後Add,這樣錯編譯器會提示你 "此行已屬於別的表",對於DataTable來說也是這樣,因為這樣物件都是引用型別的。.Net不允許別的表來引用一個已經屬於當前表的行或者別的DataSet來引用當前DataSet中的DataTable,必須用以上的方法先進行復制;對於採取和何種方法複製將完全取決於您程式的需要。