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条件改成
WHEREid= @exactId,参数直接传入textBox1的输入值即可 - 全局定义的数据库连接对象
con建议也在操作完成后做资源释放,长期使用避免出现连接池耗尽的问题
内容的提问来源于stack exchange,提问作者tuneKawaii UwU
相关产品推荐
相关产品推荐

