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