将行从一个数据表复制到另一个数据表?


165

如何在C#中将特定行从DataTable复制到另一个Datable?将有不止一排。

Answers:


257
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

上面的示例假设dataTable1dataTable2具有相同的列数,类型和顺序。


22
这不会导致“此行已属于另一个表”。
McArthey 2012年

15
@McArthey不,不会;根据现有行中的值创建一个新行。该行本身未添加到另一个DataTable中。
布拉德利·史密斯

20
@DawoodAbbasi只有ItemArray在表达式末尾省略该部分时,才会发生这种情况。确保添加的是行的值,而不是行本身。
布拉德利·史密斯

4
@DawoodAbbasi有关DataTable.Clone方法,请参阅MSDN文档:msdn.microsoft.com/en-us/library/…–
Bradley Smith,

10
尽管从技术上来说您的答案是正确的,但是您的代码示例并未满足您的假设。@RageeshGr的答案可以处理所有假设,并且恕我直言写得更简洁,更不容易出错。
chris.nesbit1

94

将指定行从表复制到另一个

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

如果导入后不再需要使用dttableOld,是否还需要使用Clone()?
山姆

伟大而实用!谢谢!
Mayer Spitzer

1
@Sam关于您的问题,Clone是复制表结构,如果您的表已经是相同的数据类型,则您不需要它。
Mayer Spitzer

19

试试这个

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia,那么不牺牲性能的替代方案是什么?
山姆

16

检查一下,您可能会喜欢(以前,请复制table1到table2):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);

要么:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

这是一种更好的方法,因为它使用内置功能来对一个DataTable中的行进行范围复制甚至选择,而无需显式地遍历每个DataTable,这与所有foreach循环(基于.ForEach方法)不同。
David Burg '18年

15

在以下版本中受支持:4、3.5 SP1,您现在可以仅在对象上调用方法。

DataTable dataTable2 = dataTable1.Copy()

2
从技术上讲,这将创建数据表的副本。尽管问题中没有明确说明,但dataTable2可能已经存在,并且其中有其他行我们不想丢失。同样,问题专门指出“特定行”,而这仅处理所有行。
马特

5

由于其他职位,这是我能得到的最短时间:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

这基本上是一个foreach。此外,您并没有按照OP的要求过滤条件。
埃里克·吴

现在,如果我清除了,sourceTable是否destTable也清除了?
2013年

我希望能够分配一个值并清除原始变量,而不清除目的地。
2013年

2

下面的示例是复制一行的最快方法。将根据列名称复制每个单元格。如果您不需要特定的单元格进行复制,则可以尝试捕获或添加if。如果您要复制多于1行,则循环下面的代码。

DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

dataset1.Tables [1] .Rows [ 0 ] [i]; 将索引0更改为指定的行索引,或者如果要循环或逻辑上合理的话,可以使用变量


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

您的代码对我来说很完美,这是一个非常简单的代码,谢谢
Esraa_92

1

对于那些想要单命令SQL查询的人:

INSERT INTO TABLE002 
(COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
FROM TABLE001;

该查询将复制从TABLE001到的数据,TABLE002并且我们假定两列的列名都不同。

列名是一对一映射的,例如:

COL001_MEM_ID-> COL001_MEM_ID

COL001_MEM_NAME-> COL002_MEM_NAME

COL001_MEM_ADD-> COL002_MEM_ADD

COL001_CREATE_USER_C-> COL002_CREATE_USER_C

COL002_CREATE_S-> COL002_CREATE_S

如果需要某些条件,还可以指定where子句。


0

要复制整个数据表,只需执行以下操作:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;

2
问题是如何从数据表而不是整个表中复制特定行。
jtate
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.