DataGridView数据无法保存到SQL Server问题求助
问题排查与修复方案
1. 核心原因:LocalDB数据库文件路径导致操作副本
你的连接字符串使用了|DataDirectory|,在Visual Studio调试模式下,程序会自动将项目根目录的QLSV.mdf复制到bin/Debug或bin/Release目录中,你实际操作的是这个副本文件,而非你在Server Explorer中查看的项目根目录原文件,所以会出现提示成功但原数据库无数据的情况。
解决方法:
- 打开项目属性 → 生成 → 将“复制到输出目录”选项从“始终复制”改为“如果较新则复制”;
- 调试后可直接查看bin目录下的
QLSV.mdf,其中会包含你插入的数据; - 若需直接操作项目根目录的数据库文件,可改用绝对路径(不推荐,不利于项目移植)。
2. 代码冗余与语法错误修复
(1) 移除不必要的SqlDataAdapter使用
在Save和Delete方法中,你创建SqlDataAdapter仅用来赋值InsertCommand,完全可以直接通过SqlCommand执行语句,简化代码:
// Save_Click方法简化示例: string sql = $"insert into SINHVIEN(MSSV, HOTEN, CHUYENNGANH, GIOITINH, SOMON) values ('{textBox1.Text}', '{textBox2.Text}', '{comboBox1.Text}', '{sex}', '{countSubject}')"; SqlCommand sqlCommand = new SqlCommand(sql, cnn); sqlCommand.ExecuteNonQuery(); // 删除所有adapter相关代码
(2) 修正Delete语句的语法错误
若MSSV为字符串类型,原代码中where MSSV = {c}未加单引号,会导致SQL语法错误,修正如下:
sql = $"delete from SINHVIEN where MSSV = '{c}'";
(3) 优化数据库连接管理
不要在Form构造函数中提前打开/关闭连接,改用using块自动释放连接资源,避免连接泄漏:
private void Save_Click(object sender, EventArgs e) { using(SqlConnection cnn = new SqlConnection(connetionString)) { cnn.Open(); // 插入逻辑代码... // 无需手动调用Close,using块会自动释放连接 } }
3. 修复严重安全隐患:SQL注入风险
直接通过字符串拼接生成SQL语句,不仅会因特殊字符导致语法错误,还存在SQL注入攻击风险,必须改用参数化查询:
// 参数化插入示例: string sql = "insert into SINHVIEN(MSSV, HOTEN, CHUYENNGANH, GIOITINH, SOMON) values (@MSSV, @HOTEN, @CHUYENNGANH, @GIOITINH, @SOMON)"; SqlCommand sqlCommand = new SqlCommand(sql, cnn); sqlCommand.Parameters.AddWithValue("@MSSV", textBox1.Text); sqlCommand.Parameters.AddWithValue("@HOTEN", textBox2.Text); sqlCommand.Parameters.AddWithValue("@CHUYENNGANH", comboBox1.Text); sqlCommand.Parameters.AddWithValue("@GIOITINH", sex); sqlCommand.Parameters.AddWithValue("@SOMON", countSubject); sqlCommand.ExecuteNonQuery();
验证步骤
- 修复路径配置后重新运行程序,插入测试数据;
- 打开bin目录下的
QLSV.mdf,确认数据已正确保存; - 替换为参数化查询并使用using块优化代码,确保程序稳定性与安全性。
内容的提问来源于stack exchange,提问作者Nguyen Hoai
相关产品推荐
相关产品推荐

