2009-07-18 24 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は、電子メールが(正規表現を使用して)入った.. [メール]テキストボックスに入力されたメールが有効とされる検証機能がありますマルチパート識別子「[email protected]は」

マルチパート識別子「[email protected]」は結合できませんでした:コントロールは7次のエラーが発生した行目に通過するときと..

上記関数に戻されます。

それは私がいない... [email protected]が検証テストに合格しましたが、問題は、SQL側ではラインに7

を発生し、列「メール」は、そのデータ型としてvarchar(50)を有することを意味しますあなたは、少なくともメールアドレスの周りに単一引用符を置く必要があり

答えて

6

私はSQLインジェクションと処分の匂いがします。

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(); 
    } 
} 

これらのディレクティブを使用すると、SqlConnectionとSqlCommandが正しく失敗したり正常に実行されても閉じられます。 SqlParametersは、あらゆる形のSQLインジェクションを防止します。

SqlCommandコンストラクタにconn引数を渡し、その後SqlCommandにSqlConnectionを渡してSqlCommandの接続プロパティを設定していますが、SqlCommandはすでに接続プロパティを設定しています。

+2

+1を使用するブロック。副作用として、この場合(外側のブロックにのみコードが存在しない場合)、outer usingブロックの中括弧を削除することができます。 –

9

....それが問題だと思う:

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

あなたはしかし、これは、のparamsを渡すのは良い方法ではありません

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

その後、あなたは、単一引用符を提供する必要があり、あなたはありません:より良い方法は、このように、パラメータ化クエリを使用することであろう

... SQLインジェクション攻撃のための大きく開いこれを残します同時にSQLインジェクション攻撃から保護します...

+0

thanx Mr.Arjan !! – knowledgehunter

関連する問題