You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:49