2

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

                }
            }
        }
4

6 回答 6

1

Delete像这样 存储价值

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

存储这样的值primary key column会从数据库中正确删除数据

checkedclgid.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells["EngClgID"].Value));
于 2013-08-30T09:04:14.497 回答
1
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)

于 2013-08-29T07:04:44.313 回答
0

All you have right now is a command. You need your OleDbDataAdapter, and pass the command to it:

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

More Info: http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.deletecommand.aspx

于 2013-08-29T07:05:38.690 回答
0

我认为首先你正在删除该行,然后你试图从数据库中删除它。首先,您从数据库中删除该行,然后再次调用该表的选择查询。

于 2013-08-29T07:03:55.593 回答
0

只需替换这两行:

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

和:

da.DeleteCommand = oleDbCommand;

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

于 2013-08-29T07:19:11.923 回答
0

您必须更改此行:

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。

于 2013-08-30T09:11:12.650 回答