2014-10-22 238 views
0

我想通過MySQL(數據庫)登錄到我的程序。C#&MySQL - 總是返回0

string username = textBox1.Text.ToString(); 
int UserID = DB.runRead("SELECT id FROM users WHERE username='" + DB.Stripslash(username) + "'", null); 
if (UserID > 0) 
{ 
    String[] UserData = DB.runReadRow("SELECT id, username, password, salt, rank, verein FROM benutzer WHERE id=" + UserID.ToString()); 
    if(UserData[1].ToString().ToLower() == textBox2.Text.ToString().ToLower()) 
    { 
     // logged in 
     SetStatusText("logged in!! :)"); 
     SetProgressbarValue(100); 
     ButtonActivity(0, false); 
    } 
    else 
    { 
     // Password wrong 
     SetStatusText("wrong pw!!"); 
     SetProgressbarValue(50); 
    } 
} 
else 
{ 
    SetStatusText("unregistered!!"); 
    SetProgressbarValue(0); 
} 

我在其他一些項目上使用這種方法。一直工作正常,但這個時候,語句

if(UserID > 0) 

和它下面的代碼將無法運行,因爲UserID具有0值,我不知道爲什麼。當然還有在數據庫中的用戶:

screenshot of DB results showing 1 User row with id=1

我已經嘗試過使用其他數據庫(新創建),但錯誤停留,所以我覺得我做了一件在代碼中愚蠢的。如果有必要,我可以發佈工作代碼的代碼,但我沒有看到任何區別。

int UserID = DB.runRead("SELECT id FROM benutzer WHERE username='" + DB.Stripslash(Connection.Username) + "'", null); 
if (UserID > 0) 
{ 
    string[] UserData = DB.runReadRow("SELECT id, username, password, salt, online, nickname, rank, firstlogin, bantime, anticheat FROM users WHERE id=" + UserID.ToString()); 
    //Password = hashMD5(hashMD5(getBlock(3).ToLower()) + hashMD5(UserData[1])); 
    if (UserData[2].ToLower() == Password && UserData[9].ToString() == "1") 
    { 
     if (BanManager.isBlocked(UserID) == false /*&& RankManager.HasPermision(int.Parse(UserData[6]), "account.authorize")*/) 
     { 
      if (UserData[4].Equals("1")) 
      { 
       ReturnValue = LoginState.AlreadyLoggedIn; 
       Connection.send(new PACKET_SERVER_LIST(PACKET_SERVER_LIST.errorCodes.AlreadyLoggedIn)); 
       //Log.WriteLine("Connection from " + Connection.IPAddress + " logged succesfull in as " + UserData[5] + " but the user is already online."); 
       Log.WriteLine("- Login - A Connection was successfully approved"); 
       Log.WriteLine("- Login - IP Address: " + Connection.IPAddress + ","); 
       Log.WriteLine("- Login - Nickname: " + UserData[5] + ","); 
       Log.WriteLine("- Login - Status: The User is already logged in."); 
       Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine(new String('*', Console.WindowWidth)); Console.ForegroundColor = ConsoleColor.Gray; 
      } 

依此類推。怎麼了?

+2

格式化您的帖子時請格外小心 - 縮進會將大部分代碼從屏幕上移開以開始。如果你正在嘗試回答,請使用預覽來檢查帖子是否看起來如何。 – 2014-10-22 10:15:31

+2

接下來,*停止構建像那樣的SQL *。使用參數化的SQL。 *總是*。它看起來像你以純文本存儲你的密碼......這是另一個大問題。 – 2014-10-22 10:15:52

+0

@JonSkeet我是這樣想的,我從來沒有用過別的東西。 – ToxicData 2014-10-22 10:17:05

回答

0

這取決於runRead內發生了什麼。我沒有用C#編寫很多數據庫編程,但我不知道這個調用是在任何標準類中,也不在MySQL中。在這種情況下,我可能會錯誤地教育我,我會拋棄這個答案。

沒有發現我的搜索看起來像這樣a piece of code

public static int runRead(string Query, object Tick) { 
    checkConnection(); 
    try { 
     return Convert.ToInt32(new MySqlCommand(Query + " LIMIT 1", dbConnection).ExecuteScalar()); 
    } catch { 
     return 0; 
    } 
} 

,如果這是你正在使用的一個,這或許可以解釋爲什麼你又回到零 - 有可能是發生的一個例外,你捕捉和忽略。

找到的一種方法是在發生異常時刪除異常捕獲或記錄合適的消息,前提是您可以更改源代碼。


你應該去尋找其他的事情是,如果你使用的在數據庫中存在的用戶名。由於查詢將返回零行,我不完全確定它將嘗試使用ExecuteScalar()嘗試獲取的「第一行中的第一列」。

+0

謝謝。這對我有效。 – ToxicData 2014-10-22 11:08:40