如何用C#实现数据库数据的导入和导出?常用方法是什么?

来源:建站作者:马来西亚程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何用C#实现数据库数据的导入和导出?常用方法是什么?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用C#实现数据库数据的导入和导出?常用方法是什么?》有用,将其分享出去将是对创作者最好的鼓励。

在C#应用程序开发中,数据库数据的导入和导出是非常常见的业务需求,比如将用户数据导出为表格文件供运营人员查看,或者将外部表格中的数据批量导入到业务数据库中。不同的场景适合不同的实现方式,下面介绍几种主流的实现方法。

如何用C#实现数据库数据的导入和导出?常用方法是什么?

基于ADO.NET的基础导入导出方法

ADO.NET是C#操作数据库的基础类库,通过它可以直接执行SQL语句完成数据的读取和写入,适合简单的导入导出场景。

从数据库导出数据到CSV文件

CSV文件格式简单,兼容性好,适合轻量级的数据导出需求。首先通过ADO.NET查询数据库数据,再将数据按CSV格式写入文件即可。

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;

public class DataExportHelper
{
    // 数据库连接字符串
    private static string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";

    /// <summary>
    /// 将数据库表数据导出为CSV文件
    /// </summary>
    /// <param name="tableName">数据库表名</param>
    /// <param name="filePath">导出文件路径</param>
    public static void ExportToCsv(string tableName, string filePath)
    {
        // 查询表数据的SQL
        string sql = $"SELECT * FROM {tableName}";
        StringBuilder csvContent = new StringBuilder();

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    // 写入表头
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        csvContent.Append(reader.GetName(i));
                        if (i < reader.FieldCount - 1)
                        {
                            csvContent.Append(",");
                        }
                    }
                    csvContent.AppendLine();

                    // 写入数据行
                    while (reader.Read())
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            string value = reader[i]?.ToString() ?? "";
                            // 处理包含逗号的字段,用双引号包裹
                            if (value.Contains(","))
                            {
                                value = $""{value}"";
                            }
                            csvContent.Append(value);
                            if (i < reader.FieldCount - 1)
                            {
                                csvContent.Append(",");
                            }
                        }
                        csvContent.AppendLine();
                    }
                }
            }
        }

        // 写入文件,使用UTF8编码避免乱码
        File.WriteAllText(filePath, csvContent.ToString(), Encoding.UTF8);
        Console.WriteLine("CSV导出完成");
    }
}

从CSV文件导入数据到数据库

导入CSV文件时,先读取文件内容解析出数据行,再通过ADO.NET执行插入语句将数据写入数据库,适合数据量不大的场景。

using System;
using System.Data.SqlClient;
using System.IO;
using System.Text;

public class DataImportHelper
{
    private static string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";

    /// <summary>
    /// 将CSV文件数据导入到指定数据库表
    /// </summary>
    /// <param name="tableName">目标表名</param>
    /// <param name="filePath">CSV文件路径</param>
    public static void ImportCsvToDatabase(string tableName, string filePath)
    {
        // 读取CSV文件内容
        string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);
        if (lines.Length < 2)
        {
            Console.WriteLine("CSV文件无有效数据");
            return;
        }

        // 解析表头,获取字段名
        string[] headers = lines[0].Split(',');
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            // 从第二行开始读取数据
            for (int i = 1; i < lines.Length; i++)
            {
                string[] values = lines[i].Split(',');
                // 构造插入SQL,这里简单处理,实际场景需要防SQL注入
                string sql = $"INSERT INTO {tableName} ({string.Join(",", headers)}) VALUES ({string.Join(",", values.Select(v => $"'{v}'"))})";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.ExecuteNonQuery();
                }
            }
        }
        Console.WriteLine("CSV导入完成");
    }
}

使用第三方库操作Excel文件

如果需要导出为Excel格式,或者导入的源文件是Excel,使用第三方库可以大幅简化操作,常用的库有NPOI、EPPlus等,这里以EPPlus为例介绍实现方式。

导出数据到Excel文件

EPPlus支持操作Excel 2007及以上版本的xlsx文件,不需要安装Office组件,使用方便。

using System;
using System.Data;
using System.Data.SqlClient;
using OfficeOpenXml;

public class ExcelExportHelper
{
    private static string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";

