我现在在做一个项目,需要把数据库里的所有数据生成HTML文件,几十万了还好说,但现在是1500多万的数据,真的要崩溃了,我只导出来90多万的数据,1/10都不到,老板天天在催.  代码运行一阵要么是连接超时,要么到后来就是无法打开该页,什么都没了,我想如果不行一次导90万,分多次导,但这也不是个合理的办法,不知道大家可不可以帮我一下,先谢谢了! .cs的代码:http://wap.515game.cn/allhtm.aspx.rar

解决方案 »

  1.   

    曾经有个和你一样 生成的文件很大的时候会超时
    孟老师这样回答
    生成的方法这样:test.aspx //具体其他的控制条件自己写
    int newsid = Convert.ToInt32(Request.QueryString["id"]);
    if(newsid  > 9999)
    {
     Response.Write("正在ok" );
     Response.End();
     return;
    }
    Response.Write("正在生成新闻" +newsid.ToString() );
    GenerateHtml(newsid );
    Response.Write("<script>window.location.href='test.aspx?id=" + (newsid + 1)+ "';</script>");
    Response.Flush();
    Response.End();
      

  2.   

    整个winform应该不会出现这种问题,毕竟是后台维护
      

  3.   

    B/S下就手动操作吧  根据你数据库的记录 取ID一定范围值之间 一批一批的搞
      

  4.   

      谢谢大家,我之前用过一次分批处理,循环生成文件夹,一个文件夹2万条数据,测试的时候第一次出现超时,第2次就是无法显示该页,第3次也是无法显示该页,然后我没管它,就把这个测试页关了,但我发现我的硬盘还在写数据,一直写到136G(1个HTML文件12K,硬盘160G),用了不到18个小时,后来硬盘没地方了,我也不说不清楚为什么我关了测试页它还在继续执行.我把这个代码给客户了,但他只生成60万的数据就停了(他挂的是外设移动硬盘500G),难道移动硬盘跟本地硬盘有什么区别吗,除了读取速度,好迷茫!
      

  5.   

    使用CS模式吧,BS模式不方便,然后用线程,应该是比较快的,而且还可以看到进度.
      

  6.   

    两年前做过一个考评统计分析系统 因为数据量大 那时做的程序效率也低 要计算一天一夜的时间 当时的处理类似上面的思路:(不会CSDN的排版 发的时候很整齐 发过就都没跳格了)1 设置两个页a.aspx,b.aspx
    2 a通过iframe框架包含b
    3 a中设置初始条件 激活开始事件 在开始事件里写
    4 b进行静态输出处理 判断结束条件a.aspx中代码
    js:
    <script type=text/javascript>
    function doCheck(newId) {
       //这里可以写代码将当前状态显示在当前页(a.aspx)上 如显示在一个div里   //调用b.aspx执行
       document.all('frm').src='b.aspx?id='+newId;
    }
    </script>C#:
    在page_load事件里写
    if (Request.QueryString["start"].Equals("1"))
    {
            //开始
             //在此获取或设置初始条件
             string id=Request.QueryString["id"];
            if (id!=null && id!="")
            {
              //调用b.aspx执行输出
               Response.Write("<script>document.all('frm').src='b.aspx?id="+id+"';</script>");
            }
    }
    start参数可以通过一个开始按钮赋值b.aspx中代码(在page_load事件里)
    C#:
    string id=Request.QueryString["id"];
    if (id!=null && id!="")
    {
            //输出id的静态页
             
            ////////
            //判断是否结束 这里设未结束
             bool isEnd=false;         if (!isEnd)
            {
                   //根据一定规则获取下一个id,这里设id=id+1
                    int newId=int.Parse(id)+1;
                   //调用a.aspx中的doCheck()方法
                      Response.Write("<script>window.parent.doCheck("+newId+");</script>");
            }
    }
      

  7.   

    如果只要求结果的话,LZ可以采用 WinForm 方式,利用多线程并用数据库表的水平分割来生成,也没什么好办法
      

  8.   

    我看了你的代码,分析下你的情况,给你几个建议
    1.winform应该是合适过web,按照你现在的需要需要一次性批量导为html静态文件的需求来说;
    2.代码有几个地方需要优化,你的数据很大,SqlDataReader检索是保留连接的那么超时很正常了,可以采用分小步每次读取一范围的数据,例如id为1-100,101-200这样100为单位循环操作;
    3.减少一些IO
    例如 
    //读取模板
    using(StreamReader sr=new StreamReader(Server.MapPath("Mb.htm"),System.Text.Encoding.UTF8,true))其实你都是同一个模板,为何不暂时存放模板内容起来,例如application["mb_content"]保存起来,一次就ok了
    看看这些应用后的效果
      

  9.   

    我上边这一句有问题 应该先判空 if   (Request.QueryString["start"]!=null && Request.QueryString["start"].Equals("1")) 
      

  10.   

    int newsid = Convert.ToInt32(Request.QueryString["id"]);
    if(newsid  > 9999)
    {
     Response.Write("正在ok" );
     Response.End();
     return;
    }
    Response.Write("正在生成新闻" +newsid.ToString() );
    GenerateHtml(newsid );
    Response.Write("<script>window.location.href='test.aspx?id=" + (newsid + 1)+ "';</script>");
    Response.Flush();
    Response.End();
    这样就可以了----------------------------
    PS:楼主为什么不换个思路去想呢!
    导出数据。导出的最后结果是什么还原对吧!
    如果是还原,哎!直接还原mdf.ldf文件
    如果说是显示在word上那我没办法!呵呵,鄙视自己下