您的位置:首页 > 其它

.net将一个DataTable拆分成n个DataTable

2016-12-30 10:54 423 查看
C#

/// <summary>
/// 分解数据表
/// </summary>
/// <param name="originalTab">需要分解的表</param>
/// <param name="rowsNum">每个表包含的数据量</param>
/// <returns></returns>
public DataSet SplitDataTable(DataTable originalTab, int rowsNum)
{
//获取所需创建的表数量
int tableNum = originalTab.Rows.Count / rowsNum;

//获取数据余数
int remainder = originalTab.Rows.Count % rowsNum;

DataSet ds = new DataSet();

//如果只需要创建1个表,直接将原始表存入DataSet
if (tableNum == 0)
{
ds.Tables.Add(originalTab);
}
else
{
DataTable[] tableSlice = new DataTable[tableNum];

//Save orginal columns into new table.
for (int c = 0; c<tableNum; c++)
{
tableSlice[c] = new DataTable();
foreach(DataColumn dc in originalTab.Columns)
{
tableSlice[c].Columns.Add(dc.ColumnName,dc.DataType);
}
}
//Import Rows
for (int i = 0; i < tableNum; i ++)
{
// if the current table is not the last one
if (i != tableNum -1)
{
for(int j = i*rowsNum ; j < ((i+1)*rowsNum); j++)
{
tableSlice[i].ImportRow(originalTab.Rows[j]);
}
}
else
{
for(int k = i*rowsNum ; k < ((i+1)*rowsNum+remainder); k++)
{
tableSlice[i].ImportRow(originalTab.Rows[k]);
}
}
}

//add all tables into a dataset
foreach(DataTable dt in tableSlice)
{
ds.Tables.Add(dt);
}
}
return ds;
}
以上代码还有点小小的问题,如果需要拆分表的数据不能整除新表包含的数据,上述代码会缺少最后一张表,需要自己适当修改代码。

VB.Net

Public Shared Function SplitDataTable(ByVal originalTab As DataTable, ByVal rowsNum As Integer) As DataSet

Dim tableNum As Integer = originalTab.Rows.Count \ rowsNum    '相除取整
Dim remainder As Integer = originalTab.Rows.Count Mod rowsNum  '相除取余数
Dim ds As DataSet = New DataSet
'if one table is big enough to store, use one table
If tableNum = 0 Then
ds.Tables.Add(originalTab)
Else

If remainder > 0 Then   '如果有余数,需要多一张表存余数
tableNum = tableNum + 1
End If

Dim tableSlice(tableNum - 1) As DataTable

'Save orginal columns into new table
Dim c As Integer
For c = 0 To (tableNum - 1)
tableSlice(c) = New DataTable
For Each dc As DataColumn In originalTab.Columns
tableSlice(c).Columns.Add(dc.ColumnName, dc.DataType)
Next
Next

'Import Rows
Dim i As Integer
If remainder > 0 Then
For i = 0 To (tableNum - 1)
'if the current table is not the last table
If i <> tableNum - 1 Then
Dim j As Integer
For j = i * rowsNum To (((i + 1) * rowsNum) - 1)
tableSlice(i).ImportRow(originalTab.Rows(j))
Next
Else
Dim k As Integer
'For k = i * rowsNum To (((i + 1) * rowsNum + remainder) - 1)
For k = i * rowsNum To ((i * rowsNum + remainder) - 1)
tableSlice(i).ImportRow(originalTab.Rows(k))
Next
End If
Next
Else
For i = 0 To (tableNum - 1)
Dim j As Integer
For j = i * rowsNum To (((i + 1) * rowsNum) - 1)
tableSlice(i).ImportRow(originalTab.Rows(j))
Next
Next
End If

'Add all tables into a dataset
For Each dt As DataTable In tableSlice
ds.Tables.Add(dt)
Next
End If

Return ds
'SplitDataTable = ds
End Function


vb.net的代码我已适当修改,已经过验证正确,大家可以放心使用。

使用如下:

Dim ds As DataSet = SplitDataTable(pdt, 200)    '新的DataTable为200条数据
If ds.Tables.Count > 0 Then
For i As Integer = 0 To ds.Tables.Count - 1
newDt = ds.Tables(i)   '循环DataSet里面的每张DataTable表
'此处是对每个新DataTable表的操作
next
End IF
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DataTable DataSet 拆分