C#中OleDbCommand.ExecuteNonQuery()删除数据时报错求助
Access数据库删除操作报错问题排查与解决
我编写的C#程序向Access数据库插入数据时运行正常,但执行删除操作时,调试阶段在cmd.ExecuteNonQuery()代码行出现错误。
正常运行的插入代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.OleDb; namespace _01_AccessTestDB { public partial class frmUser : Form { public frmUser() { InitializeComponent(); } OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TestDB.accdb"); OleDbCommand cmd = new OleDbCommand(); void display() { DataSet ds = new DataSet(); OleDbDataAdapter adp = new OleDbDataAdapter(); cmd.CommandType = CommandType.Text; adp.SelectCommand=new OleDbCommand(); adp.SelectCommand.Connection= con; adp.SelectCommand.CommandText="select * from TBLUser"; adp.Fill(ds, "TBLUser"); dgvUser.DataSource=ds; dgvUser.DataMember=("TBLUser"); dgvUser.Columns[0].HeaderText="کد"; dgvUser.Columns[1].HeaderText="نام کاربری"; dgvUser.Columns[2].HeaderText="کلمه عبور"; } private void frmUser_Load(object sender, EventArgs e) { display(); } private void btnSave_Click(object sender, EventArgs e) { cmd.Parameters.Clear(); cmd.Connection = con; con.Open(); cmd.CommandText="insert into TBLUser(ID,UserN,Pass)values(@a,@b,@c)"; cmd.Parameters.AddWithValue("@a", txtCode.Text); cmd.Parameters.AddWithValue("@b", txtUser.Text); cmd.Parameters.AddWithValue("@c", txtPass.Text); cmd.ExecuteNonQuery(); con.Close(); string message, title; title="تعریف کاربران"; message="اطلاعات جدید با موفقیت ثبت گردید"; MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Information); txtCode.Clear(); txtUser.Clear(); txtPass.Clear(); display(); }
出错的删除代码
private void btnDelet_Click(object sender, EventArgs e) { int h = Convert.ToInt32(dgvUser.SelectedCells[0].Value); cmd.Parameters.Clear(); cmd.Connection=con; cmd.CommandText="delet from TBLUser Where ID=@N"; cmd.Parameters.AddWithValue("@N", h); con.Open(); cmd.ExecuteNonQuery(); con.Close(); string message, title; title="تعریف کاربران"; message="اطلاعات حذف گردید"; MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Information); display(); } } }
问题分析与修正
- SQL语法错误:删除语句里的
delet是拼写错误,正确的关键字是DELETE,这是导致报错的直接原因。 - 全局命令对象复用风险:全局的
OleDbCommand对象可能残留之前的参数或命令状态,建议在每个数据库操作方法中创建局部命令对象,避免复用冲突。 - 数据库连接未正确释放:手动调用
con.Close()可能因异常导致连接未关闭,建议用using语句自动管理连接和命令的生命周期。 - 选中状态未校验:未判断用户是否选中了DataGridView的单元格,直接转换值可能引发空引用或格式转换错误。
修正后的删除方法代码
private void btnDelet_Click(object sender, EventArgs e) { // 校验是否选中有效单元格 if (dgvUser.SelectedCells.Count == 0 || dgvUser.SelectedCells[0].Value == DBNull.Value) { MessageBox.Show("请先选择要删除的记录", "تعریف کاربران", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } int h; // 校验值是否能转为整数 if (!int.TryParse(dgvUser.SelectedCells[0].Value.ToString(), out h)) { MessageBox.Show("选中的记录ID无效", "تعریف کاربران", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // 使用using自动管理连接和命令 string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TestDB.accdb"; using (OleDbConnection con = new OleDbConnection(connectionString)) { using (OleDbCommand cmd = new OleDbCommand()) { cmd.Connection = con; cmd.CommandText = "DELETE FROM TBLUser WHERE ID=@N"; cmd.Parameters.AddWithValue("@N", h); con.Open(); int affectedRows = cmd.ExecuteNonQuery(); if (affectedRows > 0) { MessageBox.Show("اطلاعات حذف گردید", "تعریف کاربران", MessageBoxButtons.OK, MessageBoxIcon.Information); display(); } else { MessageBox.Show("未找到要删除的记录", "تعریف کاربران", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } }
额外优化建议
- 将连接字符串配置到App.config文件中,便于后期修改。
- 在
display方法中同样使用using管理数据适配器和连接,避免资源泄漏。 - 插入操作也建议改为局部命令对象+using的写法,提升代码稳定性。
内容的提问来源于stack exchange,提问作者elshan777
相关产品推荐
相关产品推荐

