削除ステートメントは、選択されたすべてのテーブルの主キー列と、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
は、投稿した select ステートメントを使用して、選択したテーブルのすべての主キー列の名前を返します。日付や文字列など、他のタイプの列も処理する必要がありますが、基本的にはこれで済みます。