原創 Datareader 導出爲csv文件方法

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);
                }
            }
        }
相關文章
相關標籤/搜索