没有从数据库中删除数据

本文关键字:删除 数据 数据库 | 更新日期: 2023-09-27 18:29:23

在windows桌面应用程序窗体中,我使用此代码从datagridview和数据库中删除数据,我在dataridview中选中了一个复选框列,如果我单击checkbox行,则此时会从datagridview中删除,但不会从数据库中删除,因此当我重新加载窗体时,我可以再次看到该行,哪里出错了?

public partial class EditEngClgList : Form
    {        
        private OleDbConnection acccon = null;
        private OleDbDataAdapter da = null;
        private DataTable dt = null;
        private BindingSource bs = null;
        private OleDbCommandBuilder cmdb = null;

        public EditEngClgList()
        {
            InitializeComponent();
            try
            {
                acccon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb");
                acccon.Open();
            }
            catch (Exception err)
            {
                MessageBox.Show("Error:" + err);
            }
            string sql = "Select * From EngColeges order by EngClgID";
            da = new OleDbDataAdapter(sql, acccon);
            cmdb = new OleDbCommandBuilder(da);
            dt = new DataTable();
            da.Fill(dt);
            bs = new BindingSource();
            bs.DataSource = dt;
            dataGridView1.DataSource = bs;
            dataGridView1.Columns[1].Visible = false;
            dataGridView1.Columns[2].HeaderText = "Engineering College Name";
            dataGridView1.Columns[3].HeaderText = "Adress";
            dataGridView1.Columns[4].HeaderText = "Entrance Type";
            dataGridView1.Columns[2].Width = 400;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            List<int> checkedclg = new List<int>();
            DataRow dr;
            List<int> checkedclgid = new List<int>();
            for (int i = 0; i <= dataGridView1.RowCount - 1; i++)
            {
                if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["Delete"].Value) == true)
                {
                    checkedclg.Add(i);
                    checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 
                }
            }
            foreach (int k in checkedclg)
            {
                dr = dt.Rows[k];               
                dt.Rows[k].Delete();
                foreach (int j in checkedclgid)
                {
                    OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM EngColeges WHERE EngClgID = @clgID", acccon);
                    oleDbCommand.Parameters.Add("@clgID", OleDbType.Integer).Value = j;
                    oleDbCommand.Prepare();
                    oleDbCommand.ExecuteNonQuery();
                }
            }
        }

没有从数据库中删除数据

if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["Delete"].Value) == true)
{
    checkedclg.Add(i);
    checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value));
}

似乎向Convert.ToInt16传递了错误的单元格值?它使用的是"已删除"列,而不是您的ID列。

此外,您还可以使用where in子句删除一条sql语句中的所有行,例如:DELETE FROM table WHERE id IN (1, 2, 3, 4)

指示像这个一样存储Delete的值

checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 

像这样存储primary key column的值可以正确地从数据库中删除数据还有

checkedclgid.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells["EngClgID"].Value));

您必须更改此行:

checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value));

到以下位置:

checkedclgid.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells["CellInTheInvisible‌​Column"].Value));

因为您将布尔类型转换为Int16,然后在查询中使用它来检查相关表中的ID。

OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM EngColeges WHERE EngClgID = @clgID", acccon);

所以,必须存储要删除的行的ID。

我认为首先要删除该行,然后尝试将其从数据库中删除。首先从数据库中删除该行,然后再次调用该表的select查询。

您现在所拥有的只是一个command。您需要OleDbDataAdapter,并将command传递给它:

...
da = new OleDbDataAdapter(sql, acccon);
da.DeleteCommand = oleDbCommand;

更多信息:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.deletecommand.aspx

只需替换这两行:

oleDbCommand.Prepare();
oleDbCommand.ExecuteNonQuery();

带有:

da.DeleteCommand = oleDbCommand;

参考文献:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.deletecommand.aspx