[英]Unable to Copy datacolumn from one data table to another
如何將1個數據列從1個數據表復制到新數據表。 當我嘗試執行此操作時,出現錯誤列'XXX'已經屬於另一個DataTable。
dataColumn = datatable1.Columns[1];
datatable2 = new DataTable();
datatable2.Columns.Add(dataColumn);
提前致謝
您不能復制DataColumns。 您需要做的是在新數據表中創建一個新數據列,其數據類型與舊數據表的列中的數據類型相同,然后您需要運行一個FOR循環,以將所有數據從舊數據表引入到新數據表中數據表。
請參閱以下代碼。 假定數據表具有完全相同的行數。
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
dt2.Columns.Add("ColumnA", dt1.Columns["ColumnA"].DataType);
for (int i = 0; i < dt1.Rows.Count; i++)
{
dt2.Rows[i]["ColumnA"] = dt1.Rows[i]["ColumnA"];
}
另外,如果要復制的數據是引用類型,而不是值類型,則可能需要查看.Clone()方法是否適用於該類型,或者自己創建一個。 僅在FOR循環中執行“ this = that”將不適用於引用類型。
您不能復制DataColumn。 (DataColumn與表緊密耦合)
相反,您可以添加具有相同名稱和數據類型的新列。
您可能正在尋找DataTable.Clone()
,它將創建整個表的結構副本。 (具有相同的架構,但沒有數據)
只是想一想,您的DataTables是否都在同一個DataSet中?
如果是這樣,您可以在兩個表的列之間創建一個命名的DataRelation (請考慮外鍵)。
然后,可以將Calculated DataColumn添加到表中,該表達式的Expression屬性設置為“ Child(RelationName).ColumnName”或“ Parent(RelationName).ColumnName”,具體取決於關系的方向。
這將為您提供與復制列相同的效果,但我相信它只會對它進行惰性計算。 因此,也許它將為您提供所需的東西。
有一個例子在這里是如何工作的。 該示例使用Sum聚合函數,但是您只需要引用列名,它將在您的DataTable中復制它
myDataSet.Relations.Add(
"Orders2OrderLines",
myDataSet.Tables["Orders"].Columns["OrderID"],
myDataSet.Tables["OrderLines"].Columns["OrderID"]);
ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)");
高溫超導
該問題是由於c#無法重用創建的對象實例並在多個DataTables上使用它而引起的。 為此,有必要為每個循環迭代創建一個新的對象DataCollumn。
foreach (DataTable table in DATASET.Tables)
{
DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type));
// your logic here
}
希望對您有幫助...
我使用以下內容主要使用LINQ合並了兩個表,並且只循環了最后的行。 我不會稱它為漂亮,但確實可以。 使用聯接來防止上面列出的某些假設。
DataTable tableOne = getTableOne();
DataTable tableTwo = getTableTwo();
var oneColumns = tableOne.Columns.Cast<DataColumn>()
.Select(p => new Column(p.ColumnName, DataType))
.ToArray();
var twoColumns = tableTwo.Columns.Cast<DataColumn>()
.Select(p => new DataColumn(p.ColumnName, p.DataType))
.ToArray();
var matches = (from a in tableOne.AsEnumerable()
join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"]
select a.ItemArray.Concat(b.ItemArray)).ToArray();
DataTable merged = new DataTable();
merged.Columns.AddRange(oneColumns);
merged.Columns.AddRange(twoColumns);
foreach (var m in matches) { merged.Rows.Add(m.ToArray()); }
無需循環,請參閱,希望這可以解決您的問題...
DataTable dt = new DataTable();
//fill the dt here
DataTable dt2 = new DataTable();
string[] strCols = {"Column Name to copy"};
dt2 = dt.DefaultView.ToTable("newTableName", false, strCols);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.