2016-04-28 9 views
0
private void Update_Button_Click(object sender, EventArgs e) 
    { 
     ////////////////////////////////////////// Update Data //////////////////////////////////////////////////////////////////////////////////// 
     string Query = "Update Contact_List set Id='" + Id_Box.Text + "' ,Name='" + Name_Box.Text + "' ,Adress1='" + Adress1_Box.Text + "',Adress2='" + Adress2_Box.Text + "' ,City='" + City_Box.Text + "' ,Province='" + Province_Box.Text + "' ,Postal_Code='" + Code_Box.Text + "' ,Phone='" + Phone_Box.Text + "' ,Email='" + Email_Box.Text + "' where id='" + Id_Box.Text + "' ;"; 
     SqlCeCommand cmd = new SqlCeCommand(Query, con); 
     SqlCeDataReader reader; 
     try 
     { 
      con.Open(); 
      reader = cmd.ExecuteReader(); 
      MessageBox.Show("Information Updated....."); 

      while (reader.Read()) 
      { 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     con.Close(); 

このコードは機能しますが、唯一の問題はtextBox内の同じIdでデータを編集することだけです。だから、私が人のIDを編集したいとき、新しいIDがデータベースにないので編集できません。編集できません。データベース内のデータを編集するときに「または」を追加する必要はありますか?

とにかくクエリに「or」があるとします。

Algrithm:クエリのid = id_box.Textまたは名前= name_box.Text

私はIDまたは名前

を変更することができるように
+7

SQLインジェクションALERT !!!危険!!! –

+1

ストアドプロシージャを使用 –

+0

最初に存在するかどうかをチェックして、そのロジックに応じて処理を実行するのはなぜですか?ヒント:Idで検索すると、レコードがあれば、更新する、そうでなければ追加する –

答えて

1

使用パラメータ化

は、あなたがすべきではありません文字列連結を使用してクエリを構築すると、SQLインジェクションのような不快感を招くだけでなく、クエリーやパラメータが誤って渡される可能性があります。

より安全なアプローチは、各値をパラメータとして渡すSQLパラメータ化を使用して、何も悪影響が及ばないようにすることです。

var query = "... WHERE Id = @Id OR Foo = @Bar"; 

または条件:

if(condition) 
{ 
    query += " OR Property = @Property"; 
} 
クエリを構築する場合に関しては

パラメータWHEREあなたのWHERE句に特定のプロパティを追加するには追加の追加

、あなたはとても明示的に行うことができます

一貫性があることを確認するだけで、Wに別のパラメータを追加する必要がありますHERE句を使用して、クエリを実行する前にパラメータに一致する値を追加します。

のように見えるかもしれません一緒に

これらの変化の一例をすべてを統合(簡略化のために省略大きくしたり、繰り返しセクションで)以下:

private void Update_Button_Click(object sender, EventArgs e) 
{ 
    // Build your connection 
    using(var connection = new SqlCeConnection("{your-connection-string}")) 
    { 
     // Build your query 
     var query = "UPDATE Contact_List SET ID = @Id, Name = @Name, Adress1 = @Adress1, Adress2 = @Adress2, City = @City, Province = @Province, Postal_Code = @Postal_Code, Phone = @Phone, Email = @Email WHERE ID = @Id"; 

     // If you want to append another OR statement for your WHERE clause, you could 
     // do so here 
     if(condition) 
     { 
      query += " OR Property = @Property"; 
     } 
     // Build your command to execute 
     using(var cmd = new SqlCeCommand(query,conn)) 
     { 
       conn.Open(); 
       // Add all of your parameters 
       cmd.Parameters.AddWithValue("@Id", Id_Box.Text); 
       cmd.Parameters.AddWithValue("@Name",Name_Box.Text); 

       // Tons of others omitted for brevity 

       // Check for your other WHERE condition property 
       if(condition) 
       { 
        // Add your parameter to match your clause 
        cmd.Parameters.AddWithValue("@Property","{your-value}"); 
       } 
       // Do your thing here 
       using(var reader = cmd.ExecuteReader()) 
       { 
        // Omitted for brevity 
       } 
     } 
    } 
} 
+0

これに加えて、SQLコードを独自のデータ抽象クラスに移動することをお勧めしますボタンイベントハンドラ – theMayer

+0

私はあなたと一緒にいます。特に頻繁に使用する必要がある場合(「複数箇所」と読んでください)。おそらく、コードサンプルをそのメソッドに "結び付けない"ようにするために、実際のイベントハンドラコードを完全に中止しておくべきです。 –

+0

はい、テーブルXが参照されている場所を見つけるためにコードを歩き回る必要はありません。 – theMayer