C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法
DataSet 對(duì)象是支持 ADO.NET的斷開式、分布式數(shù)據(jù)方案的核心對(duì)象 ,用途非常廣泛.我們很多時(shí)候需要使用其中的數(shù)據(jù),比如取得一個(gè)DataTable的數(shù)據(jù)或者復(fù)制另一個(gè)DataTabe中的數(shù)據(jù)或者是DataRow的數(shù)據(jù),但是只有DataSet和DataTable的復(fù)制是支持深層復(fù)制的,就是說不僅能復(fù)制元素的結(jié)構(gòu),而且能復(fù)制元素的數(shù)據(jù),而DatatDataRow沒有相關(guān)的復(fù)制的方法,下面將簡單介紹下這些數(shù)據(jù)元素的復(fù)制問題。
DataTable sourceTable; DataTable objectTable; DatatDataRow sourceRow; DatatDataRow objectRow; DataRow tempRow; DataSet souceDataSet = new DataSet();
復(fù)制DataSet
DataSet object = souceDataSet.Copy();//深復(fù)制 DataSet object = souceDataSet.Clone();//淺復(fù)制,只復(fù)制架構(gòu)
復(fù)制DataTable
objectTable = sourceTable .Copy();//深復(fù)制 objectTable = sourceTable .Clone();//淺復(fù)制,只復(fù)制架構(gòu)
復(fù)制DataRow
那我們應(yīng)該如何復(fù)制DataRow的數(shù)據(jù)了,下面將著重介紹幾種方法
1、ImportDataRow方法:
public void ImportDataRow( DataRow DataRow); objectTable = sourceTable.clone();//必須先復(fù)制表的架構(gòu),使具有相同的的列或關(guān)系! foreach (DataRow oRow in sourceTable) { objectTable.ImportDataRow(oRow);//在objectTable中添加一個(gè)新行,并將sourceRow的值復(fù)制進(jìn)去,要求表的結(jié)構(gòu)一樣! }
2、自定義復(fù)制
objectTable.Columns.Add ("id");//不需要有一樣的架構(gòu),只復(fù)制自己需要的列! Object [] myArry = new Object [1]; foreach (DataRow oRow in sourceTable) { tempRow = objectTable.NewRow();//此方法必須調(diào)用! myArry[0] = oRow["id"];//如果myArry中沒有源表中的id列的話就會(huì)報(bào)錯(cuò)! tempRow.ItemArray = myArry;//ItemArray屬性為Object類型數(shù)組,根據(jù)程序的需要需要可自行復(fù)制多個(gè)列的數(shù)據(jù)! objectTable.Rows.Add(tempRow); //此方法必須調(diào)用,否則DataRow中的數(shù)據(jù)將不能顯示! }
3、LoadDataRow方法:
public DataRow LoadDataRow(Object[] values,bool fAcceptChanges); Object[] newRow = new Object[3]; // 設(shè)置對(duì)象數(shù)組的值 newRow[0] = "Hello"; newRow[1] = "World"; newRow[2] = "two"; DataRow myRow; ObjectTable.BeginLoadData(); // 將新行添加到表中 myRow = ObjectTable.LoadDataRow(newRow, true);//標(biāo)志要設(shè)置為true,表示添加新行 ObjectTable.EndLoadData();
該方法比較復(fù)雜,如果只是簡單的復(fù)制現(xiàn)有行的數(shù)據(jù)來添加新行的話建議不要采用,具體用法請(qǐng)參看sdk文擋。
DataRow的復(fù)制
如果直接通過RequirDT.Rows.Add(row),則運(yùn)行時(shí)會(huì)出現(xiàn)"該行已經(jīng)屬于一個(gè)表"的提示錯(cuò)誤!至于其中的原因,通過DataSet和DataTable類比,從通常意義來說應(yīng)該不會(huì)出現(xiàn)錯(cuò)誤提示,但是細(xì)細(xì)想來,我覺得應(yīng)該是由于DataTable的架構(gòu)設(shè)計(jì)所致,借鑒關(guān)系數(shù)據(jù)庫中的關(guān)系表,datacolumn定義了DataTable的整體架構(gòu),而具體的datarow是符合該架構(gòu)的一條記錄罷了!所以具有該架構(gòu)的行只能添加到具有相同架構(gòu)的表中!同時(shí)RequireDT.Rows.Add()實(shí)現(xiàn)捕獲 System.ArgumentException(The row ther belongs to another table or ready belongs to this table.)我想其實(shí)現(xiàn)也限制了不能通過該方法實(shí)現(xiàn)!
鑒于以上
1.ImportRow方法
DataTable RequireDT = SourceDT.Clone(); RequireDT.ImportRow(row);
2.見網(wǎng)上有這樣實(shí)現(xiàn)的
RequireDT.Rows.Add(row.ItemArray)
但是我編寫代碼并不能實(shí)現(xiàn),該函數(shù)的功能是Creates a row using specified values and adds it to the System.Data.DataRowCollection。所以也需要先拷貝源數(shù)據(jù)表的結(jié)構(gòu),方可成功!
3. 以下方法也可以實(shí)現(xiàn),但是也得先復(fù)制表的結(jié)構(gòu)
ObjectTable.BeginLoadData(); myRow = ObjectTable.LoadDataRow(newRow, true); ObjectTable.EndLoadData();
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類
這篇文章主要介紹了理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類,注意類成員的相關(guān)訪問限制和類的繼承問題,需要的朋友可以參考下2016-01-01C#實(shí)現(xiàn)Dictionary字典賦值的方法
本文主要介紹了C#實(shí)現(xiàn)Dictionary字典賦值的方法,如同java中的Hasttable,C#里面有Dictionary,可以實(shí)現(xiàn)很高效的鍵值對(duì)操作。感興趣的可以了解一下2021-05-05C#序列化與反序列化(Serialize,Deserialize)實(shí)例詳解
這篇文章主要介紹了C#序列化與反序列化(Serialize,Deserialize)的方法,實(shí)例分析了C#序列化與反序列化的常見技巧,需要的朋友可以參考下2015-06-06c# 如何對(duì)網(wǎng)絡(luò)信息進(jìn)行相關(guān)設(shè)置(ip,dns,網(wǎng)關(guān)等)
這篇文章主要介紹了c# 網(wǎng)絡(luò)適配器的相關(guān)操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03用C#實(shí)現(xiàn)啟動(dòng)另一程序的方法實(shí)例
一段實(shí)例代碼,程序的目的是使用C#實(shí)現(xiàn)啟動(dòng)另一程序的方法。技術(shù)總監(jiān)給出了我們這樣一個(gè)有效的啟動(dòng)程序的有效方法,現(xiàn)在和大家分享下2013-07-07