跳至页脚内容
使用 IRONXL
如何使用C#从CSV文件读取数据并存储到数据库

如何从 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 文件中的数据

  1. 在 Visual Studio 中创建一个 C# 控制台程序。
  2. 使用 NuGet 包管理器安装 CSV 库。
  3. 使用库将 CSV 文件加载到程序中。
  4. 创建与数据库的连接。
  5. 使用库读取 CSV 文件中的内容。
  6. 使用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
$vbLabelText   $csharpLabel

请确保将&quot;path\to\your\csv\file.csv&quot;替换为您的 CSV 文件的实际路径,将YourModel替换为表示您的 CSV 数据的模型,将&quot;your_connection_string&quot;替换为您的数据库连接字符串,并将&quot;YourTableName&quot;替换为您的数据库表的名称。

设置环境

前提条件

  1. Visual Studio :请确保您已安装 Visual Studio。
  2. SQL Server :您应该已安装并可访问 SQL Server。
  3. IronXL 安装:运行以下 NuGet 命令安装 IronXL:
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 包管理器控制台并运行以下命令来完成此操作:

    Install-Package CsvHelper
    Install-Package CsvHelper
    SHELL
  4. 在 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
  5. 在代码中,指定 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 文件的实际路径。

  6. 创建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
  7. 创建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
  8. (可选)使用任何必要的设置配置CsvReader对象。 例如:

    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.HasHeaderRecord = True
    $vbLabelText   $csharpLabel
  9. 使用GetRecords()方法从CsvReader读取CSV数据。 代替``使用代表 CSV 文件中每条记录的对象类型。例如:

    var records = csv.GetRecords<YourModel>();
    var records = csv.GetRecords<YourModel>();
    Dim records = csv.GetRecords(Of YourModel)()
    $vbLabelText   $csharpLabel

    请务必将YourModel替换为您的模型类的实际名称。

  10. 遍历记录并执行任何必要的处理或验证:

    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
  11. (可选)使用 ADO.NET 或 ORM 工具(如 Entity Framework)建立与 SQL Server 数据库的连接。
  12. 使用您选择的数据库访问机制将每条记录插入数据库。 例如,如果您使用的是 ADO.NET,则可以利用SqlBulkCopy类高效地批量插入数据。
  13. 处理导入过程中可能出现的任何异常情况,并提供适当的错误消息或日志记录。
  14. 运行应用程序并验证 CSV 数据是否已成功导入数据库,以此测试应用程序。

就是这样! 您已成功使用 C# 将 CSV 数据导入到 SQL Server 数据库中。

步骤 1:读取 CSV 文件

开始从 CSV 文件导入数据时,第一个关键步骤是准确读取其中的数据。 CSV 文件中的每一行通常代表一条数据记录,每条记录由一个或多个字段组成,字段之间用逗号分隔。

接下来,我们使用 IronXL 库来处理 CSV 文件。要使用 IronXL 读取 CSV 文件,您需要用到它的WorkBookWorkSheet类。 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
$vbLabelText   $csharpLabel

步骤 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 Class
$vbLabelText   $csharpLabel

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;

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
$vbLabelText   $csharpLabel

它首先使用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
$vbLabelText   $csharpLabel

path_to_your_csv_file.csv替换为您的 CSV 文件路径。

项目运行

项目运行后,您将看到以下输出。 成功消息表示所有操作均已成功执行,数据已复制到数据库。

Data imported successfully!

现在,您可以打开 SQL Server Management Studio (SSMS) 并检查数据库下的表。 您将在表格中看到以下数据。

如何使用 C# 从 CSV 文件读取数据并将其存储到数据库中:图 1 - 输出数据库

结论

本教程指导您如何使用 C# 从 CSV 文件读取数据并将其存储在 SQL Server 数据库中。 通过遵循这些步骤并利用 IronXL 库,您可以高效地在 C# 应用程序中管理 CSV 数据。

IronXL 提供免费试用,用户可以在购买前体验其各项功能。 这个功能齐全的试用版允许潜在用户在真实环境中测试和评估产品,而不会在生产环境中添加任何水印。 试用期结束后,如果您决定继续在您的项目中使用 IronXL,则该产品的许可费用从$799起。

常见问题解答

我如何在C#中从CSV文件读取数据?

您可以使用IronXL库在C#中从CSV文件读取数据。IronXL提供`WorkBook`和`WorkSheet`类,允许您像处理Excel电子表格一样加载和操作CSV文件。

使用C#将CSV数据存储在SQL Server数据库中有哪些步骤?

要使用C#将CSV数据存储在SQL Server数据库中,首先使用IronXL读取CSV,然后将数据加载到`DataTable`中,并使用`SqlBulkCopy`将数据高效地插入到SQL Server表中。

如何在我的C#项目中安装IronXL?

您可以通过Visual Studio中的NuGet包管理器在您的C#项目中安装IronXL。在NuGet包管理器中搜索'IronXL'并将其添加到您的项目中。

使用IronXL处理C#中的CSV文件的主要优点是什么?

使用IronXL处理C#中的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数据。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。