这两天遇到一个问题,我们所接触 的一个系统在导出数据到Excel的时候,产生了内存溢出的错误。原因在于数据过大,它导出是将所有数据存放在一个DataSet的一个表中,再将这个数 据集放入session,在导出功能所在的页面再读取该session的值,并绑定在一个DataGrid,再进行相关导出处理。因为系统不是我们开发 的,我们就打算在数据存入session的时候,将数据表分解成多个表存入DataSet,这样在绑定DataGrid并处理的时候,能够一个个 table的处理。测试后证明,方法是成功了。下面就把代码一贴,有类似需求的可以大概看看,希望能有所帮助。

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;
        }

.Net 将一个DataTable分解成多个DataTable的更多相关文章

  1. linux 将一个文件分解成多个不同名文件

    1.通过c直接实现 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include & ...

  2. java 将一个正整数翻译成人民币大写的读法

    程序如下: import java.lang.StringBuffer; /** 给定一个浮点数,将其装换成人民币大写的读法 88.5:捌十捌元零伍角 */ public class Num2Rmb ...

  3. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  4. C#将DataTable转换成list的方法

    本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </su ...

  5. DataTable转换成IList<T>的简单实现

    DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...

  6. asp.net dataTable转换成Json格式

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  7. 将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...

  8. DataTable转换成json字符串

    将DataTable里面的行转换成json字符串方法: #region DataTable转为json /// <summary> /// DataTable转为json /// < ...

  9. C#:DataTable映射成Model

    这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理. 反射自然必不可少的,另外考 ...

随机推荐

  1. 多线程和并发管理 .NET多线程服务

    线程相关静态变量 默认静态变量应用程序域所有线程可见.如果静态变量需要在线程间共享,同步访问也就必然了. 线程相关静态变量保证线程安全,同一时间只有一个线程可访问,且每个线程都有该静态变量的拷贝. p ...

  2. A C

    Problem Description Are you excited when you see the title "AC" ? If the answer is YES , A ...

  3. cocos2dx3.0-tinyxml在Android环境下解析xml失败的问题

    本文由@呆代待殆原创,转载请注明出处. 正常情况下,我们在用tinyxml读取xml文件的的时候,会像下面这样写. std::string filePath = FileUtils::getInsta ...

  4. c++11 Chrono时间库

    c++11 Chrono时间库 http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=chrono ...

  5. 整理的Unity导出安卓工程利用ANT进行多渠道批量打包APK

    Unity导出的安卓工程利用ant进行多渠道循环批量打包 一:设置JAVA环境变量 做android开发的配置这个是基础. win7 下配置java环境变量,下面是链接 http://www.cnbl ...

  6. 【转载】经典漫画讲解HDFS原理

    分布式文件系统比较出名的有HDFS  和 GFS,其中HDFS比较简单一点.本文是一篇描述非常简洁易懂的漫画形式讲解HDFS的原理.比一般PPT要通俗易懂很多.不难得的学习资料. 1.三个部分: 客户 ...

  7. Linux双网卡绑定和解除绑定的实现

      双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作.根据交换机可支持的功能不 ...

  8. [转]WPF 获取程序启动路径

    本文转自:http://hi.baidu.com/lilipangtou/item/f1b7488e3c92c4d05e0ec1ab 在Windows Form程序中,获取自身的启动目录是非常容易的, ...

  9. 【求无向图的桥,有重边】ZOJ - 2588 Burning Bridges

    模板题——求割点与桥 题意,要使一个无向图不连通,输出必定要删掉的边的数量及其编号.求桥的裸题,可拿来练手. 套模板的时候注意本题两节点之间可能有多条边,而模板是不判重边的,所以直接套模板的话,会将重 ...

  10. hdu 3585 二分+最大团

    题目:给出平面上n个点,现在找m个点,并且使得这m个点最近的两个最远. 分析:显然这满足二分的性质,二分答案,根据点距离需要大于等于二分值重新构造新图,则问题变成了:在新图中找出满足所有点对之间的距离 ...