0

私はC#ウィンドウフォームを使用しています。mySQLデータベースに接続するフォームを作成しました。このフォームには、データベースのリスト、各データベースのテーブルのリスト、および各テーブルのテーブルの内容が表示されます。

私がここに持っている質問:

  1. テーブル(datagridview)でランダムなセルを選択し、[削除]ボタンをクリックした後、その行(選択したセルに対応)をデータベースから削除します。

  2. また、datagridviewテーブルのコンテンツも更新および更新される必要があります(その行は削除されています)。(このパートは、パート1のやり方を知っていればできると思います)

ですから、質問1について助けが必要です。私が理解できないことの1つは、SQLadapterやSQLcommandbuilderなどに配置するSQLステートメントをどのように記述できるかということです。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は、投稿した select ステートメントを使用して、選択したテーブルのすべての主キー列の名前を返します。日付や文字列など、他のタイプの列も処理する必要がありますが、基本的にはこれで済みます。

于 2013-02-17T23:28:49.033 に答える