将Excel文件中的数据存储至远程MySQL数据库(C#桌面应用)
C#桌面应用:Excel数据导入远程MySQL解决方案
1. 前置准备
- 安装NuGet依赖包:
EPPlus/NPOI:用于读取Excel文件(EPPlus适配xlsx,NPOI兼容xls/xlsx;EPPlus 5+需商业授权,非商用可选用4.x版本)MySqlConnector:MySQL官方推荐的.NET数据驱动,稳定性优于旧版MySql.Data
- 配置远程MySQL权限:确保数据库服务器防火墙开放3306端口(或自定义端口),且MySQL账号允许你的客户端IP访问,同时拥有目标表的
INSERT权限 - 提前创建MySQL表:表结构需与Excel数据字段匹配(如Excel文本对应
VARCHAR,数字对应INT/DECIMAL等)
2. 读取Excel数据(以EPPlus为例)
using OfficeOpenXml; using System.Data; using System.IO; // 非商用场景设置许可证上下文 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; DataTable excelTable = new DataTable(); using (var package = new ExcelPackage(new FileInfo(@"C:\example.xlsx"))) { var worksheet = package.Workbook.Worksheets[0]; // 读取第一个工作表 // 加载表头 for (int col = worksheet.Dimension.Start.Column; col <= worksheet.Dimension.End.Column; col++) { excelTable.Columns.Add(worksheet.Cells[1, col].Text); } // 加载数据行 for (int row = worksheet.Dimension.Start.Row + 1; row <= worksheet.Dimension.End.Row; row++) { DataRow dataRow = excelTable.NewRow(); for (int col = worksheet.Dimension.Start.Column; col <= worksheet.Dimension.End.Column; col++) { dataRow[col - 1] = worksheet.Cells[row, col].Text; } excelTable.Rows.Add(dataRow); } }
3. 批量插入MySQL数据
方式1:循环参数化插入(小数据量)
using MySqlConnector; string connStr = "server=远程MySQL地址;database=你的数据库名;user=账号;password=密码;port=3306;SslMode=Required;"; using (var conn = new MySqlConnection(connStr)) { conn.Open(); string insertSql = "INSERT INTO target_table (col1, col2, col3) VALUES (@val1, @val2, @val3)"; using (var cmd = new MySqlCommand(insertSql, conn)) { // 定义参数 cmd.Parameters.Add("@val1", MySqlDbType.VarChar); cmd.Parameters.Add("@val2", MySqlDbType.Int32); cmd.Parameters.Add("@val3", MySqlDbType.Decimal); foreach (DataRow row in excelTable.Rows) { // 赋值参数(需根据实际数据类型做校验转换) cmd.Parameters["@val1"].Value = row["Excel表头1"].ToString(); cmd.Parameters["@val2"].Value = int.TryParse(row["Excel表头2"].ToString(), out int val2) ? val2 : 0; cmd.Parameters["@val3"].Value = decimal.TryParse(row["Excel表头3"].ToString(), out decimal val3) ? val3 : 0; cmd.ExecuteNonQuery(); } } }
方式2:MySqlBulkCopy(大数据量推荐)
using MySqlConnector; string connStr = "server=远程MySQL地址;database=你的数据库名;user=账号;password=密码;port=3306;SslMode=Required;"; using (var conn = new MySqlConnection(connStr)) { conn.Open(); using (var bulkCopy = new MySqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "target_table"; // 映射Excel列与MySQL表列(若列名一致可省略此步骤) bulkCopy.ColumnMappings.Add("Excel表头1", "col1"); bulkCopy.ColumnMappings.Add("Excel表头2", "col2"); bulkCopy.ColumnMappings.Add("Excel表头3", "col3"); bulkCopy.WriteToServer(excelTable); } }
4. 关键注意事项
- 数据校验:插入前必须验证Excel数据格式,避免类型转换异常(比如用
int.TryParse/decimal.TryParse做容错处理) - 异常捕获:添加
try-catch块捕获文件读取、数据库连接、插入过程中的异常,返回明确错误提示 - 性能优化:数据量超过1000条时,优先使用
MySqlBulkCopy,效率远高于循环插入
内容的提问来源于stack exchange,提问作者The Webgraphica
相关产品推荐
相关产品推荐

