.net将一个DataTable拆分成n个DataTable
2016-12-30 10:54
423 查看
C#
VB.Net
vb.net的代码我已适当修改,已经过验证正确,大家可以放心使用。
使用如下:
/// <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
相关文章推荐
- 推荐一个很好的关于.net的BLOG
- 一个在.net下进行用户模拟的类
- .NET,一个是否值得去学的技术
- [.NET]Visual Studio 2003的一个bug
- 一个不错的.NET开源网站。
- [.NET]Visual Studio 2003的一个bug
- 使用开源的.NET工具构造一个复杂的 自动构建 环境
- .net的序列化一个问题
- 推荐一个网址,一个人的blog的一篇文章,里面列出了N多的.net下的测试工具和文章
- 一个在.net下进行用户模拟的类
- 今天看到了一个进度条的.NET版本.功能比较强大
- 做一个用于自动完成数据层的.net外接程序,仅支持C#语言
- 实现将一个工资汇总表sheet拆分成多个个人工资单sheet
- .NET,一个是否值得去学的技术
- 由一个性能问题引出的.net概念
- >>关于.NET CF 的一些知识——启动同一个程序的多个拷贝
- .NET,一个是否值得去学的技术
- 一个.net实现的ubb类
- 偶建了一个群7811008。欢迎诸多.net开发者能来一起学习
- 一个.net实现的ubb类