或者
/// 執行DataTable中的查詢返回新的DataTable/// </summary>/// <param name="dt">源數據DataTable</param>/// <param name="condition">查詢條件</param>/// <returns></returns>PRivate DataTable GetNewDataTable(DataTable dt, string condition,string sortstr){DataTable newdt = new DataTable();newdt = dt.Clone();DataRow[] dr = dt.Select(condition,sortstr);for (int i = 0; i < dr.Length; i++){newdt.ImportRow((DataRow)dr[i]);}return newdt;//返回的查詢結果
}
或者 逐列的形式
public static int TableDataExchange(DataSet ds, string tableName, DataTable sourceDT) { for(int i=0;i<sourceDT.Rows.Count;i++) { DataRow drNew = ds.Tables[tableName].NewRow(); foreach (DataColumn dc in sourceDT.Columns) { drNew[dc.ColumnName] = sourceDT.Rows[i][dc.ColumnName]; } ds.Tables[tableName].Rows.Add(drNew); } ds.Tables[tableName].AcceptChanges(); DataTable dt = ds.Tables[tableName]; return ds.Tables[tableName].Rows.Count; }
或者
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
項目開發中經常遇到這種錯誤-“此行已屬于另一個表” 。導致這個錯誤的語句如下:
objectTable .Rows.Add(SourceDataRow);
分析了一下原因,因為DataRow DataTable 都是傳引用調用的。所以一個行在一個表中了,就不能再增加到另外一個表。
具體方法:
1 ImportRow方法:public void ImportRow( DataRow DataRow);
objectTable = sourceTable.clone();//必須先復制表的架構,使具有相同的的列或關系!foreach (DataRow oRow in sourceTable){
objectTable.ImportRow(oRow);//在objectTable中添加一個新行,并將sourceRow的值復制進去,要求表的結構一樣!
}
_____________________________________________________________________________________________________
2. 循環DataTable的每個列
DataRow aDataRow = objectTable.NewRow();
foreach(DataColumn aDataColumn in sourceTable.Columns)
{
aDataRow [aDataColumn.ColumnName] = sourceTable[i][aDataColumn.ColumnName];
}
objectTable.Rows.Add(aDataRow);
3. 自定義復制
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中的數據將不能顯示!
}_____________________________________________________________________________________________________
4. 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文擋。
或者:
< type="text/javaScrJavascript>
我們經常需要向DataTable中添加一行數據,大多數的情況下都是把一些從UI的控件和程序的變量中收集的數據添加到DataTable中。如以下的語句把供應商代碼和名稱添加到DataTable中:
DataTable dtProvider = new DataTable(); DataRow drRow = dtProvider.NewRow(); drRow[0] = txtProviderCode.Text.Trim(); drRow[1] = txtProviderName.Text.Trim(); dtProvider.Rows.Add(drRow);
大多數的情況下這幾行語句是完全可以滿足要求的。但是如果想把另一個同樣結構的DataTable的某一行添加到這個dtProvider中,就不能簡單的添加了。否則會提示一個錯誤“This row belongs to another table.”。這個時候我們必須定義另一個DataRow,把源DataRow的數據賦到目的DataRow中,再Add進DataTable中就可以了。如下所示:
DataTable dtProvider = new DataTable(); DataRow drTarget = dtProvider.NewRow(); drTarget.ItemArry = drSource.ItemArry; // 注意:這里的drSource是另一個相同結構的DataTable中的一行。 dtProvider.Rows.Add(drTarget); < type="text/JavaScript"> alimama_pid="mm_10249644_1605763_5027492"; alimama_type="f"; alimama_sizecode ="tl_1x5_8"; alimama_fontsize=12; alimama_bordercolor="FFFFFF"; alimama_bgcolor="FFFFFF"; alimama_titlecolor="0000FF"; alimama_underline=0; alimama_height=22; alimama_width=0; < src="http://a.alimama.cn/inf.js" type=text/javascript>
新聞熱點
疑難解答