Comment supprimer une ligne avec des données avec sa ligne parente dans une autre table

Il y a deux tables [ UserData ] et [ HotelData ] Je les ai liées avec une key étrangère. qui est " Username " et je veux supprimer quel nom d'user est entré et supprimer ses données sur la 2ème table. Je ne sais pas comment écrire la command sql ou c #.

Une exception non gérée du type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll

Informations supplémentaires: L'instruction DELETE était en conflit avec la contrainte REFERENCE "FKHotelData". Le conflit s'est produit dans la database "E: \ GRADED UNIT DEV BLACKMARCH \ BLACKMARCH \ BIN \ DEBUG \ DATABASEBM.MDF", table "dbo.HotelData", colonne "Username".

La déclaration a été résiliée.

 private void btnDelete_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\Graded unit Dev\BlackMarch\BlackMarch\bin\Debug\DataBaseBM.mdf;Integrated Security=True;Connect Timeout=30"); ssortingng sqlStatement = "DELETE FROM UserData WHERE Username = @Username"; con.Open(); SqlCommand cmd = new SqlCommand(sqlStatement, con); cmd.Parameters.AddWithValue("@Username", txtUsernameUser.Text); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); con.Close(); } 

Il n'est pas nécessaire d'écrire du code pour supprimer des données de la table enfant lorsque vous supprimez un logging de la table UserData . Utilisez simplement le comportement de suppression Cascade . Cela signifie que si un logging de la table parent est supprimé, les loggings correspondants dans la table enfant seront automatiquement supprimés.

Faites les étapes suivantes:

  1. Ouvrez le concepteur de la table enfant et click Relations.
  2. Dans la window ouverte et dans le Concepteur de tables, développez INSERT et UPDATE Specification
  3. Modifier la règle Supprimer de Aucune action à Cascade

Comme l'image suivante:

entrez la description de l'image ici

L'instruction DELETE est en conflit avec la contrainte REFERENCE "FKHotelData"

Vous avez une contrainte et cela aide avec les performances, faites-vous une faveur et ajoutez une colonne IsDeleted avec une valeur par défaut de 0 ou pour autoriser des null, donc cela n'affecte rien.

Ensuite, modifiez vos requêtes SELECT pour avoir une clause WHERE qui inclut la condition

WHERE IsDeleted = 0

Le point ici est que c'est une affaire d'hôtel et ils voudront des mésortingques / rapports sur les réservations. À des fins médicales et de confidentialité, je pencherais vers la suppression des réponses en cascade. Pour ce scénario, il serait préférable de supprimer logiquement datatables au lieu de les supprimer physiquement .

Bien. Pour développer l'autre option qui n'est pas exactement idéale, mais devrait également être disponible. CASCADE est plus facile à utiliser.

Sans cela, votre meilleur pari est

 DELETE FROM HotelData WHERE Username = @Username 

Suivi par

 DELETE FROM UserData WHERE Username = @Username