如何從 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 檔案。
如何在 C# 中讀取和儲存 CSV 檔案中的數據
- 在 Visual Studio 中建立一個 C# 控制台程式。
- 使用 NuGet 套件管理器安裝 CSV 庫。
- 使用庫將 CSV 檔案載入到程式中。
- 建立與資料庫的連線。
- 使用庫讀取 CSV 檔案中的內容。
- 使用
SqlBulkCopy方法將該內容複製到資料庫中。
以下是一個範例程式碼片段:
using System;
using System.Data;
using System.Data.SqlClient;
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;
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
Imports System.Globalization
Imports System.IO
Imports CsvHelper
Namespace CsvReader
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim csvPath As String = "path\to\your\csv\file.csv"
Using reader = New StreamReader(csvPath)
Using csv = 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"替換為您的資料庫連接字串,並將"YourTableName"替換為您的資料庫表的名稱。
設定環境
先決條件
- Visual Studio :請確保您已安裝 Visual Studio。
- SQL Server :您應該已安裝並可存取 SQL Server。
- IronXL 安裝:執行以下 NuGet 指令安裝 IronXL:
dotnet add package IronXL
請確保在要安裝 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;using System; using System.IO; using System.Globalization; using CsvHelper; using System.Data.SqlClient;Imports System Imports System.IO Imports System.Globalization Imports CsvHelper Imports System.Data.SqlClient$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的實際路徑。建立
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(可選)使用任何必要的設定配置
CsvReader物件。 舉例來說csv.Configuration.HasHeaderRecord = true;csv.Configuration.HasHeaderRecord = true;csv.Configuration.HasHeaderRecord = True$vbLabelText $csharpLabel使用
GetRecords<T> ()CsvReader物件的GetRecords<T> ()方法,用於將 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;
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;
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
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 ClassconnectionString變數包含連接到 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;
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;
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
Public Class DataImporter
Public Sub ImportData(ByVal 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 i
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 數據。









