2

テーブルから行を削除する必要があるアプリケーションがありますClient

public void Delete_Client(int _id_client)
        {
            Data.Connect();
            using (Data.connexion)
            {
                string s = "Delete From CLIENT where id_client = " + _id_client;
                SqlCommand command = new SqlCommand(s, Data.connexion);
                try
                {
                    command.ExecuteNonQuery();
                }
                catch { }
            }
        }

テーブルClientには、別のテーブルへの外部参照が含まれています。そのため、削除がカスケードでなければならないことを示す例外が表示されます。

では、これを行うためにコードを変更するにはどうすればよいですか (SQL サーバーを dbms として使用しています)。

4

1 に答える 1

1

IMO の使用は避けるべきですon delete cascade。理由は次のとおりです。

  1. 何が削除されるかを制御できなくなります
  2. 有効にするには、テーブル参照を変更する必要があります
  3. パラメーター化されたクエリを使用する (あらゆるアドバイスとして)

それでは、クエリを変更しましょう。ClientOrder間もなく削除されるクライアントへの外部キー参照を保持するテーブルを例として追加しました。まず、クライアントにリンクされているすべての注文を削除してから、クライアント自体を削除します。これは、テーブルにリンクされている他のすべてのテーブルでこのようになるはずClientです。

public void Delete_Client(int _id_client)
{
    Data.Connect();

    using (Data.connexion)
    {
        string query = "delete from ClientOrder where id_client = @clientId; delete From CLIENT where id_client = @clientid";

        SqlCommand command = new SqlCommand(query, Data.connexion);
        command.Parameters.AddWithValue("@clientId", _id_client);

        try
        {
            command.ExecuteNonQuery();
        }
        catch { } //silencing errors is wrong, if something goes wrong you should handle it 
    }
}

パラメータ化されたクエリには多くの利点があります。まず第一に、より安全です (SQL インジェクション攻撃を見てください)。2 番目のタイプは、フレームワークによって解決されます (特にDateTime、書式設定の場合に役立ちます)。

于 2013-06-19T13:05:36.260 に答える