none
查詢語法問題 RRS feed

  • 問題

  • 我在程式內直接寫搜尋的關鍵字

    可是執行後無法篩選

    再else if 那行 加入 dr.Read() 就會抓不到

    using (SqlConnection cn = new SqlConnection
                    (Properties.Settings.Default.BorrorSystemConnectionString))
                {
                    cn.Open();
                    string searchName = textBoxID.Text;
                    // SELECT敘述的查詢條件為姓名等於searchName
                    string selectCmd = "SELECT * FROM 登入資訊 WHERE 工號 = '" + searchName + "'AND 密碼 = '" + textBoxCode.Text + "'";
                    // 建立SqlCommand物件cmd
                    SqlCommand cmd = new SqlCommand(selectCmd, cn);
                    // 傳回查詢結果的SqlDataRadedr物件dr                
                    SqlDataReader dr = cmd.ExecuteReader();
                    if (dr.Read() && checkBox1.Checked == false)   // 若有該筆記錄則執行下面敘述
                    {
                        MessageBox.Show("登入成功");
                        groupBox.Visible = false;                  
                        labelret.Visible = true;
                        labelbor.Visible = true;
                        labelser.Visible = true;
                        labelman.Visible = false;
                        labelout.Show();
                        
                      
                    }
                    else if (checkBox1.Checked == true)
                    {
                        dr.Close();
                        string selectCmd2 = "SELECT * FROM 登入資訊 WHERE 身份 = 管理者 AND 工號 = '" + searchName + "'AND 密碼 = '" + textBoxCode.Text + "'";
                        SqlCommand cmd2 = new SqlCommand(selectCmd2, cn);
                        SqlDataReader dr2 = cmd.ExecuteReader();
                        if (dr2.Read())
                        {
                            MessageBox.Show("登入成功(管理者)");
                            labelman.Visible = true;
                            labelret.Visible = true;
                            labelbor.Visible = true;
                            labelser.Visible = true;  
                            groupBox.Visible = false;
                            labelout.Show();
                            textBox123.Text = "ok";
                        }
                        else
                        {
                            MessageBox.Show("登入失敗(管理者)");
                        }
    
                    }
                    else
                    {
                        if (
                         MessageBox.Show("查無此帳號或密碼,是否重新輸入?", "My Application",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                        == DialogResult.Yes)
                        {
                            return;
                        }
                        else
                        {
    
                            Application.Exit();
                        }
                    }

    2014年11月25日 上午 03:46

解答

  • 先把你的 SQL Injection 問題解決掉再說吧。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 XX阿忠XX 2014年11月25日 上午 05:44
    2014年11月25日 上午 04:02
    版主
  • string selectCmd2 = "SELECT * FROM 登入資訊 WHERE 身份 = 管理者 AND 工號 = '" + searchName + "'AND 密碼 = '" + textBoxCode.Text + "'";
                      

    哪本C#的書教你這樣寫 SQL Statement 的 ? 把他丟了吧.

    另外你的問題是:

     else if (checkBox1.Checked == true)
                   
    {
                        dr
    .Close();
    你都 close 了還能期待他繼續 Read 嗎 ?

    不要悶著頭寫程式, 要學怎麼從 C# 操作資料庫. 把以下 link 中所有相關的章節先讀一讀.

    ADO.NET


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

    • 已標示為解答 XX阿忠XX 2014年11月25日 上午 05:00
    2014年11月25日 上午 04:34
    版主
  • 下個中斷點或用 sql profile 工具看一下執行的回傳結果?

    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:04
  • 1. 資料表和欄位用中文命名並不恰當,請改正此習慣。

    2. DataReader 用完請記得關,否則很快的你就沒連線可用了。

    3. 請用逐步除錯來看你的 textBoxID.Text 和 textBoxCode.Text 有沒有東西。

    4. 請確認你的資料庫確實有你要找的東西。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:14
    版主
  • 1.把你的SQL Command拿去 sql server 查一下看看有沒有真的有資料存在

    2.檢查一下textBoxID 跟 textBoxCode的值,可以下中斷點監看


    微軟免費線上課程

    HTML5 & JavaScript程式開發實戰(MyBook)

    開發ASP.NET您要瞭解的基楚

    http://www.dotblogs.com.tw/ian (MyBlog)

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:40
  •                 string userlogin = "SELECT * FROM 登入資訊 WHERE 工號 = @machcode AND 密碼 = @secrcode ";
                    SqlCommand cmd = new SqlCommand(userlogin);             
                    cn.Open();
                    cmd.Parameters.AddWithValue("@machcode", textBoxID.Text);
                    cmd.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                    cmd.Connection = cn;
                    SqlDataReader dr = cmd.ExecuteReader();
                    //-------------                             
                    if (dr.Read() && checkBox1.Checked == false)
                    {
                        MessageBox.Show("歡迎,使用者");
                    }
                    else if (dr.Read() && checkBox1.Checked == true)
                    {
                       
                        //dr.Close();
                        string manlogin = "SELECT * FROM 登入資訊 WHERE  工號 = @machcode AND 密碼 = @secrcode AND 身份 = @who ";
                        SqlCommand con = new SqlCommand(manlogin);
                        con.Parameters.AddWithValue("@machcode", textBoxID.Text);
                        con.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                        con.Parameters.AddWithValue("@who", "管理者");
                        con.Connection = cn;                 
                        SqlDataReader dn = con.ExecuteReader();
                        if (dn.Read())

    這個程式碼根本邏輯就很奇怪, 你為什麼要從 "登入資訊" 這個 Table 讀取兩次 ?
    你把資料讀出來的時候, 不就會有那個 "辨認是不是管理者" 的欄位資料嗎 ?
    (1) 真的, 這是一個良心話, 不要悶著頭在 Visual Studio 上拼命寫 Code, 你自己把邏輯用中文寫在紙上, 反覆看看你的想法是不是正確. 邏輯有沒有走對, 是不是疊床架屋...
    (2) 當你的程式碼是一連串的 if 包在一起的時候, 最好拆成多個函式呼叫, 比較容易釐清邏輯.
    (3) 少用中文命名變數, 資料庫欄位等等..雖然號稱現在是 Unicode 的時代, 很難保會出現甚麼怪事, 而且如果是出在這種命名的問題, 可能會查到天荒地老都查不出來.

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

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 05:38
    版主

所有回覆

  • 先把你的 SQL Injection 問題解決掉再說吧。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 XX阿忠XX 2014年11月25日 上午 05:44
    2014年11月25日 上午 04:02
    版主
  • https://social.msdn.microsoft.com/Forums/zh-TW/f7a72d12-90a4-40cc-808a-625f1bdac72e/-sql-injection?forum=236

    sql injection 參考資料。


    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    2014年11月25日 上午 04:17
  • string selectCmd2 = "SELECT * FROM 登入資訊 WHERE 身份 = 管理者 AND 工號 = '" + searchName + "'AND 密碼 = '" + textBoxCode.Text + "'";
                      

    哪本C#的書教你這樣寫 SQL Statement 的 ? 把他丟了吧.

    另外你的問題是:

     else if (checkBox1.Checked == true)
                   
    {
                        dr
    .Close();
    你都 close 了還能期待他繼續 Read 嗎 ?

    不要悶著頭寫程式, 要學怎麼從 C# 操作資料庫. 把以下 link 中所有相關的章節先讀一讀.

    ADO.NET


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

    • 已標示為解答 XX阿忠XX 2014年11月25日 上午 05:00
    2014年11月25日 上午 04:34
    版主
  • 感謝各位前輩指點,我剛剛改寫了一下,可是問題依然在。

     using (SqlConnection cn = new SqlConnection
                 (Properties.Settings.Default.BorrorSystemConnectionString))
                using (SqlCommand com = cn.CreateCommand())
                {
    
                    string userlogin = "SELECT * FROM 登入資訊 WHERE 工號 = @machcode AND 密碼 = @secrcode ";
                    SqlCommand cmd = new SqlCommand(userlogin);              
                    cn.Open();
                    cmd.Parameters.AddWithValue("@machcode", textBoxID.Text);
                    cmd.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                    cmd.Connection = cn;
                    SqlDataReader dr = cmd.ExecuteReader();
                    //-------------                              
                    if (dr.Read() && checkBox1.Checked == false)
                    {
                        MessageBox.Show("歡迎,使用者");
                    }
                    else if (dr.Read() && checkBox1.Checked == true) 
                    {
                        
                        //dr.Close();
                        string manlogin = "SELECT * FROM 登入資訊 WHERE  工號 = @machcode AND 密碼 = @secrcode AND 身份 = @who ";
                        SqlCommand con = new SqlCommand(manlogin);
                        con.Parameters.AddWithValue("@machcode", textBoxID.Text);
                        con.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                        con.Parameters.AddWithValue("@who", "管理者");
                        con.Connection = cn;                  
                        SqlDataReader dn = con.ExecuteReader();
                        if (dn.Read())
                        {
                            MessageBox.Show("歡迎,管理者");
                        }
                        else 
                        {
                            MessageBox.Show("不歡迎,不是管理者");
                        }
                    }
                    else
                    {
                        MessageBox.Show("無此帳號,請重新輸入");
                    }
                   
                }

    2014年11月25日 上午 05:43
  • 下個中斷點或用 sql profile 工具看一下執行的回傳結果?

    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:04
  • 1. 資料表和欄位用中文命名並不恰當,請改正此習慣。

    2. DataReader 用完請記得關,否則很快的你就沒連線可用了。

    3. 請用逐步除錯來看你的 textBoxID.Text 和 textBoxCode.Text 有沒有東西。

    4. 請確認你的資料庫確實有你要找的東西。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:14
    版主
  • 1.把你的SQL Command拿去 sql server 查一下看看有沒有真的有資料存在

    2.檢查一下textBoxID 跟 textBoxCode的值,可以下中斷點監看


    微軟免費線上課程

    HTML5 & JavaScript程式開發實戰(MyBook)

    開發ASP.NET您要瞭解的基楚

    http://www.dotblogs.com.tw/ian (MyBlog)

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 03:40
  •                 string userlogin = "SELECT * FROM 登入資訊 WHERE 工號 = @machcode AND 密碼 = @secrcode ";
                    SqlCommand cmd = new SqlCommand(userlogin);             
                    cn.Open();
                    cmd.Parameters.AddWithValue("@machcode", textBoxID.Text);
                    cmd.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                    cmd.Connection = cn;
                    SqlDataReader dr = cmd.ExecuteReader();
                    //-------------                             
                    if (dr.Read() && checkBox1.Checked == false)
                    {
                        MessageBox.Show("歡迎,使用者");
                    }
                    else if (dr.Read() && checkBox1.Checked == true)
                    {
                       
                        //dr.Close();
                        string manlogin = "SELECT * FROM 登入資訊 WHERE  工號 = @machcode AND 密碼 = @secrcode AND 身份 = @who ";
                        SqlCommand con = new SqlCommand(manlogin);
                        con.Parameters.AddWithValue("@machcode", textBoxID.Text);
                        con.Parameters.AddWithValue("@secrcode", textBoxCode.Text);
                        con.Parameters.AddWithValue("@who", "管理者");
                        con.Connection = cn;                 
                        SqlDataReader dn = con.ExecuteReader();
                        if (dn.Read())

    這個程式碼根本邏輯就很奇怪, 你為什麼要從 "登入資訊" 這個 Table 讀取兩次 ?
    你把資料讀出來的時候, 不就會有那個 "辨認是不是管理者" 的欄位資料嗎 ?
    (1) 真的, 這是一個良心話, 不要悶著頭在 Visual Studio 上拼命寫 Code, 你自己把邏輯用中文寫在紙上, 反覆看看你的想法是不是正確. 邏輯有沒有走對, 是不是疊床架屋...
    (2) 當你的程式碼是一連串的 if 包在一起的時候, 最好拆成多個函式呼叫, 比較容易釐清邏輯.
    (3) 少用中文命名變數, 資料庫欄位等等..雖然號稱現在是 Unicode 的時代, 很難保會出現甚麼怪事, 而且如果是出在這種命名的問題, 可能會查到天荒地老都查不出來.

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

    • 已標示為解答 XX阿忠XX 2014年11月27日 上午 08:28
    2014年11月25日 下午 05:38
    版主