2012-06-17 76 views
1

我在我的程序中嘗試了準備好的語句,但沒有工作。在Mysql中使用C#編寫語句

評論部分是Prepared Statement部分。當我將其改爲正常陳述時,一切都是正確的。

有人能告訴我我錯過了什麼嗎?

非常感謝。

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    MySqlCommand cmd = MySqlConn.cmd; 
    //cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND admin_password=PASSWORD('@val2')", MySqlConn.conn); 
    //cmd.Prepare(); 
    //cmd.Parameters.AddWithValue("@val1", tboxUserName.Text); 
    //cmd.Parameters.AddWithValue("@val2", tboxPassword.Text); 
    cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='"+tboxUserName.Text+"' AND admin_password=PASSWORD('"+tboxPassword.Text+"')", MySqlConn.conn); 

    MySqlDataReader res = cmd.ExecuteReader(); 
    if (!res.HasRows) { MessageBox.Show("Error! "); res.Close(); return; } 
    else 
    { 
     //do something 
    } 
    res.Close(); 
} 
+2

什麼不正確?是否顯示錯誤? –

回答

4

嘗試從查詢中刪除',並添加參數後使用Prepare

cmd = new MySqlCommand("SELECT * FROM admin WHERE [email protected] AND admin_password=PASSWORD(@val2)", MySqlConn.conn); 
cmd.Parameters.AddWithValue("@val1", tboxUserName.Text); 
cmd.Parameters.AddWithValue("@val2", tboxPassword.Text); 
cmd.Prepare(); 
+0

謝謝,你救了我的一天 – user840866

1

您的解決方案几乎是正確的原樣。然而,由於這是一個登錄過程,因此也是一個安全導向的任務,我還想提出一些建議。

首先考慮讓你的按鈕事件處理程序如下所示:

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    if (Login(tboxUserName.Text, tboxPassword.Text)) 
    { 
     // Log in was successful, do something... 
    } 
    else 
    { 
     // Log in was NOT successful, inform the user... 
    } 
} 

這將使應用程序更容易維護和可讀性。然後宣佈了一個名爲Login()函數來執行繁重:

private bool Login(string username, string password) 
{ 
    try 
    { 
     MySqlCommand cmd = MySqlConn.cmd; 
     cmd = new MySqlCommand(
      "SELECT count(*) FROM admin " + 
      "WHERE [email protected] " + 
      "AND admin_password=PASSWORD(@passwd)", 
      MySqlConn.conn); 
     cmd.Prepare(); 
     cmd.Parameters.AddWithValue("@username", username); 
     cmd.Parameters.AddWithValue("@passwd", password); 
     int result = (int)cmd.ExecuteReader(); 

     // Returns true when username and password match: 
     return (result > 0); 
    } 
    catch (Exception e) 
    { 
     // Optional: log exception details 

     // Deny log in if an error has occurred: 
     return false; 
    } 
} 

在這裏你會發現幾件事情。首先,引號已從原始查詢字符串中刪除,這些字符串阻止了命名參​​數正常工作。此外,查詢返回一個count()函數結果,而不是嘗試創建包含管理員用戶名和密碼的結果集。最後,該方法被封裝在一個try-catch塊中,這樣如果發生錯誤,該方法返回false,登錄被拒絕。爲了便於閱讀,我還將查詢分解爲串聯字符串。