从数据表中取出行并插入数据库中

时间:2016-08-26 05:39:49

标签: c# oracle datatable

我在数据表中有大约25k条记录。我已经有了以前的开发人员编写的更新查询,我无法更改。我想做的是如下:

  1. 从数据表一次获取1000条记录,记录可以在1到25k之间变化。
  2. 更新字符串中的查询,将这些1000条记录替换为IN(' values here')子句,并对数据库进行查询。
  3. 现在,我知道有很多方法可以做到这一点,比如使用数组绑定进行批量插入,但由于限制,我无法改变现有的编码模式。 我试图做的事情:

     if (dt.Rows.Count>0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
    
                        reviewitemsend =reviewitemsend + dr["ItemID"].ToString()+ ',';
                        //If record count is 1000 , execute against database. 
                    }
    
                }
    

    现在上面的方法正在把我带到现在,我感觉很震惊。所以我想到的另一个更好的方法是:

    int TotalRecords = dt.rows.count;
    If (TotalRecords <1000 && TotalRecords >0 )
     //Update existing query with this records by placing them in IN cluse and execute
    else
     {
            intLoopCounter = TotalRecords/1000; //Manage for extra records, as        counter will be whole number, so i will check modulus division also, if that is 0, means no need for extra counter, if that is non zero, intLoopCounter increment by 1
    for(int i= 0;i < intLoopCounter; i++)
     {
        //Take thousand records at a time, unless last counter has less than 1000 records and execute against database
    }
    

    }

    另外,注意更新查询如下:

     string UpdateStatement = @" UPDATE Table
     SET column1=<STATUS>,                                                       
     column2= '<NOTES>',
     changed_by = '<CHANGEDBY>',                                        
     status= NULL,   
     WHERE ID IN  (<IDS>)";
    

    在上面的更新查询中,IDS已经被所有25K记录ID替换,这些ID将被显示给最终用户,内部只有我必须将它作为单独的块执行,所以在IN()cluase I中需要一次插入1k条记录

1 个答案:

答案 0 :(得分:2)

您可以使用此linq方法拆分Datatable

private static List<List<DataRow>> SplitDataTable(DataTable table, int pageSize)
{
    return
    table.AsEnumerable()
          .Select((row, index) => new { Row = row,  Index = index, })
          .GroupBy(x => x.Index / pageSize)
          .Select(x => x.Select(v => v.Row).ToList())
          .ToList();
}

然后在每个块上运行数据库查询:

foreach(List<DataRow> chuck in SplitDataTable(dt, 1000))
{
    foreach(DataRow row in chuck)
    {
        // prepare data from row
    }

    // execute against database
}

提示:您可以修改拆分查询以直接在其中准备数据(通过替换x.Select(v => v.Row)部分,而不是在巨大的DataTable上循环两次。