none
讀checkboxlist 最後一個總是會錯誤 RRS feed

  • 問題

  • 您好

    問題是這樣的 我有三個checkboxlist 想要做成連動式的

    但是每次我只要勾選最後一個 checkbox都會發生錯誤...

    舉例來說

    假如我第一個checkboxlist 我勾選abc的話 就會連動帶出checklistbox2的選項 但是我勾選ccc的話

    卻會發生sql的錯誤 但假如ccc口 後面還有一個ddd口的話,勾選ccc口的時候卻可以帶出checklistbox2的選項

    同理 點選ddd口的話也是會發生錯誤...

    abc口  aaa口 ccc口

    以下是我的code 麻煩大大幫忙了

    謝 :)

       protected void area_SelectedIndexChanged(object sender, EventArgs e)
            {
                string strrighgs = "";
                for (int i = 0; i < fab.Items.Count - 1; i++)
                {
                    if (fab.Items[i].Selected == true)
                    {
                        strrighgs += "'" + this.fab.Items[i].Value + "',";
                    }
                }
                strrighgs = strrighgs.TrimEnd(',');
    
                string area1 = "";
                for (int i = 0; i < area.Items.Count - 1; i++)
                {
                    if (area.Items[i].Selected == true)
                    {
                        area1 += "'" + this.area.Items[i].Value + "',";
                    }
                }
                area1 = area1.TrimEnd(',');
                Label1.Text = strrighgs;
                Label2.Text = area1;
                try
                {
                    DataTable dt = new DataTable();
                    var cn = new SqlConnection();
                    cn.ConnectionString = XXX;
                    var cmd = new SqlCommand();
                    cmd.Connection = cn;
                    cmd.CommandText = "SELECT         Stage    FROM         AU_Abnormality_Stage WHERE   (FAB IN (" + strrighgs + "))   AND    (Area IN (" + area1 + "))  GROUP BY Stage";
                    cn.Open();
                    var dr = cmd.ExecuteReader();
                    stage.Items.Clear();
                    if (dr.HasRows)
                    {
    
                        while (dr.Read())
                        {
    
                            stage.Items.Add((dr["Stage"]).ToString());
                        }
                    }
                    cmd.Cancel();
                    dr.Close();
                    cn.Close();
                    cn.Dispose();
                }
                catch (Exception QQ)
                { Response.Write(QQ); }

    2012年7月26日 上午 10:08

解答

  • 題外話, 關於你的 SQL 語法字串

    "SELECT         Stage    FROM         AU_Abnormality_Stage WHERE   (FAB IN (" + strrighgs + "))   AND    (Area IN (" + area1 + "))  GROUP BY Stage"

    用這種方式串接變數是一種很不好的習慣, 會有 SQL Injection 的問題, 請使用參數式查詢語法.

    MSDN [命令和參數 (ADO.NET)]

    [論壇關於 SQL Injection]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 pu東 2012年7月27日 上午 06:55
    2012年7月26日 下午 02:51
    版主
  • 假如我第一個checkboxlist 我勾選abc的話 就會連動帶出checklistbox2的選項 但是我勾選ccc的話

    卻會發生sql的錯誤 但假如ccc口 後面還有一個ddd口的話,勾選ccc口的時候卻可以帶出checklistbox2的選項

    strrighgs += "'" + this.fab.Items[i].Value + "',";
    ...

    area1 += "'" + this.area.Items[i].Value + "',";
    ...

    因為沒有更多的程式和數據去了解,不是很能了解你所謂的奇怪點是甚麼,
    建議可以在這兩個地方下中斷點,去觀察一下當你所謂的勾選 ccc後,
    strrighgs、area1,甚至是 this.fab.Items[i].Value  this.area.Items[i].Value 的數值變化

    然後逐步的方式執行,去看一下自動變數或是設定監看式的變數去觀察,
    你才能知道你說的奇怪點 "只要那個選項不是checklistbox的最後一個選項的話,就不會產生空值"  ,到底是為什麼

    • 已標示為解答 pu東 2012年7月27日 上午 06:55
    2012年7月27日 上午 05:47

所有回覆

  • 您好,是錯在那一行呢? 錯誤訊息是什麼呢? 可否告知一下呢? 謝謝!

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月26日 上午 10:38
  • 我跑出來的結果她是說sql語法錯誤 

    在某個")"

    我覺得很奇怪QQ

    2012年7月26日 上午 11:30
  • 您好,

    您查看一下 cmd.CommandText 的內容,應該就知道錯在那裡!

    有可能是 strrighgs 或 area1 的值為空字串。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月26日 下午 02:39
  • 題外話, 關於你的 SQL 語法字串

    "SELECT         Stage    FROM         AU_Abnormality_Stage WHERE   (FAB IN (" + strrighgs + "))   AND    (Area IN (" + area1 + "))  GROUP BY Stage"

    用這種方式串接變數是一種很不好的習慣, 會有 SQL Injection 的問題, 請使用參數式查詢語法.

    MSDN [命令和參數 (ADO.NET)]

    [論壇關於 SQL Injection]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 pu東 2012年7月27日 上午 06:55
    2012年7月26日 下午 02:51
    版主
  • TO  亂馬大

    好像真的是空值的問題,但是奇怪的是,只要那個選項不是checklistbox的最後一個選項的話,就不會產生空值

    這就是我覺得疑惑的地方...

    TO Bill大

    謝謝您的指導

    小弟是初學者,想說用直覺一點的方式來寫

    原來還有這等學問

    謝謝 :)

    2012年7月27日 上午 03:28
  • 假如我第一個checkboxlist 我勾選abc的話 就會連動帶出checklistbox2的選項 但是我勾選ccc的話

    卻會發生sql的錯誤 但假如ccc口 後面還有一個ddd口的話,勾選ccc口的時候卻可以帶出checklistbox2的選項

    strrighgs += "'" + this.fab.Items[i].Value + "',";
    ...

    area1 += "'" + this.area.Items[i].Value + "',";
    ...

    因為沒有更多的程式和數據去了解,不是很能了解你所謂的奇怪點是甚麼,
    建議可以在這兩個地方下中斷點,去觀察一下當你所謂的勾選 ccc後,
    strrighgs、area1,甚至是 this.fab.Items[i].Value  this.area.Items[i].Value 的數值變化

    然後逐步的方式執行,去看一下自動變數或是設定監看式的變數去觀察,
    你才能知道你說的奇怪點 "只要那個選項不是checklistbox的最後一個選項的話,就不會產生空值"  ,到底是為什麼

    • 已標示為解答 pu東 2012年7月27日 上午 06:55
    2012年7月27日 上午 05:47
  • 小弟是初學者,想說用直覺一點的方式來寫

    原來還有這等學問

    事實上, 剛開始你會覺得用 Parameters 很麻煩, 不過用 Parameters 是有很多好處的

    (1) 避免 SQL Injection , 這是最重要的

    (2) 參數型別檢查會比較容易

    (3) 當你的 SQL Statement 很長, 然後雜著一堆條件時, 用串接的會變得非常難閱讀, 而且光要算對應幾個 ' 或 # 就會昏頭了.

    從剛開始就養成正確的習慣對自己會比較好


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月27日 上午 07:44
    版主
  • SQL-Injection 的問題就不談了

    針對你的問題:

    你的兩個for-loop 都少跑最後一個 

      for (int i = 0; i < fab.Items.Count - 1; i++)
      for (int i = 0; i < area.Items.Count - 1; i++)
    

    應該是:

      for (int i = 0; i < fab.Items.Count; i++)
      for (int i = 0; i < area.Items.Count; i++)
    



    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2012年7月29日 下午 01:32