首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# / VB.NET 將 CSV 數據高效導入 SQL Server 的多種方案

     編輯:程式設計綜合問答

方案一:SQL Server 內建工具(零代碼、效能最佳)

  • 匯入/匯出精靈:SSMS 右鍵資料庫 → 任務 → 匯入資料,選擇「平面檔案來源」,引導式完成。
  • BULK INSERT / bcp:適合大量數據、自動化腳本。
    BULK INSERT dbo.TargetTable
    FROM 'C:\Data\export.csv'
    WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', CODEPAGE = '65001');
    

方案二:C# 使用 SqlBulkCopy(高效能、程式化控制)

using (var reader = new CsvReader(new StreamReader("data.csv"), true))
using (var bcp = new SqlBulkCopy(connStr)) {
    bcp.DestinationTableName = "dbo.TargetTable";
    bcp.BatchSize = 5000;
    bcp.WriteToServer(reader); // 需引用 CsvHelper 或自行實作 IDataReader
}

關鍵點:CsvReader 實作 IDataReader,避免全量載入記憶體;BatchSize 控制事務大小。

方案三:逐行解析 + 參數化 INSERT(中小數據量、邏輯複雜時)

foreach (var line in File.ReadLines("data.csv").Skip(1)) {
    var cols = line.Split(',');
    using (var cmd = new SqlCommand(
        "INSERT INTO T(Col1,Col2) VALUES(@c1,@c2)", conn)) {
        cmd.Parameters.AddWithValue("@c1", cols[0]);
        cmd.Parameters.AddWithValue("@c2", cols[1]);
        cmd.ExecuteNonQuery();
    }
}

注意:需處理逗號在引號內、換行符等 CSV 邊界情況,建議使用 TextFieldParser (VB.NET) 或 CsvHelper (C#)。

方案對比與選型建議

方案適用場景優點缺點
BULK INSERT / bcp超大文件、定時任務最快、無需寫代碼格式要求嚴格、難處理複雜轉換
SqlBulkCopy + CsvHelper中大型、需預處理高效、可管控、支援數據清洗需引入第三方庫
逐行 INSERT小數據、邏輯複雜彈性最大、易除錯效能最差

常見坑點提醒

  • 編碼:CSV 常為 UTF-8,SQL Server 預設頁碼可能不同,指定 CODEPAGE = 65001。
  • 標題行:FIRSTROW = 2 跳過表頭。
  • 引號逗號:簡單 Split(',') 會誤切,務必用正規 CSV 解析器。
  • 類型轉換:字串轉日期/數值前先驗證,避免批次失敗。

根據數據量、自動化需求、團隊技術棧選擇最合適方案;生產環境首推 SqlBulkCopy + CsvHelper 平衡效能與可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved