.Net 將一個DataTable分解成多個DataTable


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM