2014-10-22 192 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