2016-05-03 10 views
0

私は、ユーザーがカテゴリボタンをクリックして、関連するカテゴリの製品ボタンを表示できるようにするC#Windowsフォームアプリケーションを構築しています。しかし、何度も試してみましたが、もう一度エラーが発生します。 Image 1Image 2C#Windowsフォームでボタンの関連カテゴリを表示するには?

public void DisplayCategories() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT DISTINCT category FROM Products ORDER BY category ASC", con); 
     con.Open(); 
     try 
     { 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable(); 
      da.Fill(dt); 

      foreach (DataRow dr in dt.Rows) 
      { 
       Button b = new Button(); 
       b.Size = new Size(180,36); 
       b.BackColor = SystemColors.Control; 
       b.FlatStyle = FlatStyle.Flat; 
       b.UseVisualStyleBackColor = false; 
       b.Text = dr["category"].ToString(); 
       b.Click += new EventHandler(UpdateList); 
       flpCategory.Controls.Add(b); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error"); 
     } 
     con.Close(); 
    } 

    void UpdateList(object sender, EventArgs e) 
    { 
     Button b = (Button)sender; 
     SqlCommand subcmd = new SqlCommand("SELECT itemName FROM Products WHERE description = " + b.Text, con); 

     SqlDataAdapter subda = new SqlDataAdapter(subcmd); 
     DataTable subdt = new DataTable(); 
     subda.Fill(subdt); 

     foreach (DataRow subdr in subdt.Rows) 
     { 
      Button b2 = new Button(); 
      b2.Size = new Size(180, 50); 
      b2.BackColor = SystemColors.Control; 
      b2.FlatStyle = FlatStyle.Flat; 
      b2.UseVisualStyleBackColor = false; 
      b2.Text = subdr["itemName"].ToString(); 
      flpItems.Controls.Add(b2); 
     } 
    } 
+0

Bakeryという名前の列はありません。 SQLインジェクションと書式設定の問題を回避するには、パラメータを使用する必要があります。 – LarsTech

+0

私のデータベースにはすでにBakeryという名前の列があります。 http://i.stack.imgur.com/viT2g.png – Clement

+0

b.Textを引用符で囲まないと、クエリは列を見ていると考えます。したがって、常にパラメータを使用してください。ところで、あなたはBakeryという*カラム*を持っていません。あなたは* data *を持っています。 – LarsTech

答えて

1

あなたdescriptionフィールドのようなタイプのテキストフィールドを検索したい場合は、あなたは、単一引用符の間を検索するための値を配置する必要があります。このクエリを作成するための最良の方法は、パラメータ化アプローチを通じてあるので

SELECT itemName FROM Products WHERE description = 'Bakery' 

は、しかし、これは間違っているだろう

string cmdText = "SELECT itemName FROM Products WHERE description = @desc"; 
Button b = (Button)sender; 
SqlCommand subcmd = new SqlCommand(cmdText, con); 
subCmd.Parameters.Add("@desc", SqlDbType.NVarChar).Value = b.Text; 
SqlDataAdapter subda = new SqlDataAdapter(subcmd); 
DataTable subdt = new DataTable(); 
subda.Fill(subdt); 

パラメータ化クエリがthe Sql Injection hackを回避し、あなたの文字列値が単一が含まれているかどうかを確認する必要性を取り除きます見積もり。 (引用符を二重にしないで構文エラーが発生します)

+0

私はそれが仕事だとわかります。どうもありがとう。 :-) – Clement

+0

助けになるのはうれしいです。新しいユーザーであることをお勧めします。[回答の受け取り方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Steve

関連する問題