我在数据表中有大约25k条记录。我已经有了以前的开发人员编写的更新查询,我无法更改。我想做的是如下:
现在,我知道有很多方法可以做到这一点,比如使用数组绑定进行批量插入,但由于限制,我无法改变现有的编码模式。 我试图做的事情:
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条记录
答案 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
上循环两次。