使用IRONXL

如何從 CSV 檔案讀取資料並將其存儲在資料庫 C#

發佈 2024年1月27日
分享:

在當今的數位世界中,有效地處理資料是一項重要的任務。 在軟體開發中,一個常見的需求是從CSV文件中讀取資料並將其存儲到資料庫中。 本教程介紹如何使用 C# 將 CSV 文件中的數據讀取並存儲到 SQL Server 數據庫,具體方法是利用IronXL library. 本指南專為初學者設計,並將以簡單、有趣的方式進行解釋。

理解基礎知識

*什麼是 CSV 文件?

CSV 文件(逗號分隔值)檔案是一個純文字檔,其中包含以逗號分隔的數據。 由於其簡單性和與各種應用程式(如 Excel)的相容性,它是一種流行的數據傳輸格式。

SQL Server 和資料庫的角色

SQL Server 是 Microsoft 的資料庫管理系統。 它用於以結構化方式存儲和管理數據。 在我們的情況下,我們會將 CSV 資料存儲在 SQL Server 資料表中。

IronXL 介紹

IronXL是一個專為 .NET 應用程式量身打造的 Excel 程式庫,專門設計用於讓開發人員無需使用 Microsoft Office Interop 即可讀取、生成和編輯 Excel 文件。此程式庫以其與各種 .NET 版本和平台(包括 .NET Core、.NET Standard 和 .NET Framework)的相容性以及對不同作業系統如 Windows、Linux 和 macOS 的支援而聞名。 這是一個強大的庫,用於導入數據,特別適合處理 CSV 文件。

如何在 C# 中讀取和存儲 CSV 文件中的數據

  1. 在 Visual Studio 中創建一個 C# 控制台程式。

  2. 使用 NuGet 套件管理器安裝 CSV 函式庫。

  3. 使用該程式庫在程序中載入CSV檔案。

  4. 建立與資料庫的連接。

  5. 使用庫從 CSV 文件讀取內容。

  6. 使用 SqlBulkCopy 方法將內容複製到資料庫中。

    這是一個範例程式碼片段:

using System;
using System.Data;
using System.Data.SqlClient;
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))
            {
                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!");
            }
        }
    }
}
using System;
using System.Data;
using System.Data.SqlClient;
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))
            {
                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!");
            }
        }
    }
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
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)
				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
End Namespace
VB   C#

請確保將「path\to\your\csv\file.csv」替換為您的 CSV 文件的實際路徑,將「YourModel」替換為表示您 CSV 數據的模型,將「your_connection_string」替換為您的資料庫連接字符串,並將「YourTableName」替換為您的資料庫表名稱。

設定環境

先決條件

  1. Visual Studio:確保您已經安裝了 Visual Studio。

  2. SQL Server:您應該安裝並訪問 SQL Server。

  3. IronXL 安裝:通過運行以下 NuGet 命令安裝 IronXL:
Install-Package IronXL.Excel

dotnet add package IronXL

請確保在您希望安裝 IronXL 的項目目錄中運行這些命令。

創建 SQL Server 資料表

在匯入資料之前,請在您的 SQL Server 資料庫中建立目標表。 此表格將儲存 CSV 資料。

CREATE TABLE YourTableName (
    Column1 DataType,
    Column2 DataType,
    ...
);

YourTableNameColumn1Column2DataType 替換為您的具體詳細信息。

CSV 数据导入的分步指南

  1. 首先,確保您擁有一個包含您想要匯入的數據的 CSV 文件。

  2. 在 Visual Studio 中創建一個新的 C# 控制台應用程式專案。

  3. 安裝 CsvHelper NuGet 套件以閱讀 CSV 檔案。 您可以通過在 Visual Studio 中開啟 NuGet 套件管理器主控台並運行以下命令來完成此操作:
    :installCmd Install-Package CsvHelper
  1. 在您的 C# 代碼文件頂部添加必要的 using 語句:
    using System;
    using System.IO;
    using CsvHelper;
    using System;
    using System.IO;
    using CsvHelper;
Imports System
	Imports System.IO
	Imports CsvHelper
VB   C#
  1. 在您的程式碼中,指定您的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"
VB   C#

