大数据量的问题

时间:2023-01-11 23:39:36
最近公司有个需求,就是把一些数据倒出来,但这个数据非常大,大约有3W多笔,要求是这样的,就是把这些资料在前台显示,同时要转为EXCEL.我用了个存储过程,但由于资料太多,前台还是无法显示.其实显示前十笔给他看就行了,关键是要倒出为EXCEL,所以所有的资料必须全部从数据库里取出来.各位有什么好办法

25 个解决方案

#1


如果对效率,调度要求比较高可以使用sqlserver的dts,以windows service的方式运行,与前台交互可以使用remoting注册tcp/ip通道(同局域网内部署),关于.net的dts开发,可以参考
http://www.programfan.com/article/showarticle.asp?id=2712

#2


帮你顶上去!!

#3


前台分页显示吧

#4


mark

#5


其实我不显示也可以,我只是要把这些数据倒成EXCEL就可以了,但数据库不在局域网内

#6


帮你顶,让高手来捧场

#7


但数据库不在局域网内
----------------------------
是否有防火墙?如果有的话就比较复杂了,如果通过internet可以直接访问到,那么dts的使用和本地sqlserver也应该没有区别

#8


3W没关系啊,直接在EXCEL里面加入数据都可以

#9


你的3W是什么意思?是3万多条数据是吗?先把数据查询出来插入到临时表中,然后从临时表中做查询,肯定比你直接查库要快至少5倍以上!!!

#10


楼主可以先将数据用DATAGRIDVIEW在前台显示,然后再将DATAGRIDVIEW(或DATASET)的数据导入到EXCEL里,请参考下面的代码,这代码也不是我写的,楼主主要看如何用myData数组来获取与填充就行了


        /**//// <summary>
        /// DataGridView导出到Excel
        /// 操作步骤:
        /// 1)先添加对Excel的引用。选择项目-〉添加引用-〉COM-〉添加Microsoft Excel 9.0
        ///            (不同的office讲会有不同版本的dll文件).
        /// 2)引入using Microsoft.Office.Interop.Excel;和using System.Reflection;
        /// 
        /// </summary>
        /// <param name="dgv"></param>
        public void DBtoExcel(DataGridView dgv)
        {
            int rowCount = dgv.RowCount;
            int columnCount = dgv.ColumnCount;            
            //
            Microsoft.Office.Interop.Excel.Application exc = new Microsoft.Office.Interop.Excel.Application();
            if (exc == null)
            {
                throw new Exception("Excel无法启动");
            }
            //
            exc.Visible = true;
            //
            Workbooks workbooks = exc.Workbooks;
            //
            _Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            //
            Sheets sheets = exc.Sheets;
            _Worksheet worksheet = (_Worksheet)sheets[1];
            if (worksheet == null)
            {
                throw new Exception("Worksheet error");
            }
            //
            Range r = worksheet.get_Range("A1", Missing.Value);
            if (r == null)
            {
                MessageBox.Show("Range无法启动");
                throw new Exception("Range error");
            }
            
            
            //以上是一些例行的初始化工作,下面进行具体的信息填充
            //填充标题
            int ColIndex = 1;
            foreach (DataGridViewColumn dHeader in dgv.Columns)
            {
                worksheet.Cells[1, ColIndex++] = dHeader.HeaderText;
            }
            //获取DataGridView中的所有行和列的数值,填充到一个二维数组中.
            object[,] myData = new object[rowCount + 1, columnCount];
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {                    
                    myData[i, j] = dgv[j,i].Value;    //这里的获取注意行列次序
                }
            }
            //将填充好的二维数组填充到Excel对象中.
            r = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[rowCount + 1, columnCount]);        
            r.Value2 = myData;
        }

        /**//// <summary>
        /// 导出GridView到Excel中的关键之处
        /// 用法: ToExcel(GVStaff, TextBox1.Text);
        /// </summary>
        /// <param name="ctl"></param>
        /// <param name="FileName"></param>
        public static void ToExcel(System.Web.UI.Control ctl, string FileName)
        {
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
            HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + "" + FileName + ".xls");
            ctl.Page.EnableViewState = false;
            System.IO.StringWriter tw = new System.IO.StringWriter();
            HtmlTextWriter hw = new HtmlTextWriter(tw);
            ctl.RenderControl(hw);
            HttpContext.Current.Response.Write(tw.ToString());
            HttpContext.Current.Response.End();
        }
        //必须有下面这句!否则不会通过!
        public override void VerifyRenderingInServerForm(Control control)
        {
            // Confirms that an HtmlForm control is rendered for
        }

