2016-03-01 52 views
1

關於安全性,這是一個髒原型,因此密碼沒有哈希值。如果提交了錯誤的證書,程序將拋出錯誤

我正在測試一些c#MySQL代碼,並且當正確的證書已經發送到數據庫時,程序返回值1,這意味着正確。

但是,如果值是檢查不匹配的結果我得到異常:

型「System.FormatException」未處理的異常在SERVER.EXE發生 其他信息:輸入字符串的不一個正確的格式。

public int CheckLoginCredentials(String username,string password) 
    { 
     string query = "SELECT * from testTable.user WHERE username='" + username + "' and password='" + password + "'"; 
     int Count = -1; 

     //Open Connection 
     if (this.OpenConnection() == true) 
     { 
      //Create Mysql Command 
      MySqlCommand cmd = new MySqlCommand(query, connection); 

      //ExecuteScalar will return one value 
      try 
      { 
       Count = int.Parse(cmd.ExecuteScalar() + ""); 

      } 
      catch (Exception e) 
      { 

       throw e; 
      } 
      //close Connection 
      this.CloseConnection(); 

      return Count; 
     } 
     else 
     { 
      return Count; 
     } 
    } 

我試圖拋出異常,但它崩潰的服務器。我該如何優雅地解決問題?

回答

2

您必須在此場景中使用SELECT Count(*);

ExecuteScalar將執行查詢,並在查詢返回的結果集返回第一行的第一列 。其他 列或行將被忽略。

還有一個更常見的建議;使用參數化查詢來避免SqlInjection;所以命令定義如下:

 string query = "SELECT COUNT(*) from testTable.user WHERE [email protected] and [email protected]"; 
     MySqlCommand cmd = new MySqlCommand(query, connection); 
     cmd.Parameters.AddWithValue("@username", username); 
     cmd.Parameters.AddWithValue("@password", password); 

現在該命令已準備好執行。如MSDN建議ExecuteScalar()將返回我們需要轉換爲整數的object,但在這種情況下,count()將始終返回整數值(如果結果爲空,則爲0),因此cmd.ExecuteScalar()的輸出將爲boxed integer。所以查詢執行情況如下:

int Count = Convert.ToInt32(cmd.ExecuteScalar()); 
+0

此外,代碼改成這樣:'數=(Int32)已cmd.ExecuteScalar();' – Rob

+0

你並不需要'的ToString()'然後解析字符串..這是浪費工作。結果已經是一個盒裝的整數,你只需要像上面那樣強制轉換爲int :) – Rob

+0

@Rob:謝謝你提供的新信息。 –