2011-04-06 9 views
0

J'ai utilisé les tables d'utilisateur standard configurées par ASP.net et je souhaite pouvoir supprimer des utilisateurs. Pour ce faire, je dois d'abord supprimer l'ID utilisateur d'une table appelée appartenances, puis supprimer l'utilisateur. Pour ce faire, j'ai 2 zones de texte en configuration un pour l'utilisateur et l'autre pour le nom d'utilisateur.Requête de base de données SQL Server

Toute idée d'une déclaration T-SQL qui supprime l'ID utilisateur d'adhésion d'abord, puis passer à le nom d'utilisateur Supprimer c'est ma déclaration jusqu'à présent

else 
{ 
    try 
    { 
     connection.Open(); 
     cmd = new SqlCommand("DELETE from Membershio 
          WHERE UserId ='" + deleteuserIDbox.Text + "'", connection); 
     cmd = new SqlCommand("DELETE from Users WHERE UserName ='" + deleteuserbox.Text + "'", connection); 
     cmd.ExecuteNonQuery(); 
     update.Text = "Your data has been removed"; 
    } 
    catch 
    { 
     update.Text = "Your data has not been deleted"; 
    } 
} 

Les deux tables sont liées par conséquent, je dois supprimer l'ID utilisateur d'abord, puis le nom d'utilisateur

toute aide grandement appricated

+2

La première chose que je remarque est que vous utilisez la concaténation de chaînes dans vos instructions sql. Vous voudrez utiliser Bind Variables: http://www.richquackenbush.com/2011/02/bind-variables.html pour plusieurs raisons. Ensuite, acceptez quelques réponses que vous fainéez! – RQDQ

+2

Obligatoire [référence XKCD] (http://xkcd.com/327/). – SWeko

+0

Si vous postez du code, des échantillons XML ou des données, ** mettez en surbrillance ces lignes dans l'éditeur de texte et cliquez sur le bouton "exemples de code" dans la barre d'outils de l'éditeur pour les mettre en surbrillance! –

Répondre

2

Si vous comprenez bien, votre méthode de saisie a de sérieux problèmes.

Par exemple,

UserID UserName 
1  testUser 
2  testUser2 

Avec la logique dans votre application; Je peux entrer "1" dans deleteuserIDbox et "testUser2" dans deleteuserbox qui à son tour supprimer userID 1 mais pas nom d'utilisateur "testUser".

Si vous ne l'avez pas déjà fait, vous devez associer ces deux tables à l'aide de la clé étrangère sur l'ID utilisateur. Le lien est donc conservé avec le champ UserID.

Un autre problème est que vous exécutez directement la requête avec l'entrée de l'utilisateur, permettant ainsi la possibilité d'injection SQL. À propos de votre requête, vous pouvez mettre "cmd.ExecuteNonQuery();" entre vos deux déclarations cmd.

1

pour utiliser votre code actuel, vous devez exécuter la première requête, puis définissez la CommandText pour la deuxième requête et exécuter que.

using (SqlCommand cmd = connection.CreateCommand()) 
    { 
     cmd.CommandText = "DELETE FROM Membership WHERE UserID = @UserID"; 

     cmd.Parameters.AddWithValue("@UserID", deleteuserIDbox.Text); 

     connection.Open(); 

     cmd.ExecuteNonQuery(); 

     cmd.Paramters.Clear(); 

     cmd.CommandText = "DELETE from Users WHERE UserName = @UserName"; 

     cmd.Parameters.AddWithValue("@UserName", deleteuserbox.Text); 

     cmd.ExecuteNonQuery(); 
    } 

Une autre option consiste à utiliser une procédure stockée qui vous permettrait d'exécuter les deux requêtes ensemble.

Une autre option consiste à effectuer des suppressions en cascade. Voici a link sur la façon d'accomplir cela. En dernier, vous vous ouvrez jusqu'à SQL Injection. Vous ne devez JAMAIS prendre d'entrée d'un utilisateur et concaténer ces données dans une instruction SQL. Vous devez soit utiliser une procédure stockée ou une requête paramétrée (comme je l'ai utilisé ci-dessus).

0

Vous n'êtes pas exécuter la première commande:

connection.Open(); 

cmd = new SqlCommand("DELETE from Membershio 
     WHERE UserId ='" + 
     deleteuserIDbox.Text + "'", connection); 

cmd.ExecuteNonQuery(); 

cmd = new SqlCommand("DELETE from Users WHERE 
     UserName ='" + deleteuserbox.Text + 
     "'", connection); 

cmd.ExecuteNonQuery(); 

En outre, ces commandes doivent être exécutées dans une transaction.

0

Un peu en retard mais j'ai seulement remarqué votre question aujourd'hui. En faisant cela sur la base de données, vous contournez toutes les bonnes choses! Vous devez le faire en C# en appelant l'adhésion :: DeleteUser Méthode

http://msdn.microsoft.com/en-us/library/5xxz7y3a.aspx

Vous ne devriez pas jouer avec les éléments internes du système d'adhésion à tous.

Questions connexes