DataReader 是遊標只讀數據, 若是是大數據導出,用Datatable 將耗費巨大內存資源。由於Datatable 其實就是內存中的一個數據表ide
代碼以下大數據
/// <summary> /// SqlDataReader 生成csv文件 /// </summary> /// <param name="fileNameCsv">文件名(包含文件路徑)</param> /// <param name="dr">數據表</param> /// <param name="hideColumnNames">要隱藏的列名</param> /// <param name="encoding">編碼【默認:GB2312】</param> /// <returns></returns> protected static void DownloadCsv(string fileNameCsv, string fileNameZip, SqlDataReader dr, string[] hideColumnNames, string encoding="gb2312") { if (dr != null) { try { Dictionary<string, string> hideCol = new Dictionary<string, string>(); foreach (string item in hideColumnNames) { hideCol.Add(item.Trim(), item); } if (!File.Exists(fileNameCsv)) { using (StreamWriter sw = new StreamWriter(fileNameCsv, false, Encoding.GetEncoding(encoding))) { string fieldName = string.Empty; StringBuilder sb = new StringBuilder(); //寫入表頭 for (int i = 0; i < dr.FieldCount; i++) { fieldName = dr.GetName(i); if (hideCol.ContainsKey(fieldName) == true || fieldName == "") continue; else { sb.Append(fieldName); sb.Append(","); } } sw.WriteLine(sb.ToString().TrimEnd(',')); sb.Clear(); //寫入導出數據 while (dr.Read()) { //遍歷每一列 for (int i = 0; i < dr.FieldCount; i++) { fieldName = dr.GetName(i); if (hideCol.ContainsKey(fieldName) == true || fieldName == "") continue; else { if (!Convert.IsDBNull(dr[i])) { string content = string.Format("\"{0}\"", dr[i].ToString().Replace("\"", "\"\"")); sb.Append(content); } else { sb.Append("\"\""); } sb.Append(","); } } sw.WriteLine(sb.ToString().TrimEnd(',')); sb.Clear();//每行數據結束清空已經寫入文本的數據 } } } dr.Close(); string filePath = fileNameCsv.Substring(0, fileNameCsv.LastIndexOf(@"\")+1);//+1 包含最後一個斜槓 CreateZipFile(filePath, fileNameZip);//建立壓縮文件 } catch(Exception ex) { if(!dr.IsClosed) { dr.Close(); } LogHelper.WriteErrorLog("ProcessDocument.DownloadCsv", ex.Message); } } }