C# WinForm:提取CSV指定内容到DataGridView并保存至数据库
实现CSV数据筛选、绑定到DataGridView并保存到数据库
我来帮你完善这个需求的实现,分读取筛选CSV数据、绑定到DataGridView,以及保存到数据库三个核心部分来梳理:
1. 读取CSV并筛选目标行之后的数据
你的思路是对的,需要先跳过Tango N$10 Voucher Benefit,10之前的所有行,从它的下一行开始加载数据。这里我给你优化代码,加入DataTable来规范数据结构,方便后续绑定和保存:
try { var filePath = Path.GetFullPath(openAirtimeFile.FileName); var allLines = File.ReadAllLines(filePath); // 定位目标起始行的位置(找到目标行后,从下一行开始读取) int startDataIndex = -1; for (int i = 0; i < allLines.Length; i++) { var trimmedLine = allLines[i].Trim(); if (trimmedLine.Equals("Tango N$10 Voucher Benefit,10", StringComparison.OrdinalIgnoreCase)) { startDataIndex = i + 1; break; } } // 没找到目标行的情况提示用户 if (startDataIndex == -1) { MessageBox.Show("未找到指定的起始行,请检查CSV文件内容!"); return; } // 创建DataTable用于存储数据(兼容表头和数据行) DataTable csvDataTable = new DataTable(); // 假设目标行的下一行是表头,先添加列 string headerLine = allLines[startDataIndex].Trim(); string[] columnHeaders = headerLine.Split(','); foreach (string header in columnHeaders) { csvDataTable.Columns.Add(header.Trim()); } // 遍历读取后续所有数据行 for (int i = startDataIndex + 1; i < allLines.Length; i++) { string currentLine = allLines[i].Trim(); // 跳过空行避免报错 if (string.IsNullOrWhiteSpace(currentLine)) continue; string[] rowData = currentLine.Split(','); // 确保数据列数和表头一致,防止插入错误 if (rowData.Length == csvDataTable.Columns.Count) { csvDataTable.Rows.Add(rowData); } } // 将DataTable绑定到DataGridView dataGridView1.DataSource = csvDataTable; } catch (Exception ex) { MessageBox.Show($"读取CSV文件时出错:{ex.Message}"); }
注意事项:
- 如果你的CSV没有表头行,可以手动创建DataTable列,比如
csvDataTable.Columns.Add("手机号");这样的方式,替换掉读取表头的代码。 - 如果CSV中存在带逗号的字段(比如用引号包裹的内容),直接用
Split(',')会出错,这种情况推荐使用专门的CSV解析库CsvHelper(NuGet可以安装),处理复杂格式更可靠。
2. 将DataGridView中的数据保存到数据库
这里以SQL Server为例,用SqlBulkCopy实现批量插入,效率比逐行插入高很多:
private void SaveDataToDatabase(DataTable dataTable) { // 替换成你的数据库连接字符串 string connString = "Server=你的服务器地址;Database=目标数据库名;User Id=用户名;Password=密码;"; using (SqlConnection connection = new SqlConnection(connString)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { // 指定数据库中的目标表名 bulkCopy.DestinationTableName = "你的数据库表名"; // 映射DataTable列和数据库表的列(如果列名完全一致,这个循环可以省略) foreach (DataColumn column in dataTable.Columns) { bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName); } try { bulkCopy.WriteToServer(dataTable); MessageBox.Show("数据成功保存到数据库!"); } catch (Exception ex) { MessageBox.Show($"保存数据时出错:{ex.Message}"); } } } }
调用方式:
在绑定完DataGridView之后,直接调用这个方法即可:
SaveDataToDatabase((DataTable)dataGridView1.DataSource);
内容的提问来源于stack exchange,提问作者PearlP
相关产品推荐
相关产品推荐

