我们正在从sql server DB中提取大量数据。它有大约25000行,2500列。要求是读取数据并将其导出到电子表格,因此分页不是一种选择。当记录较少时,它可以提取数据,但当它增长到我上面提到的大小时,它会抛出异常。
public DataSet Exportexcel(string Username)
{
Database db = DatabaseFactory.CreateDatabase(Config);
DbCommand dbCommand =
db.GetStoredProcCommand("Sp_ExportADExcel");
db.AddInParameter(dbCommand, "@Username", DbType.String,
Username);
return db.ExecuteDataSet(dbCommand);
}
请帮我解决这个问题。
答案 0 :(得分:3)
要求是读取数据并将其导出到电子表格,所以 分页不是一种选择。
为什么不分步读取数据。而不是一次获得所有记录,为什么不每次都获得有限数量的记录并将它们写入excel。继续,直到您处理完所有记录
答案 1 :(得分:0)
您可以使用批处理逻辑批量获取记录,每次执行5000条记录,并将结果存储在临时数据集中,并且一旦完成所有处理。将数据从临时数据集转储到Excel。
您可以使用C#BulkCopy类来实现此目的。
答案 2 :(得分:0)
如果将Excel中的数据作为csv提供就足够了,您可以使用批量复制
bcp "select col1, col2, col3 from database.schema.SomeTable" queryout "c:\MyData.txt" -c -t"," -r"\n" -S ServerName -T
这种情况更快,而且占地面积小。
答案 3 :(得分:0)
您的问题完全取决于您试图一次性提取如此多的数据。 你可以通过在执行查询的机器中安装更多内存来解决问题,但这只是一个小窍门。
您最好逐步检索此类数据。
您可以非常轻松地逐行读取数据并将CSV格式的数据导出/附加到文件中,这可以在存储过程中完成。
您没有说明您使用的数据库,但处理如此大量的数据是数据库引擎的设计目标。
除了在C#代码中处理大量数据对象时,最好使用泛型,因为这不会像对象那样强制执行对象实例化,因此会减少内存占用。