【问题标题】:Deleting selected row of datagrid from database?从数据库中删除选定的数据网格行?
【发布时间】:2016-03-23 10:49:09
【问题描述】:

我的表单中有一个DataGrid 和一个删除按钮。当我单击删除按钮时,它应该从我的 Access 数据库中删除选定的数据网格行。但它只是从数据网格而不是数据库中删除。当我再次加载表单时,删除的行仍然存在。这是我的删除按钮的代码:

con.Open();
OleDbCommand comnd = new OleDbCommand();
comnd.Connection = con;
string q = "delete  from customers";
comnd.CommandText = q;
comnd.ExecuteNonQuery();
MessageBox.Show("delete");

【问题讨论】:

  • 上面的代码可以工作,但它会从数据库中删除所有数据,但我只想删除我从 datagrid 中选择的行
  • 因此您必须将表单中的 ID 传递给 delete 方法。
  • 您不应该将某种 ID 传递给数据库,以便我们可以删除指定的行吗?这个sql查询删除了整个数据
  • 你的意思是我选择的那一行的id?
  • 如何从数据网格中获取 ID 并在 sql 命令中使用它?

标签: c# datagrid


【解决方案1】:

因此,您尝试使用以下查询从数据库中删除一行:

delete from customers

问题是这个查询没有指定哪一行应该受到它的影响。你要明白,你这里的DataGrid 和你的DataBase 是不一样的。

为了从数据库中删除特定的行,您还应该指定它是哪一行。例如,您可以告诉它删除具有特定 id 的行:

delete from customers where id = 7

上述查询将删除所有 id 为 7 的行。但这只是一种可能的方法。

为此,您实际上需要在您的表中使用id。以下代码来自 MSDN 源。它删除来自数据网格的具有特定 id 的条目:

int ID = (int) datagrid.DataKeys[(int) e.Item.ItemIndex];

string sql = "DELETE FROM PetTable WHERE ID=" + ID;
ExecuteNonQuery(sql);

如需了解更多信息,请read this

【讨论】:

  • Käsebrot!当我编写您的代码时,它会在数据键和项目上显示错误。错误是“DatagridView 不包含数据键和项的定义”
  • @RanaRashid 这是意料之中的。该代码不是您问题的解决方案,它是参考如何完成。因此,您还使用 DataGridView 而不是数据网格。另外,您必须在表格中添加 ID。请阅读我提供的文章。
  • 我读了那个兄弟,但是我如何生成这个数据网格事件。因为这个事件不存在 datagrid_DeleteCommand()
  • 事件是什么意思?
  • 只需将其放入您的删除按钮范围
【解决方案2】:

您需要遍历选定的行,删除所有这些行,如下所示

 foreach (DataGridViewRow row in datagrid1.SelectedRows)
        {
            //get key
            int rowId = Convert.ToInt32(row.Cells[indexWhereIdStored].Value);
            // your delete logic
        }

如果假设第一列是键,则只需要删除一个选定的行

if (datagrid1.SelectedRows.Count > 0)
{
     int selectedIndex = datagrid1.SelectedRows[0].Index;

     // gets the RowID from the first column in the grid
     int rowID = int.Parse(datagrid1[0, selectedIndex].Value.ToString());
     // you can create a parameter for the @RowID
     string sql = "DELETE FROM YourTable WHERE RowID = @RowID";

     // your code for deleting it from the database

     //  refreshing the DataGridView
}

【讨论】:

  • 那是假设他的 Id 存储在第一列吧?!
  • if (dataGridView1.SelectedRows.Count > 0 { int selectedIndex = dataGridView1.SelectedRows[0].Index; int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString()) ; con.Open(); OleDbCommand comnd = new OleDbCommand(); comnd.Connection = con; string q = "从 CustomerID=RowID 的客户中删除"; comnd.CommandText = q; comnd.ExecuteNonQuery(); MessageBox.Show( “删除”)}
  • 我从数据网格获取 ID 到文本框,然后尝试在这样的 sql 查询中使用它。但仍然无法正常工作。 string q = "从CustomerID='"+txtID.Text+"'"的客户中删除; comnd.CommandText = q;
【解决方案3】:

在您的 sql 查询中,您缺少用于指示要删除的客户 ID 的 WHERE 语句

【讨论】:

  • 这段代码也不起作用,,,, foreach (DataGridViewRow 中的行 dataGridView1.SelectedRows) { int rowId = Convert.ToInt32(row.Cells[0].Value); con.Open(); OleDbCommand 命令 = 新 OleDbCommand(); comnd.Connection = con; string q = "从 CustomerID=RowID 的客户中删除"; comnd.CommandText = q; comnd.ExecuteNonQuery(); MessageBox.Show("删除"); }
  • 你能尝试一下吗?请让我看看异常
  • 不产生异常。我的意思是按钮正在单击,但根本没有做任何事情
  • c# 区分大小写,将 RowID 更改为 rowId
  • 现在这个异常正在生成.. 标准表达式中的数据类型不匹配
【解决方案4】:

伙计们,我们做到了。我在 where 子句中使用名称而不是 Id 来处理数据类型异常。这是删除按钮的工作代码。 `

               `con.Open();
                OleDbCommand comnd = new OleDbCommand();
                comnd.Connection = con;
                string q = "delete  from customers where CustomerName='" 
                 + txtName.Text + "'";
                comnd.CommandText = q;
                comnd.ExecuteNonQuery();
                MessageBox.Show("delete");

【讨论】:

  • 问题在于,这将始终删除具有相同 CustomerName 的所有行。这就是为什么每个人都建议使用 ID 的原因。因为他们是独一无二的!!这可能有效,但不是一个好的解决方案,可能会引起一些麻烦。
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2014-11-05
  • 2017-12-05
  • 2012-06-06
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多