如何删除datagridview上的选定行并且还反映到数据库?

时间:2013-02-17 22:57:38

标签: c# mysql datagridview

我正在使用C#Window Form,我创建了一个连接到mySQL数据库的表单,它显示了数据库列表,每个数据库的表列表以及每个表的表内容。

我在这里提出的问题:

  1. 在表格中选择了一个随机单元格(datagridview)并单击“删除”按钮后,我希望在数据库中删除该行(对应于所选单元格)。

  2. 我还需要刷新和更新datagridview表内容(该行已被删除)。 (如果我知道如何做第1部分,我认为我可以这样做)

  3. 所以我需要帮助解决问题1,其中一个我无法弄清楚的事情是我如何编写SQL语句以放入SQLadapter或SQLcommandbuilder或其他任何东西。我知道SQL语句应该是这样的:

    从(选定的表格)中删除(这是我坚持的部分)=>我不知道在这种情况下该放什么,如何得到它?

    非常感谢任何帮助和建议!

1 个答案:

答案 0 :(得分:1)

delete语句应考虑所有选定的表主键列和datagridview中的选定行。

如何获取主键列:

SELECT `COLUMN_NAME`
 FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'dbName')
  AND (`TABLE_NAME` = 'tableName')
  AND (`COLUMN_KEY` = 'PRI');

来源:A better way to get Primary Key columns

您的删除语句应如何:

DELETE FROM <TABLE> 
  WHERE <PRIMARY_KEY_COLUMN_1> = <ROW_VALUE_1>
    AND <PRIMARY_KEY_COLUMN_2> = <ROW_VALUE_2>

您可以看到,该表可以有多个唯一标识行的列。还有可能在另一个表上存在该行的引用,这将阻止您删除它。

看起来像这样:

List<string> primaryKeyColumns = GetPrimaryKeyColumns(SelectedDB, SelectedTable);
string deleteWhereClause = string.Empty;
foreach (string column in primaryKeyColumns)
{
    DataGridViewRow row = datagridview.CurrentCell.OwningRow;
    string value = row.Cells[column].Value.ToString();

    if (string.IsNullOrEmpty(deleteWhereClause))
    {
        deleteWhereClause = string.Concat(column, "=", value);
    }
    else 
    {

        deleteWhereClause += string.Concat(" AND ", column, "=", value);
    }
}
string deleteStatement = string.Format("DELETE FROM {0} WHERE {1}", SelectedTable, deleteWhereClause);

方法GetPrimaryKeyColumns使用我发布的select语句返回所选表的所有主键列的名称。 您还必须处理其他类型的列,例如日期和字符串,但这基本上就是您将拥有的。