#11


效率不差,曾导过5万条的记录,也就10秒左右的样子

#12


//必须有下面这句!否则不会通过!
        public override void VerifyRenderingInServerForm(Control control)
        {
            // Confirms that an HtmlForm control is rendered for
        }

里面没有代码??

#13


up

#14


虽然数据3W不是很大,但我这3W条是通过三个大数据量的表查询出来的数据(查询的时间占了1-2分钟,这个时间没有办法改变的),dts的使用我倒没有去试过,等下就去试一下.jcyluck的方法可能不大适合我,我只是想把大数据量转成EXCEL,并不需要显示的。希望高手继续给好的建议

#15


在数据库直接手工操作export data

#16


我这3W条是通过三个大数据量的表查询出来的数据
----------------------------
那你先把查询结果放另一个表然后直接倒出Excel

#17


对于导数据,你看看应该有专门的工具...

以前做过Oracle将文本文件导入数据库,用的是Oracle的sqlloader,当时是写成的一个批处理,然后在程序中调就行了,速度特别快...速度大约相当于在程序中解析字符串,然后插入数据库这种做法的25倍左右(做过实验)...

对于从数据库中往外面导,我想也应该有相应的工具吧...如果真有的话,不妨也写成批处理,然后在程序中调用即可...

仅供参考..

#18


顺便问一下,你用的是什么数据库?

#19


3W条数据,如果前台查看,使用分页显示(一次只取几页的数据即可)。
如果要导出,有几种选择:
1。在服务器上导出到excel,然后把excel下载到客户端来
2。将数据放到DataSet里返回到客户端,然后手动来写excel

个人觉得,1。是个不错的选择。

#20


这里有篇文章说的是从数据库导入excel,8000条只需要4秒钟...

不知道对你有没有帮助...

http://sh.szstudy.cn/showArticle/26700.shtml

#21


or try...

http://www.cnblogs.com/forrest_lu/archive/2004/04/21/6966.aspx

方法挺简单,不知道效率如何...

#22


太感谢liujia_0421了!!!!!

#23


来学习下 顺便帮LZ顶了

#24


3w .
我以前都导过80万的数据.
时间用了好象是十几分钟吧.
如果想要代码:QQ:84115357

#25


该回复于2008-12-20 23:23:36被版主删除

#1


如果对效率,调度要求比较高可以使用sqlserver的dts,以windows service的方式运行,与前台交互可以使用remoting注册tcp/ip通道(同局域网内部署),关于.net的dts开发,可以参考
http://www.programfan.com/article/showarticle.asp?id=2712

#2


帮你顶上去!!

#3


前台分页显示吧

#4


mark

#5


其实我不显示也可以,我只是要把这些数据倒成EXCEL就可以了,但数据库不在局域网内

#6


帮你顶,让高手来捧场

#7


但数据库不在局域网内
----------------------------
是否有防火墙?如果有的话就比较复杂了,如果通过internet可以直接访问到,那么dts的使用和本地sqlserver也应该没有区别

#8


3W没关系啊,直接在EXCEL里面加入数据都可以

#9


你的3W是什么意思?是3万多条数据是吗?先把数据查询出来插入到临时表中,然后从临时表中做查询,肯定比你直接查库要快至少5倍以上!!!

#10


