2016-11-18 215 views
0

不知道爲什麼下面的代碼給我一個例外。我試圖檢查一個用戶名是否存在於MySQL數據庫中,如果沒有,那麼我想創建一個用戶。如果我自己運行查詢,那麼它可以正常工作,但不能在一起。檢查用戶是否存在於MySQL數據庫中失敗

int valid = -1;    

    using (MySqlConnection cnn = new MySqlConnection(conString)) 
     { 
      cnn.Open(); 

      bool usernameExists = false; 

      string sql1 = String.Format("SELECT Username FROM Users WHERE Username = \"{0}\"", username); 
      MySqlCommand cmd1 = new MySqlCommand(sql1, cnn); 

      usernameExists = (int)cmd1.ExecuteScalar() > 0; 

      if (!usernameExists) 
      { 
       string sql = String.Format("INSERT INTO Users(Username, Password) VALUES(\"{0}\", \"{1}\")", username, password); 
       MySqlCommand cmd = new MySqlCommand(sql, cnn); 

       valid = cmd.ExecuteNonQuery(); 
      } 
     } 
    return valid; 
+0

你用調試器完成了代碼嗎? –

+0

失敗了,究竟是?你有例外嗎? – ADyson

+0

該代碼位於Web服務上,因此很難調試。 Visual Studio中的異常消息是'System.Reflection.TargetInvocationException' – mosdave

回答

0

我得到它的工作通過改變第一查詢:

MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn); 

MySqlCommand cmd1 = new MySqlCommand("SELECT COUNT(UserID) FROM Users WHERE Username = @username", cnn); 
int valid = int.Parse(cmd.ExecuteScalar().ToString()); 

感謝您的幫助。

0

首先,MySQL使用單引號。這意味着您的查詢將是:

string.format("SELECT Username FROM Users WHERE Username = '{0}' LIMIT 1", Username); 

但是,這是SQL注入非常脆弱。這裏有一個使用MySQL參數來防止它的代碼。

int valid = -1;    

using (MySqlConnection cnn = new MySqlConnection(conString)) 
    { 
     cnn.Open(); 

     bool usernameExists = false; 

     MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn); 
     cmd1.Parameters.AddWithValue("@username", username); 

     usernameExists = (int)cmd1.ExecuteScalar() > 0; 

     if (!usernameExists) 
     { 
      MySqlCommand cmd = new MySqlCommand("INSERT INTO Users(Username, Password) VALUES(@username, @password)", cnn); 
      cmd.Parameters.AddWithValue("@username", username); 
      cmd.Parameters.AddWithValue("@password", password); 

      valid = cmd.ExecuteNonQuery(); 
     } 
    } 
return valid; 

你能試試嗎?

+0

我得到同樣TargetInvocationException。每當我有這個錯誤之前,它通常是我的SQL中的語法錯誤,但正如我之前所說,每個查詢運行正常,如果我分別運行它們。 – mosdave

+0

你知道哪一行給出了這個錯誤嗎?這樣,也許我可以找出錯誤。很難通過多行修復錯誤。 –