คัดลอกแถวจาก DataTable หนึ่งไปยังอีก DataTable หรือไม่


165

ฉันจะคัดลอกแถวเฉพาะจาก DataTable ไปยังอีก Datable ใน c # ได้อย่างไร จะมีมากกว่าหนึ่งแถว

คำตอบ:


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

ตัวอย่างข้างต้นถือว่าdataTable1และdataTable2มีจำนวนประเภทและคำสั่งของคอลัมน์เท่ากัน


22
ผลลัพธ์นี้จะไม่ทำให้ "แถวนี้อยู่ในตารางอื่นแล้ว"
McArthey

15
@McArthey ไม่ไม่ได้ แถวใหม่กำลังถูกสร้างขึ้นจากค่าในแถวที่มีอยู่ แถวนั้นไม่ได้ถูกเพิ่มไปยัง DataTable อื่น
แบรดลีย์สมิ ธ

20
@DawoodAbbasi นั่นจะเกิดขึ้นได้ก็ต่อเมื่อคุณออกจากItemArrayส่วนท้ายของนิพจน์ ตรวจสอบให้แน่ใจว่าคุณกำลังเพิ่มค่าของแถวไม่ใช่เพิ่มแถวเอง
แบรดลีย์สมิ ธ

4
@DawoodAbbasi อ้างถึงเอกสาร MSDN สำหรับDataTable.Cloneวิธีการ: msdn.microsoft.com/en-us/library/ …
Bradley Smith

10
แม้ว่าคำตอบของคุณในทางเทคนิคจะถูกต้อง แต่ตัวอย่างรหัสของคุณไม่ตรงกับข้อสันนิษฐานของคุณ คำตอบโดย @RageeshGr จัดการกับสมมติฐานทั้งหมดและ IMHO เขียนอย่างรัดกุมยิ่งขึ้นและมีข้อผิดพลาดน้อยลง
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 () หรือไม่
Sam

ยอดเยี่ยมและการปฏิบัติ! ขอบคุณ!
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 หนึ่งไปยังอีกแถวหนึ่งโดยไม่ต้องวนซ้ำอย่างชัดเจนผ่านแต่ละแถวซึ่งต่างจาก foreach loop, .ForEach method
David Burg

15

สนับสนุนใน: 4, 3.5 SP1 ตอนนี้คุณสามารถเรียกใช้เมธอดบนวัตถุได้แล้ว

DataTable dataTable2 = dataTable1.Copy()

2
เทคนิคนี้สร้างสำเนาของ DataTable แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนในคำถาม แต่เป็นไปได้ว่า dataTable2 มีอยู่แล้วและมีแถวอื่น ๆ ที่เราไม่ต้องการเสีย นอกจากนี้คำถามยังระบุ "แถวที่เฉพาะเจาะจง" โดยเฉพาะในขณะที่สิ่งนี้จัดการเฉพาะแถวทั้งหมด
Matt

5

จากการโพสต์อื่น ๆ นี่คือสั้นที่สุดที่ฉันจะได้รับ:

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

ซึ่งเป็นพื้นหน้า นอกจากนี้คุณไม่ได้กรองตามเงื่อนไขตามที่ OP ร้องขอ
Eric Wu

ตอนนี้ถ้าฉันจะล้างความsourceTableประสงค์destTableยังชัดเจน?
Si8

ฉันต้องการที่จะสามารถกำหนดค่าและล้างตัวแปรเดิมโดยไม่ต้องล้างปลายทาง
Si8

2

ตัวอย่างด้านล่างเป็นวิธีที่เร็วที่สุดในการคัดลอกหนึ่งแถว แต่ละเซลล์จะถูกคัดลอกตามชื่อคอลัมน์ ในกรณีที่คุณไม่ต้องการเซลล์ที่เฉพาะเจาะจงในการคัดลอกจากนั้นลองจับหรือเพิ่มถ้า หากคุณต้องการคัดลอกมากกว่า 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);

ชุดข้อมูล 1 ตาราง [1]. แถว [ 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

นอกจากนี้คุณยังสามารถระบุตำแหน่งของประโยคถ้าคุณต้องการเงื่อนไขบางอย่าง


0

หากต้องการคัดลอกข้อมูลทั้งหมดเพียงทำสิ่งนี้:

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

2
คำถามคือวิธีการคัดลอกแถวเฉพาะจากตารางข้อมูลไม่ใช่ทุกสิ่ง
jtate

0

ฉันได้สร้างวิธีง่ายๆในการแก้ไขปัญหานี้

 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.