C# WinForm列表框CSV数据转MS SQL数据库表的实现方法咨询
解决C# WinForm列表框数据导入SQL数据库的问题
嘿,我来帮你搞定这个问题!首先得明确核心前提:三个列表框的每一行应该是一组对应的数据——比如ListBox1的第i行CSV内容,要对应ListBox2的第i行药品项和ListBox3的第i行数量项,这是数据能正确匹配入库的基础。接下来咱们一步步实现:
1. 先确认数据库表结构
假设你的SQL表名为PatientMedications,需要包含这些列:
Name(nvarchar, 存储CSV里的姓名)Age(int, 存储CSV里的年龄)Sex(nvarchar, 存储CSV里的性别)IdNumber(nvarchar, 存储CSV里的身份证/编号)Medication(nvarchar, 存储ListBox2的药品项)Quantity(int, 存储ListBox3的数量)
如果还没建表,可以用这个SQL语句创建:
CREATE TABLE PatientMedications ( Id INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(50) NOT NULL, Age INT, Sex NVARCHAR(10), IdNumber NVARCHAR(20), Medication NVARCHAR(100) NOT NULL, Quantity INT NOT NULL );
2. 编写WinForm导入逻辑(核心代码)
在你的WinForm里添加一个“导入数据库”按钮,然后在按钮的点击事件里写以下代码:
第一步:校验数据行数匹配
先确保三个列表框的行数一致,避免数据错位:
if (listBox1.Items.Count != listBox2.Items.Count || listBox1.Items.Count != listBox3.Items.Count) { MessageBox.Show("三个列表框的数据行数不匹配,请检查后重试!"); return; }
第二步:数据库连接与数据插入
这里用参数化查询避免SQL注入,同时处理CSV解析和数据类型转换的异常:
// 替换成你的SQL数据库连接字符串 string connectionString = "Data Source=你的服务器名;Initial Catalog=你的数据库名;Integrated Security=True;"; try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 参数化插入语句,安全又可靠 string insertSql = @"INSERT INTO PatientMedications (Name, Age, Sex, IdNumber, Medication, Quantity) VALUES (@Name, @Age, @Sex, @IdNumber, @Medication, @Quantity)"; for (int i = 0; i < listBox1.Items.Count; i++) { // 1. 解析ListBox1的CSV行 string csvLine = listBox1.Items[i].ToString().Trim(); string[] csvParts; // 用TextFieldParser处理复杂CSV(比如字段含逗号、引号的情况) using (TextFieldParser parser = new TextFieldParser(new StringReader(csvLine))) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); csvParts = parser.ReadFields(); } // 校验CSV字段数量是否符合预期(4个字段:name,age,sex,id) if (csvParts == null || csvParts.Length != 4) { MessageBox.Show($"第{i+1}行CSV格式错误,已跳过该行!"); continue; } // 2. 提取并转换CSV字段 string name = csvParts[0].Trim(); if (!int.TryParse(csvParts[1].Trim(), out int age)) { MessageBox.Show($"第{i+1}行年龄格式错误,已跳过该行!"); continue; } string sex = csvParts[2].Trim(); string idNumber = csvParts[3].Trim(); // 3. 提取ListBox2和ListBox3的内容 string medication = listBox2.Items[i].ToString().Trim(); if (!int.TryParse(listBox3.Items[i].ToString().Trim(), out int quantity)) { MessageBox.Show($"第{i+1}行数量格式错误,已跳过该行!"); continue; } // 4. 执行插入 using (SqlCommand cmd = new SqlCommand(insertSql, conn)) { cmd.Parameters.AddWithValue("@Name", name); cmd.Parameters.AddWithValue("@Age", age); cmd.Parameters.AddWithValue("@Sex", sex); cmd.Parameters.AddWithValue("@IdNumber", idNumber); cmd.Parameters.AddWithValue("@Medication", medication); cmd.Parameters.AddWithValue("@Quantity", quantity); cmd.ExecuteNonQuery(); } } MessageBox.Show("数据导入完成!"); } } catch (Exception ex) { MessageBox.Show($"导入失败:{ex.Message}"); }
3. 优化建议:批量插入(适合大量数据)
如果你的列表框里有几百上千条数据,循环逐条插入效率会很低,推荐用SqlBulkCopy批量导入:
// 先构建DataTable存储所有数据 DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); dt.Columns.Add("Sex", typeof(string)); dt.Columns.Add("IdNumber", typeof(string)); dt.Columns.Add("Medication", typeof(string)); dt.Columns.Add("Quantity", typeof(int)); // 遍历列表框,把数据加到DataTable里 for (int i = 0; i < listBox1.Items.Count; i++) { // 这里的解析逻辑和上面一样,省略重复代码... // 解析完成后添加行 DataRow row = dt.NewRow(); row["Name"] = name; row["Age"] = age; row["Sex"] = sex; row["IdNumber"] = idNumber; row["Medication"] = medication; row["Quantity"] = quantity; dt.Rows.Add(row); } // 批量插入到数据库 using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "PatientMedications"; // 如果DataTable列名和数据库列名完全一致,可以省略列映射 bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); bulkCopy.ColumnMappings.Add("Sex", "Sex"); bulkCopy.ColumnMappings.Add("IdNumber", "IdNumber"); bulkCopy.ColumnMappings.Add("Medication", "Medication"); bulkCopy.ColumnMappings.Add("Quantity", "Quantity"); bulkCopy.WriteToServer(dt); } }
注意事项
- CSV解析:如果你的CSV字段包含逗号或双引号(比如
"Smith, John",30,M,12345),一定要用TextFieldParser而不是简单的Split(','),否则会拆分错误。 - 连接字符串:根据你的SQL配置修改,比如用SQL Server身份验证的话,要加上
User ID=你的账号;Password=你的密码;。 - 异常处理:代码里的
try-catch能帮你捕获数据库连接失败、权限不足等问题,方便排查错误。
内容的提问来源于stack exchange,提问作者David Dubois
相关产品推荐
相关产品推荐

