0

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

我在这里的问题:

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

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

所以我需要关于问题 1 的帮助,其中一件我想不通的事情是如何编写 SQL 语句以放入 SQLadapter 或 SQLcommandbuilder 或其他任何内容。我知道 SQL 语句应该是这样的:

从(选定的表)删除哪里(这是我卡在哪里的部分)=>我不知道在这种情况下要放什么,如何得到它?

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

4

1 回答 1

1

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

如何获取主键列:

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

资料来源:获取主键列的更好方法

您的删除语句应如下所示:

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使用我发布的选择语句返回所选表的所有主键列的名称。您还必须处理其他类型的列,例如日期和字符串,但这基本上就是您将拥有的。

于 2013-02-17T23:28:49.033 回答