簡體   English   中英

無法將數據列從一個數據表復制到另一數據表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM