2009-07-18 6 views
1
if (validateEmailId(email)) 
{ 
    pictureBox5.Visible = true; 
    SqlConnection con = new SqlConnection("conection string"); 
    SqlCommand cmd2 = new SqlCommand("UPDATE sumant SET email=" + email + " WHERE code ='" + textBox2.Text + "' ", con); 
    cmd2.Connection = con; 
    cmd2.Connection.Open(); 
    cmd2.ExecuteNonQuery();//line 7 
    con.Close(); 
} 

validateEmailId est une fonction qui valide l'entrée e-mail (en utilisant une expression régulière) .. le courriel indiqué dans le champ « e-mail » est validé et est retourné à la fonction ci-dessus ..L'identificateur en plusieurs parties « [email protected] » ne peut être lié

Lorsque la commande passe à la ligne 7 erreur suivant est rencontré:

l'identificateur en plusieurs parties « [email protected] » ne peut être lié.

Cela signifie [email protected] a passé le test de validation, mais un problème est survenu dans la ligne 7.

À l'extrémité SQL, la colonne « e-mail » a varchar(50) comme type de données ... Je ne pense que c'est un problème ....

Répondre

6

Ouch, je sens l'injection SQL et le manque d'élimination. Essayez ceci:

using (SqlConnection con = new SqlConnection("conection string")) { 
    using (SqlCommand cmd2 = new SqlCommand("UPDATE sumant SET [email protected] WHERE code = @Code", con)) { 
     cmd2.Parameters.AddWithValue("@Email", email); 
     cmd2.Parameters.AddWithValue("@Code", textBox2.Text); 
     con.Open(); 
     cmd2.ExecuteNonQuery(); 
    } 
} 

Les directives à l'aide fermeront SqlConnection et SqlCommand, peu importe si elles échouent ou exécuter correctement. Les paramètres SqlParameters empêcheront toute forme d'injection SQL. Une autre remarque: vous passez l'argument conn au constructeur SqlCommand ET définissez la propriété de connexion de SqlCommand après que, passant SqlConnection à SqlCommand définit déjà la propriété de connexion.

+2

+1 pour le bloc utilisant. En remarque: vous pouvez supprimer les accolades pour le bloc utilisant extérieur dans ce cas (quand il n'y a pas de code qui réside uniquement dans le bloc externe). –

9

vous devriez au moins mettre des guillemets simples autour de l'adresse e-mail:

SqlCommand cmd2 = new SqlCommand("UPDATE sumant SET email='" + email + "' WHERE code ='" + textBox2.Text + "' ", con); 

Cependant, ce n'est pas une bonne façon de passer dans params, comme vous êtes laissant cette grande ouverte pour des attaques par injection SQL ...

Une meilleure façon serait d'utiliser une requête paramétrées, comme ceci:

SqlCommand cmd2 = new SqlCommand("UPDATE sumant SET [email protected] WHERE [email protected]", con); 
cmd2.Parameters.AddWithValue("@email", email); 
cmd2.Parameters.AddWithValue("@code", textBox2.Text); 

vous n'avez pas besoin de fournir les guillemets simples, et vous est en même temps la protection contre les attaques par injection SQL ...

+0

merci monsieurArjan !! – knowledgehunter

Questions connexes