iT邦幫忙

0

[ASPX] C# 將CSV檔案匯入SQL SERVER(通用版)

  • 分享至 

  • xImage
  •  

很常要匯EXCEL資料到資料庫
於是請AI幫忙寫了一支通用程式,只要建好和EXCEL表頭一樣的資料表,按一下資料就進去了.

先拉一個web form aspx,然後拉一個button
然後把以下程式碼copy過去.
把button click選Button1_Click
這樣程式就OK了.不用再外掛什麼.

然後CREATE一個table 欄位名稱和要匯入的EXCEL檔案表頭一樣.
把EXCEL轉成CSV,放到設定的位置
按下按鈕,資料就進去了

 protected void Button1_Click(object sender, EventArgs e)
    {
        // 設定區 
        string targetTableName = "ExcelImportData";
        string filePath = @"D:\123.csv";

        try
        {
            DataTable dt = ImportCSVToDataTable(filePath);

            // 顯示在 GridView (選用)
            //GridView1.DataSource = dt;
            //GridView1.DataBind();

            // 執行大批匯入
            ExecuteBulkCopy(dt, targetTableName);

            Response.Write("<script>alert('匯入成功!共 " + dt.Rows.Count + " 筆');</script>");
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('發生錯誤: " + ex.Message.Replace("'", "") + "');</script>");
        }
    }

    /// <summary>
    /// 自動讀取 CSV 並動態建立 DataTable (自動抓表頭)
    /// </summary>
    private DataTable ImportCSVToDataTable(string filePath)
    {
        DataTable dt = new DataTable();
        // 使用 Big5 處理中文字,若 CSV 是 UTF8 則改為 Encoding.UTF8
        using (StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("big5")))
        {
            string line = sr.ReadLine();
            if (string.IsNullOrEmpty(line)) throw new Exception("CSV 檔案是空的");

            // 1. 建立表頭
            string[] headers = line.Split(',');
            foreach (string header in headers)
            {
                dt.Columns.Add(header.Trim());
            }

            // 2. 讀取資料
            while ((line = sr.ReadLine()) != null)
            {
                string[] values = line.Split(',');
                if (values.Length == headers.Length)
                {
                    dt.Rows.Add(values);
                }
            }
        }
        return dt;
    }

    /// <summary>
    /// 通用 BulkCopy:自動對應 DataTable 與 SQL 欄位
    /// </summary>
    private void ExecuteBulkCopy(DataTable dt, string tableName)
    {
        string connStr = "server=127.0.0.1;uid=sa;pwd=1234;database=test;Connection Lifetime=600;Max Pool Size=200";

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.DestinationTableName = tableName;
                bulkCopy.BatchSize = 1000; // 效能優化

                // 【核心關鍵】:自動將 CSV 的表頭對應到 SQL 同名的欄位
                foreach (DataColumn col in dt.Columns)
                {
                    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                }

                bulkCopy.WriteToServer(dt);
            }
        }
    }

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言