如何從 CSV 文件讀取資料並將其存儲到資料庫 C# 中
在當今的數位世界中,高效處理資料是一項重要的任務。 軟體開發中一個常見的需求是從 CSV 檔案中讀取資料並將其儲存在資料庫中。 本教學介紹如何使用 C# 從 CSV 檔案讀取資料並將其儲存在 SQL Server 資料庫中,特別是使用IronXL 庫。 本指南專為初學者設計,將以簡單易懂、引人入勝的方式進行講解。
瞭解基礎知識
什麼是CSV檔案?
CSV(逗號分隔值)文件是一種純文字文件,其中包含以逗號分隔的資料。 由於其簡單易用且與各種應用程式(如 Excel)相容,因此是一種流行的資料傳輸格式。
SQL Server 與資料庫的作用
SQL Server是微軟公司的資料庫管理系統。 它用於以結構化的方式儲存和管理資料。 在本例中,我們將把 CSV 資料儲存在 SQL Server 表中。
IronXL 簡介
IronXL 是一個專為 .NET 應用程式定制的 Excel 庫,旨在幫助開發人員無需 Microsoft Office Interop 即可讀取、生成和編輯 Excel 文件。此函式庫的突出特點在於其與各種 .NET 版本和平台(包括 .NET Core、.NET Standard 和 .NET Framework)的兼容性,以及對 Windows、Linux 和 macOS 等不同作業系統的支援。 這是一個功能強大的資料導入庫,尤其適用於處理 CSV 檔案。
How to Read and Store Data From CSV Files in C#
- 在 Visual Studio 中建立一個 C# 控制台程式。
- 使用 NuGet 套件管理器安裝 CSV 庫。
- 使用庫將 CSV 檔案載入到程式中。
- 建立與資料庫的連線。
- 使用庫讀取 CSV 檔案中的內容。
- 使用
SqlBulkCopy方法將該內容複製到資料庫中。
以下是一個範例程式碼片段:
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
using System.Globalization;
using System.IO;
using CsvHelper;
namespace CsvReader
{
class Program
{
static void Main(string[] args)
{
string csvPath = @"path\to\your\csv\file.csv";
using (var reader = new StreamReader(csvPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Mapping the CSV data to the corresponding model
var records = csv.GetRecords<YourModel>();
using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
{
sqlBulkCopy.DestinationTableName = "YourTableName";
sqlBulkCopy.WriteToServer(records.AsDataReader());
}
Console.WriteLine("Data imported successfully!");
}
}
}
// Define your model that maps to the CSV columns
public class YourModel
{
// Define properties here representing the CSV columns
}
}
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
using System.Globalization;
using System.IO;
using CsvHelper;
namespace CsvReader
{
class Program
{
static void Main(string[] args)
{
string csvPath = @"path\to\your\csv\file.csv";
using (var reader = new StreamReader(csvPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Mapping the CSV data to the corresponding model
var records = csv.GetRecords<YourModel>();
using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
{
sqlBulkCopy.DestinationTableName = "YourTableName";
sqlBulkCopy.WriteToServer(records.AsDataReader());
}
Console.WriteLine("Data imported successfully!");
}
}
}
// Define your model that maps to the CSV columns
public class YourModel
{
// Define properties here representing the CSV columns
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Imports System.Globalization
Imports System.IO
Imports CsvHelper
Namespace CsvReader
Class Program
Shared Sub Main(args As String())
Dim csvPath As String = "path\to\your\csv\file.csv"
Using reader As New StreamReader(csvPath)
Using csv As New CsvReader(reader, CultureInfo.InvariantCulture)
' Mapping the CSV data to the corresponding model
Dim records = csv.GetRecords(Of YourModel)()
Using sqlBulkCopy As New SqlBulkCopy("your_connection_string")
sqlBulkCopy.DestinationTableName = "YourTableName"
sqlBulkCopy.WriteToServer(records.AsDataReader())
End Using
Console.WriteLine("Data imported successfully!")
End Using
End Using
End Sub
End Class
' Define your model that maps to the CSV columns
Public Class YourModel
' Define properties here representing the CSV columns
End Class
End Namespace
請確保將 "path\to\your\csv\file.csv" 替換為您的 CSV 檔案的實際路徑,將 YourModel 替換為表示您的 CSV 資料的模型,將 "your_connection_string" 替換為您的資料庫連接資料的模型,將 "your_connection_string" 替換為您的資料庫連接檔案的模型,將 "your_connection_string" 替換為您的資料庫連接字串,並將資料表的字串表-1001-100@CO10@ 100@CO10@ 1001101010 的字串。
設定環境
先決條件
- Visual Studio:確保您已安裝 Visual Studio。
- SQL Server:您應該已安裝並可存取 SQL Server。
- IronXL 安裝:執行以下 NuGet 指令安裝 IronXL:
dotnet add package IronXL.Excel
請確保在要安裝 IronXL 的專案目錄中執行這些命令。
建立 SQL Server 表
在匯入資料之前,請在 SQL Server 資料庫中建立目標表。 此表將儲存 CSV 資料。
CREATE TABLE YourTableName (
Column1 DataType,
Column2 DataType,
...
);
請將 YourTableName、Column1、Column2 和 DataType 替換為您的具體資訊。
逐步指南:如何匯入 CSV 資料
- 首先,請確保您有一個包含要匯入的資料的 CSV 檔案。
- 在 Visual Studio 中建立一個新的 C# 控制台應用程式專案。
-
安裝 CsvHelper NuGet 套件以讀取 CSV 檔案。 您可以透過在 Visual Studio 中開啟 NuGet 套件管理器控制台並執行以下命令來完成此操作:
Install-Package CsvHelperInstall-Package CsvHelperSHELL -
在 C# 程式碼檔案的頂部加入必要的 using 語句:
using System; using System.IO; using System.Globalization; using CsvHelper; using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient insteadusing System; using System.IO; using System.Globalization; using CsvHelper; using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient insteadImports System Imports System.IO Imports System.Globalization Imports CsvHelper Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead$vbLabelText $csharpLabel -
在程式碼中,指定 CSV 檔案的路徑。例如:
string csvFilePath = @"C:\path\to\your\csv\file.csv";string csvFilePath = @"C:\path\to\your\csv\file.csv";Dim csvFilePath As String = "C:\path\to\your\csv\file.csv"$vbLabelText $csharpLabel請務必將
C:\path\to\your\csv\file.csv替換為您的 CSV 檔案的實際路徑。 -
建立
StreamReader類別的新實例來讀取 CSV 檔案:using (var reader = new StreamReader(csvFilePath)) { // code goes here }using (var reader = new StreamReader(csvFilePath)) { // code goes here }Using reader = New StreamReader(csvFilePath) ' code goes here End Using$vbLabelText $csharpLabel -
建立
CsvReader類別的新實例,並將StreamReader物件傳入:using (var reader = new StreamReader(csvFilePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { // code goes here }using (var reader = new StreamReader(csvFilePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { // code goes here }Using reader = New StreamReader(csvFilePath) Using csv = New CsvReader(reader, CultureInfo.InvariantCulture) ' code goes here End Using End Using$vbLabelText $csharpLabel -
(可選)透過將
CsvConfiguration物件傳遞給其建構函數,來配置CsvReader的任何必要設定。 舉例來說var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, }; using var csv = new CsvReader(reader, config);var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, }; using var csv = new CsvReader(reader, config);Imports System.Globalization Imports CsvHelper Dim config As New CsvConfiguration(CultureInfo.InvariantCulture) With { .HasHeaderRecord = True } Using csv As New CsvReader(reader, config) ' Use csv here End Using$vbLabelText $csharpLabel -
使用
GetRecords<t>()物件的CsvReader方法將 CSV 資料讀取到物件集合中。 將<t>替換為代表 CSV 檔案中每筆記錄的物件類型。例如:var records = csv.GetRecords<YourModel>();var records = csv.GetRecords<YourModel>();Dim records = csv.GetRecords(Of YourModel)()$vbLabelText $csharpLabel請務必將
YourModel替換為您的模型類別的實際名稱。 -
遍歷記錄並執行任何必要的處理或驗證:
foreach (var record in records) { // Process each record as needed }foreach (var record in records) { // Process each record as needed }For Each record In records ' Process each record as needed Next record$vbLabelText $csharpLabel - (選用)使用 ADO.NET 或 ORM 工具(如 Entity Framework)建立與 SQL Server 資料庫的連線。
- 使用您選擇的資料庫存取機制將每筆記錄插入資料庫。 例如,如果您使用 ADO.NET,則可以利用
SqlBulkCopy類別來有效地大量插入資料。 - 處理匯入過程中可能出現的任何異常情況,並提供適當的錯誤訊息或日誌記錄。
- 執行應用程式並驗證 CSV 資料是否已成功匯入資料庫,以此測試應用程式。
就是這樣! 您已成功使用 C# 將 CSV 資料匯入 SQL Server 資料庫。
步驟 1:讀取 CSV 文件
開始從 CSV 檔案匯入資料時,第一個關鍵步驟是準確讀取其中的資料。 CSV 檔案中的每一行通常代表一筆資料記錄,每筆記錄由一個或多個欄位組成,欄位之間以逗號分隔。
然後我們使用 IronXL 庫來處理 CSV 檔案。若要使用 IronXL 讀取 CSV 文件,您將使用其 WorkBook 和 WorkSheet 類別。 WorkBook 類別代表一個完整的電子表格,它可以是 Excel 文件,也可以是本範例中的 CSV 文件。當您將 CSV 檔案路徑載入到 WorkBook 物件中時,IronXL 會將 CSV 檔案視為電子表格/資料表。
using IronXL;
using System.Data;
public class CSVReader
{
// Reads a CSV file and converts it to a DataTable
public DataTable ReadCSV(string filePath)
{
WorkBook workbook = WorkBook.Load(filePath);
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert to DataTable for easier processing
DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
return dataTable;
}
}
using IronXL;
using System.Data;
public class CSVReader
{
// Reads a CSV file and converts it to a DataTable
public DataTable ReadCSV(string filePath)
{
WorkBook workbook = WorkBook.Load(filePath);
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert to DataTable for easier processing
DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
return dataTable;
}
}
Imports IronXL
Imports System.Data
Public Class CSVReader
' Reads a CSV file and converts it to a DataTable
Public Function ReadCSV(ByVal filePath As String) As DataTable
Dim workbook As WorkBook = WorkBook.Load(filePath)
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Convert to DataTable for easier processing
Dim dataTable As DataTable = sheet.ToDataTable(True) ' Set to 'true' if your CSV has a header row
Return dataTable
End Function
End Class
步驟 2:建立資料庫連接
建立與 SQL Server 資料庫的連線是儲存 CSV 資料過程中的基本步驟。 此步驟涉及在您的應用程式和資料庫伺服器之間建立通訊鏈路。 連接成功至關重要,因為如果沒有連接,就無法將資料傳輸到資料庫。
本步驟重點介紹如何使用 C# 中的連接字串建立和開啟連線。 連接字串是至關重要的組成部分,因為它包含了建立連接所需的資訊。 它就像一把鑰匙,可以打開資料庫的大門。
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DatabaseConnector
{
// Connection string to connect to the database
private string connectionString = "your_connection_string_here";
public SqlConnection ConnectToDatabase()
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
}
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DatabaseConnector
{
// Connection string to connect to the database
private string connectionString = "your_connection_string_here";
public SqlConnection ConnectToDatabase()
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
}
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Public Class DatabaseConnector
' Connection string to connect to the database
Private connectionString As String = "your_connection_string_here"
Public Function ConnectToDatabase() As SqlConnection
Dim connection As New SqlConnection(connectionString)
connection.Open()
Return connection
End Function
End Class
connectionString 變數包含連接到 SQL Server 所需的所有詳細資訊。 它通常包括伺服器名稱、資料庫名稱、使用者 ID 和密碼。 一個連接字串範例如下所示:Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;。 務必將這些佔位符替換為您的實際伺服器詳細資訊。
步驟三:將資料儲存到資料庫中
與 SQL Server 資料庫建立連線後,下一個關鍵步驟是將 CSV 資料儲存到資料庫中。 此步驟涉及將您讀取和處理的資料傳輸到 SQL Server 表中。 這是資料處理過程中至關重要的一部分,因為它涉及將資料從本機檔案實際遷移到資料庫伺服器。
在這一步驟中,我們將重點介紹如何將現在儲存在 DataTable 中的 CSV 資料傳輸到 SQL Server 資料庫。 我們結合使用 C# 和 SQL Server 的功能來有效率地完成這項任務。
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DataImporter
{
public void ImportData(DataTable dataTable)
{
using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
{
// Check if the table exists and create it if it does not.
string tableName = "CSVData"; // Use a valid SQL table name format
string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
string createTable = "CREATE TABLE " + tableName + " (";
for (int i = 0; i < dataTable.Columns.Count; i++)
{
createTable += $"[{dataTable.Columns[i].ColumnName}] NVARCHAR(MAX)";
if (i < dataTable.Columns.Count - 1)
createTable += ", ";
}
createTable += ") END";
SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
createTableCommand.ExecuteNonQuery();
// Now we use SqlBulkCopy to import the data
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = tableName;
try
{
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Data imported successfully!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DataImporter
{
public void ImportData(DataTable dataTable)
{
using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
{
// Check if the table exists and create it if it does not.
string tableName = "CSVData"; // Use a valid SQL table name format
string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
string createTable = "CREATE TABLE " + tableName + " (";
for (int i = 0; i < dataTable.Columns.Count; i++)
{
createTable += $"[{dataTable.Columns[i].ColumnName}] NVARCHAR(MAX)";
if (i < dataTable.Columns.Count - 1)
createTable += ", ";
}
createTable += ") END";
SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
createTableCommand.ExecuteNonQuery();
// Now we use SqlBulkCopy to import the data
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = tableName;
try
{
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Data imported successfully!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Public Class DataImporter
Public Sub ImportData(dataTable As DataTable)
Using connection As SqlConnection = New DatabaseConnector().ConnectToDatabase()
' Check if the table exists and create it if it does not.
Dim tableName As String = "CSVData" ' Use a valid SQL table name format
Dim checkTable As String = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN "
Dim createTable As String = "CREATE TABLE " & tableName & " ("
For i As Integer = 0 To dataTable.Columns.Count - 1
createTable &= $"[{dataTable.Columns(i).ColumnName}] NVARCHAR(MAX)"
If i < dataTable.Columns.Count - 1 Then
createTable &= ", "
End If
Next
createTable &= ") END"
Dim createTableCommand As New SqlCommand(checkTable & createTable, connection)
createTableCommand.ExecuteNonQuery()
' Now we use SqlBulkCopy to import the data
Using bulkCopy As New SqlBulkCopy(connection)
bulkCopy.DestinationTableName = tableName
Try
bulkCopy.WriteToServer(dataTable)
Console.WriteLine("Data imported successfully!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
End Using
End Sub
End Class
它首先使用 DatabaseConnector 類別開啟與 SQL Server 資料庫的連接,從而確保資料事務的路徑。 此方法檢查資料庫中是否存在名為"CSVData"的表。
如果找不到該表,則會建立該表。 該表的架構是基於傳遞給該方法的 DataTable 架構構建的,所有列都設置為 NVARCHAR(MAX) 以容納任何文字資料。 這是一種通用方法,可能需要進行改進以更精確地匹配特定資料類型。
之後,編寫並執行 SQL 命令,以驗證表是否存在或建立該表。 這樣可以確保後續的批次複製操作有一個可用於資料插入的目標表。 表格準備就緒後,使用 SqlBulkCopy 類別將資料從 DataTable 直接傳輸到 SQL Server 表中。 此操作專為高效能大量資料傳輸而設計,因此非常適合高效處理大量資料。
第四步:整合所有內容
在認真完成讀取 CSV 資料、建立資料庫連線和準備傳輸資料等前幾個步驟之後,我們來到了最後也是至關重要的階段:將這些單獨的元件整合到一個連貫的流程中。
此整合是在 C# 應用程式的 Main 方法中完成的,所有功能都整合在一起,從而能夠將資料從 CSV 檔案匯入到 SQL Server 資料庫。
class Program
{
static void Main(string[] args)
{
string filePath = "path_to_your_csv_file.csv";
CSVReader reader = new CSVReader();
DataTable dataTable = reader.ReadCSV(filePath);
DataImporter importer = new DataImporter();
importer.ImportData(dataTable);
Console.WriteLine("Data imported successfully!");
}
}
class Program
{
static void Main(string[] args)
{
string filePath = "path_to_your_csv_file.csv";
CSVReader reader = new CSVReader();
DataTable dataTable = reader.ReadCSV(filePath);
DataImporter importer = new DataImporter();
importer.ImportData(dataTable);
Console.WriteLine("Data imported successfully!");
}
}
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim filePath As String = "path_to_your_csv_file.csv"
Dim reader As New CSVReader()
Dim dataTable As DataTable = reader.ReadCSV(filePath)
Dim importer As New DataImporter()
importer.ImportData(dataTable)
Console.WriteLine("Data imported successfully!")
End Sub
End Class
將 path_to_your_csv_file.csv 替換為您的 CSV 檔案路徑。
專案運行
項目運行後,您將看到以下輸出。 成功訊息表示所有操作均已成功執行,資料已複製到資料庫。
Data imported successfully!
現在,您可以開啟 SQL Server Management Studio (SSMS) 並檢查資料庫下的表。 您將在表格中看到以下資料。
結論
本教學課程指導您如何使用 C# 從 CSV 檔案讀取資料並將其儲存在 SQL Server 資料庫中。 透過遵循這些步驟並利用 IronXL 庫,您可以有效地在 C# 應用程式中管理 CSV 資料。
IronXL 提供免費試用,用戶可以在購買前體驗其各項功能。 這個功能齊全的試用版允許潛在用戶在真實環境中測試和評估產品,而不會在生產環境中添加任何浮水印。 試用期結束後,如果您決定繼續在您的專案中使用 IronXL,則產品的許可從 $799 開始。
常見問題解答
如何在 C# 中從 CSV 文件讀取資料?
您可以使用 IronXL 庫在 C# 中從 CSV 文件讀取資料。IronXL 提供 `WorkBook` 和 `WorkSheet` 類,允許您將 CSV 文件加載並操作,就像處理 Excel 試算表一樣。
將 CSV 資料存儲到 SQL Server 資料庫中的步驟是什麼?
要在 C# 中將 CSV 資料存儲到 SQL Server 資料庫中,首先使用 IronXL 讀取 CSV,然後將資料加載到 `DataTable` 並使用 `SqlBulkCopy` 高效地插入到 SQL Server 表中。
如何將 IronXL 安裝到我的 C# 項目中使用?
您可以在您的 C# 項目中使用 Visual Studio 的 NuGet 套件管理器來安裝 IronXL。在 NuGet 套件管理器中搜索 'IronXL' 並添加到您的項目中。
在 C# 中使用 IronXL 處理 CSV 文件的主要優勢是什麼?
在 C# 中使用 IronXL 處理 CSV 文件的主要優勢是它能夠在 .NET 應用程式中無縫管理和操作 CSV 和 Excel 文件,提供跨多個 .NET 版本和操作系統的兼容性。
我可以使用 IronXL 處理 Excel 文件以及 CSV 文件嗎?
是的,IronXL 設計用於處理 Excel 和 CSV 文件,使其在 .NET 應用程式中管理試算表資料成為一個多功能工具。
如果我在使用 IronXL 讀取 CSV 文件時遇到錯誤,我應該怎麼辦?
如果您在使用 IronXL 讀取 CSV 文件時遇到錯誤,確保 CSV 文件格式正確,且 IronXL 已正確安裝在您的項目中。您可以參考 IronXL 的文檔尋求故障排除建議。
如何在購買前測試 IronXL 的功能?
IronXL 提供一個完全功能齊全的免費試用版,允許您在生產環境中無任何限制地測試和評估該產品。
使用 IronXL 將 CSV 資料存儲到資料庫的先決條件是什麼?
先決條件包括已安裝 Visual Studio、有 SQL Server 訪問權限,以及通過 NuGet 安裝的 IronXL。您還需要設置一個 SQL Server 表來存儲 CSV 資料。


