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

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();
    }
}
}

问题分析与修正

  1. SQL语法错误:删除语句里的delet是拼写错误,正确的关键字是DELETE,这是导致报错的直接原因。
  2. 全局命令对象复用风险:全局的OleDbCommand对象可能残留之前的参数或命令状态,建议在每个数据库操作方法中创建局部命令对象,避免复用冲突。
  3. 数据库连接未正确释放:手动调用con.Close()可能因异常导致连接未关闭,建议用using语句自动管理连接和命令的生命周期。
  4. 选中状态未校验:未判断用户是否选中了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:24:23