    /// <summary>
    /// 将数据库数据导出为Excel文件
    /// </summary>
    public static void ExportToExcel(string tableName, string filePath)
    {
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        using (ExcelPackage package = new ExcelPackage())
        {
            // 创建工作表
            ExcelWorksheet worksheet = package.Worksheets.Add("数据表");
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                string sql = $"SELECT * FROM {tableName}";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        // 写入表头
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            worksheet.Cells[1, i + 1].Value = reader.GetName(i);
                        }

                        // 写入数据行
                        int row = 2;
                        while (reader.Read())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                worksheet.Cells[row, i + 1].Value = reader[i];
                            }
                            row++;
                        }
                    }
                }
            }

            // 保存文件
            package.SaveAs(new FileInfo(filePath));
        }
        Console.WriteLine("Excel导出完成");
    }
}

从Excel文件导入数据到数据库

读取Excel文件时,通过EPPlus解析工作表中的数据,再批量插入到数据库中,效率比逐条插入更高。

using System;
using System.Data;
using System.Data.SqlClient;
using OfficeOpenXml;

public class ExcelImportHelper
{
    private static string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";

    /// <summary>
    /// 将Excel文件数据导入到数据库表
    /// </summary>
    public static void ImportExcelToDatabase(string tableName, string filePath)
    {
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath)))
        {
            ExcelWorksheet worksheet = package.Worksheets[0];
            int rowCount = worksheet.Dimension.Rows;
            int colCount = worksheet.Dimension.Columns;

            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                // 读取表头作为字段名
                string[] headers = new string[colCount];
                for (int col = 1; col <= colCount; col++)
                {
                    headers[col - 1] = worksheet.Cells[1, col].Value?.ToString() ?? "";
                }

                // 从第二行开始读取数据,批量插入
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                {
                    bulkCopy.DestinationTableName = tableName;
                    // 创建DataTable存储数据
                    DataTable dt = new DataTable();
                    foreach (string header in headers)
                    {
                        dt.Columns.Add(header);
                    }

                    for (int row = 2; row <= rowCount; row++)
                    {
                        DataRow dr = dt.NewRow();
                        for (int col = 1; col <= colCount; col++)
                        {
                            dr[col - 1] = worksheet.Cells[row, col].Value?.ToString() ?? "";
                        }
                        dt.Rows.Add(dr);
                    }

                    bulkCopy.WriteToServer(dt);
                }
            }
        }
        Console.WriteLine("Excel导入完成");
    }
}

批量导入的优化方案

当导入的数据量较大时,逐条执行插入语句效率很低,可以使用SqlBulkCopy类实现批量插入,大幅提升导入效率。

using System;
using System.Data;
using System.Data.SqlClient;

public class BulkImportHelper
{
    private static string connectionString = "Server=127.0.0.1;Database=TestDB;User Id=sa;Password=123456;";

    /// <summary>
    /// 使用SqlBulkCopy批量导入DataTable数据
    /// </summary>
    public static void BulkInsertData(string tableName, DataTable sourceData)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.DestinationTableName = tableName;
                // 设置批处理大小,根据服务器性能调整
                bulkCopy.BatchSize = 1000;
                // 设置超时时间
                bulkCopy.BulkCopyTimeout = 60;
                bulkCopy.WriteToServer(sourceData);
            }
        }
        Console.WriteLine("批量导入完成");
    }
}

不同方法的适用场景

可以根据实际需求选择合适的实现方式,以下是不同方法的特点对比:

实现方式适用场景优点缺点
ADO.NET+CSV轻量级数据交互,不需要复杂格式无额外依赖,实现简单格式简单,不支持样式,大量数据时逐条插入效率低
第三方库+Excel需要导出带样式、公式的Excel文件,或导入Excel源文件功能强大,支持复杂Excel操作需要引入第三方依赖
SqlBulkCopy批量导入大数据量导入场景导入效率极高仅支持SQL Server,需要提前构造DataTable

在实际开发中,建议根据数据量大小、文件格式要求、数据库类型等因素选择最合适的实现方案,同时注意处理异常和事务,保证数据导入导出的可靠性。

C#数据库导入导出ADO.NETCSV文件Excel操作修改时间:2026-07-14 16:30:51

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。