2014-10-22 6 views
0

Я хочу войти в свою программу через MySQL (Database).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

Пожалуйста, проявляйте большую осторожность при форматировании ваших сообщений - отступы вытеснили большую часть кода с экрана, чтобы начать с. Используйте предварительный просмотр, чтобы проверить, что сообщение выглядит так, как вы хотите, чтобы он выглядел, если вы пытаетесь ответить. –

+2

Далее, * прекратите строить SQL таким образом *. Используйте параметризованный SQL. *Всегда*. И похоже, что вы храните свои пароли в виде простого текста ... что еще одна серьезная проблема. –

+0

@JonSkeet Я получил это так, я никогда не использовал что-то еще. – ToxicData

ответ

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

Смежные вопросы