請確保將 C:\path\to\your\csv\file.csv 替換為您 CSV 文件的實際路徑。

  1. 創建 StreamReader 類的新實例以讀取 CSV 檔案:
    using (var reader = new StreamReader(csvFilePath))
    {
        // code goes here
    }
    using (var reader = new StreamReader(csvFilePath))
    {
        // code goes here
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 創建 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
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 選擇性地,使用任何必要的設置配置 CsvReader 對象。 例如:
    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.HasHeaderRecord = true;
csv.Configuration.HasHeaderRecord = True
VB   C#
  1. 使用 GetRecords<T>()CsvReader物件的方法將 CSV 數據讀取到物件集合中。 替換`與表示 CSV 文件中每個記錄的對象類型。例如:
    var records = csv.GetRecords<YourModel>();
    var records = csv.GetRecords<YourModel>();
Dim records = csv.GetRecords(Of YourModel)()
VB   C#

確保將 YourModel 替換為您的模型類的實際名稱。

  1. 迭代記錄並執行任何所需的處理或驗證:
    foreach (var record in records)
    {
        // code goes here
    }
    foreach (var record in records)
    {
        // code goes here
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. (選擇性)使用 ADO.NET 或像 Entity Framework 這樣的 ORM 工具建立與 SQL Server 資料庫的連接。

  2. 使用您選擇的資料庫訪問機制將每個記錄插入資料庫。 例如,如果您使用 ADO.NET,您可以利用 SqlBulkCopy 類別來高效地批量插入資料。

  3. 在匯入過程中,處理可能發生的任何例外情況,並提供適當的錯誤信息或日誌記錄。

  4. 通過運行您的應用程式並驗證 CSV 數據是否成功導入到您的資料庫中來測試您的應用程式。

    就是這樣! 您現在已經成功地使用 C# 將 CSV 數據導入到 SQL Server 資料庫中。

步驟一:讀取 CSV 檔案

在開始從 CSV 文件中導入數據的任務時,第一個關鍵步驟是準確地讀取其中的數據。 CSV 檔案中的每一行通常代表一個資料記錄,每個記錄由一個或多個以逗號分隔的欄位組成。

接著,我們使用 IronXL 庫來處理 CSV 檔案。要使用 IronXL 讀取 CSV 檔案,您將使用其 WorkBookWorkSheet 類別。 WorkBook 類別代表整個試算表,這可能是 Excel 文件,或者在我們的例子中,是一個 CSV 文件。當您將 CSV 文件路徑載入到 WorkBook 物件中時,IronXL 將 CSV 文件視為試算表/資料表。

using IronXL;
public class CSVReader
{
    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;
public class CSVReader
{
    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
Public Class CSVReader
	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
VB   C#

步驟 2:建立資料庫連線

建立與您的 SQL Server 資料庫的連接是儲存 CSV 數據過程中的基本步驟。 此步驟涉及建立您的應用程式與資料庫伺服器之間的通訊連結。 成功的連接至關重要,因為沒有它,將數據傳輸到數據庫是不可能的。

此步驟著重於使用連接字串在 C# 中建立和開啟連接。 連接字串是一個重要的組件,因為它包含建立連接所需的信息。 這就像是一把打開資料庫大門的鑰匙。

public class DatabaseConnector
{
    private string connectionString = "your_connection_string_here";

    public SqlConnection ConnectToDatabase()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}
public class DatabaseConnector
{
    private string connectionString = "your_connection_string_here";

    public SqlConnection ConnectToDatabase()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}
Public Class DatabaseConnector
	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
VB   C#

connectionString 變數包含連接到您的 SQL Server 所需的所有詳細資訊。 通常包括伺服器名稱、資料庫名稱、使用者ID和密碼。 示例連接字串如下所示:Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;。 務必將這些佔位符替換為您的實際伺服器詳細信息。

步驟 3:將資料儲存在資料庫中

在與 SQL Server 資料庫建立連線後,接下來的關鍵步驟是將 CSV 數據儲存在資料庫中。 此步驟涉及將您已讀取和處理的數據傳輸到您的 SQL Server 表中。 這是數據處理過程中的關鍵部分,因為它涉及將實際數據從本地文件遷移到資料庫伺服器。

在此步驟中,我們將重點介紹如何將現在存儲在 DataTable 中的 CSV 資料傳輸到 SQL Server 資料庫。 我們使用 C# 和 SQL Server 的功能組合來高效地完成此任務。

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);
                }
            }
        }
    }
}
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);
                }
            }
        }
    }
}
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
VB   C#

它首先使用 DatabaseConnector 類建立與 SQL Server 資料庫的連接,確保資料交易的通道。 該方法檢查資料庫中名為「CSVData」的表是否存在。

如果找不到表格,它會繼續創建。 該表的架構是根據傳遞給方法的DataTable架構構建的,所有列都設置為NVARCHAR。(最大)**以適應任何文本數據。 這是一種通用的方法,可能需要進一步調整以更緊密地匹配特定的數據類型。

接著,SQL 命令會被構建並執行,以驗證該表格的存在或創建該表格。 這確保後續的大量複製操作有一個準備好用於數據插入的目標表。 準備好資料表後,使用 SqlBulkCopy 類別將資料從 DataTable 直接傳輸到 SQL Server 資料表中。 此操作專為高性能的大量數據傳輸而設計,適合高效處理大量數據。

步驟 4:整合所有內容

在細心完成了閱讀 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
VB   C#

path_to_your_csv_file.csv 替換為您的 CSV 文件的路徑。

運行專案

當您運行專案時,您將看到以下輸出。 成功訊息表示所有操作已成功執行,數據已複製到資料庫中。

Data imported successfully!

現在,您可以開啟 SQL Server Management Studio(SSMS)並檢查資料庫下的表格。 您將在表格中看到以下數據。

如何從 CSV 檔案讀取資料並存入資料庫 C#: 圖 1 - 輸出資料庫

結論

本教程指導您如何使用C#從CSV文件讀取數據並將其存儲到SQL Server數據庫中。 透過遵循這些步驟並利用 IronXL 庫,您可以在 C# 應用程式中高效管理 CSV 資料。

IronXL 提供一個免費試用讓使用者在購買前體驗其功能。 這個完全功能的試用版本允許潛在用戶在實際環境中測試和評估產品,而生產中不會有水印。 試用期結束後,如果您決定繼續將 IronXL 用於您的項目,該產品的授權起始價格為 $749。

< 上一頁
如何將 DataGridView 導出到 Excel 在 C# 中
下一個 >
如何在C#中將Excel文件轉換為XML

準備開始了嗎? 版本: 2024.11 剛剛發布

免費 NuGet 下載 總下載次數: 1,111,773 查看許可證 >