C# C&MySQL-始终返回0

C# C&MySQL-始终返回0,c#,mysql,C#,Mysql,我想通过MySQL数据库登录我的程序 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, pa

我想通过MySQL数据库登录我的程序

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,我不知道为什么。当然,数据库中有一个用户:

我已经尝试使用另一个新创建的数据库,但错误仍然存在,因此我认为我在代码中做了一些愚蠢的事情。如果有必要,我可以发布工作代码,但我看不出有什么不同

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;
            }

等等。怎么了?

这取决于runRead中发生的事情。我还没有用C做过很多DB编程,但我不知道在任何标准类中,也不知道在MySQL之类的东西中有这样的调用。在这种情况下,我可能是错的。请随意教育我,我会放弃这个答案

在我的搜索中,我确实发现如下:

public static int runRead(string Query, object Tick) {
    checkConnection();
    try {
        return Convert.ToInt32(new MySqlCommand(Query + " LIMIT 1", dbConnection).ExecuteScalar());
    } catch {
        return 0;
    }
}
而且,如果你用的就是这个,这也许可以解释为什么你会回到零——可能会发生一个异常,你会捕捉并忽略它

一种方法是删除异常捕获,或者在发生异常时记录适当的消息,假设您可以更改源


另一件您应该注意的事情是,如果您使用的用户名在数据库中不存在。由于查询随后将返回零行,我不完全确定它将如何处理ExecuteScalar试图获取的第一行中的第一列。

请在格式化帖子时更加小心-缩进将大部分代码从屏幕上删除。使用预览来检查帖子的外观是否符合您在尝试回答问题时的期望。接下来,停止像那样构建SQL。使用参数化SQL。总是看起来你在用纯文本存储密码。。。这是另一个大问题。@JonSkeet我是这样得到的,我从来没有用过别的东西。然后看看或以一种幽默的方式看@Rohith:Whoops-我是说