這兩天遇到一個問題,我們所接觸 的一個系統在導出數據到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;
}
/// 分解數據表
/// </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;
}