You need to enable JavaScript to run this app. C#+MySQL 按ID从student_dt检索数据插入student_att的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

C#+MySQL 按ID从student_dt检索数据插入student_att的实现方法

跨表取数插入的代码修正方案

当前代码的核心问题是插入逻辑完全没有和student_dt的查询流程绑定:写的INSERT语句没有指定数据源,也没有执行写好的Query1查询语句,相当于执行了一个无意义的空插入操作,根本没有实现从student_dt取数再插入student_att的流程。
正确的实现不需要把匹配到的数据先读到C#内存再逐行插入,直接用MySQL原生的INSERT INTO ... SELECT语法在数据库端完成跨表匹配插入,性能更高、代码更简洁。

关键调整点

  • 把输入校验逻辑放到最前面,空值直接终止流程,不执行后续数据库操作
  • 用参数化查询替代原本的字符串拼接SQL,彻底规避SQL注入风险
  • 插入语句直接关联student_dt的查询结果,实现匹配数据从源表到目标表的直接流转
  • 增加异常捕获和连接释放逻辑,不管操作成功还是报错,都能保证数据库连接正常关闭,避免连接泄漏
  • 插入完成后再查询student_att的最新数据,刷新DataGridView的展示

修正后的完整代码

private void button1_Click(object sender, EventArgs e)
{
    // 输入校验放在最前
    if (string.IsNullOrWhiteSpace(textBox1.Text))
    {
        MessageBox.Show("Please provide all data");
        return;
    }

    try
    {
        con.Open();
        // 跨表插入核心语句:从student_dt取匹配的前缀ID数据,直接插入student_att
        string insertSql = @"
            INSERT INTO student_att (`id`, `nic`, `name`, `address`, `number`, `batch`)
            SELECT `id`, `nic`, `name`, `address`, `number`, `batch` 
            FROM student_dt 
            WHERE `id` LIKE @idPrefix";

        // 用using块自动释放命令资源
        using (var cmd = new MySqlCommand(insertSql, con))
        {
            // 参数化传值,避免字符串拼接风险
            cmd.Parameters.AddWithValue("@idPrefix", $"{textBox1.Text}%");
            int insertCount = cmd.ExecuteNonQuery();
            MessageBox.Show($"Data Inserted,共插入{insertCount}条匹配数据");
        }

        // 插入完成后刷新student_att的展示数据
        string queryAttSql = "SELECT * FROM student_att;";
        using (var queryCmd = new MySqlCommand(queryAttSql, con))
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter(queryCmd);
            DataTable dTable = new DataTable();
            adapter.Fill(dTable);
            dataGridView2.DataSource = dTable;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作失败:{ex.Message}");
    }
    finally
    {
        // 确保连接处于关闭状态,避免残留
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
    }
}

注意事项

  • 两个表的对应字段要保证类型、长度完全匹配,否则会触发类型转换、长度超限等插入报错
  • 如果需求是精确匹配输入的完整ID,不需要模糊匹配,可以把WHERE条件改成WHERE id = @exactId,参数直接传入textBox1的输入值即可
  • 全局定义的数据库连接对象con建议也在操作完成后做资源释放,长期使用避免出现连接池耗尽的问题

内容的提问来源于stack exchange,提问作者tuneKawaii UwU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 20:45:06