楼主可以先将数据用DATAGRIDVIEW在前台显示,然后再将DATAGRIDVIEW(或DATASET)的数据导入到EXCEL里,请参考下面的代码,这代码也不是我写的,楼主主要看如何用myData数组来获取与填充就行了


        /**//// <summary>
        /// DataGridView导出到Excel
        /// 操作步骤:
        /// 1)先添加对Excel的引用。选择项目-〉添加引用-〉COM-〉添加Microsoft Excel 9.0
        ///            (不同的office讲会有不同版本的dll文件).
        /// 2)引入using Microsoft.Office.Interop.Excel;和using System.Reflection;
        /// 
        /// </summary>
        /// <param name="dgv"></param>
        public void DBtoExcel(DataGridView dgv)
        {
            int rowCount = dgv.RowCount;
            int columnCount = dgv.ColumnCount;            
            //
            Microsoft.Office.Interop.Excel.Application exc = new Microsoft.Office.Interop.Excel.Application();
            if (exc == null)
            {
                throw new Exception("Excel无法启动");
            }
            //
            exc.Visible = true;
            //
            Workbooks workbooks = exc.Workbooks;
            //
            _Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            //
            Sheets sheets = exc.Sheets;
            _Worksheet worksheet = (_Worksheet)sheets[1];
            if (worksheet == null)
            {
                throw new Exception("Worksheet error");
            }
            //
            Range r = worksheet.get_Range("A1", Missing.Value);
            if (r == null)
            {
                MessageBox.Show("Range无法启动");
                throw new Exception("Range error");
            }
            
            
            //以上是一些例行的初始化工作,下面进行具体的信息填充
            //填充标题
            int ColIndex = 1;
            foreach (DataGridViewColumn dHeader in dgv.Columns)
            {
                worksheet.Cells[1, ColIndex++] = dHeader.HeaderText;
            }
            //获取DataGridView中的所有行和列的数值,填充到一个二维数组中.
            object[,] myData = new object[rowCount + 1, columnCount];
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {                    
                    myData[i, j] = dgv[j,i].Value;    //这里的获取注意行列次序
                }
            }
            //将填充好的二维数组填充到Excel对象中.
            r = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[rowCount + 1, columnCount]);        
            r.Value2 = myData;
        }

        /**//// <summary>
        /// 导出GridView到Excel中的关键之处
        /// 用法: ToExcel(GVStaff, TextBox1.Text);
        /// </summary>
        /// <param name="ctl"></param>
        /// <param name="FileName"></param>
        public static void ToExcel(System.Web.UI.Control ctl, string FileName)
        {
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
            HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + "" + FileName + ".xls");
            ctl.Page.EnableViewState = false;
            System.IO.StringWriter tw = new System.IO.StringWriter();
            HtmlTextWriter hw = new HtmlTextWriter(tw);
            ctl.RenderControl(hw);
            HttpContext.Current.Response.Write(tw.ToString());
            HttpContext.Current.Response.End();
        }
        //必须有下面这句!否则不会通过!
        public override void VerifyRenderingInServerForm(Control control)
        {
            // Confirms that an HtmlForm control is rendered for
        }

#11


效率不差,曾导过5万条的记录,也就10秒左右的样子

#12


//必须有下面这句!否则不会通过!
        public override void VerifyRenderingInServerForm(Control control)
        {
            // Confirms that an HtmlForm control is rendered for
        }

里面没有代码??

#13


up

#14


虽然数据3W不是很大,但我这3W条是通过三个大数据量的表查询出来的数据(查询的时间占了1-2分钟,这个时间没有办法改变的),dts的使用我倒没有去试过,等下就去试一下.jcyluck的方法可能不大适合我,我只是想把大数据量转成EXCEL,并不需要显示的。希望高手继续给好的建议

#15


在数据库直接手工操作export data

#16


我这3W条是通过三个大数据量的表查询出来的数据
----------------------------
那你先把查询结果放另一个表然后直接倒出Excel

#17


对于导数据,你看看应该有专门的工具...

以前做过Oracle将文本文件导入数据库,用的是Oracle的sqlloader,当时是写成的一个批处理,然后在程序中调就行了,速度特别快...速度大约相当于在程序中解析字符串,然后插入数据库这种做法的25倍左右(做过实验)...

对于从数据库中往外面导,我想也应该有相应的工具吧...如果真有的话,不妨也写成批处理,然后在程序中调用即可...

仅供参考..

#18


顺便问一下,你用的是什么数据库?

#19


3W条数据,如果前台查看,使用分页显示(一次只取几页的数据即可)。
如果要导出,有几种选择:
1。在服务器上导出到excel,然后把excel下载到客户端来
2。将数据放到DataSet里返回到客户端,然后手动来写excel

个人觉得,1。是个不错的选择。

#20


这里有篇文章说的是从数据库导入excel,8000条只需要4秒钟...

不知道对你有没有帮助...

http://sh.szstudy.cn/showArticle/26700.shtml

#21


or try...

http://www.cnblogs.com/forrest_lu/archive/2004/04/21/6966.aspx

方法挺简单,不知道效率如何...

#22


太感谢liujia_0421了!!!!!

#23


来学习下 顺便帮LZ顶了

#24


3w .
我以前都导过80万的数据.
时间用了好象是十几分钟吧.
如果想要代码:QQ:84115357

#25


该回复于2008-12-20 23:23:36被版主删除