0

我在用:

                string selectString =
                "SELECT username, password " +
                "FROM users " +
                "WHERE username = '" + user + "' AND password = '" + password + "'";

                MySqlCommand mySqlCommand = new MySqlCommand(selectString, Program.mySqlConnection);
                Program.mySqlConnection.Open();
                String strResult = String.Empty;
                strResult = (String)mySqlCommand.ExecuteScalar();
                Program.mySqlConnection.Close();
                if (strResult.Length == 0)
                {
                    responseString = "invalid";
                    InvalidLogin = true;
                } else {
                    InvalidLogin = false;
                }

在 strResult.Length 处,由于某种原因,我得到了 NullReferenceException。

4

3 回答 3

3

这就是您的代码的样子:

using(var connection = new MySQLConnection(connectionString))
{
    using(var command = connection.CreateCommand())
    {
        command.CommandText = @"
SELECT COUNT(*) 
FROM users
WHERE username = @user AND password = @password";
        command.Parameters.Add(new MySQLParameter("user", user));
        command.Parameters.Add(new MySQLParameter("password", password));

        var total = (int)command.ExecuteScalar();
        if(total == 0)
            InvalidLogin = true;
        else
            InvalidLogin = false;
    }
}

有几件事情需要注意

  • 永远不要以你这样做的方式构建你的查询字符串。在 Google 上搜索“sql injection”以了解更多关于你可能发生的事情。始终使用参数。我知道,您写道这是控制台应用程序,但良好的习惯很重要。
  • using使用数据库连接和命令时始终使用关键字。
  • 从您的代码中,我感觉您有全局 MySQLConnection 对象,对吗?永远不要那样做!ADO.NET 使用连接池,因此为您的操作打开新连接并不是昂贵的操作。确保您没有在连接字符串中禁用连接池。
  • 与 ADO.NET 无关,但很重要:您应该散列您的密码。

要回答您的问题,问题出在您正在使用的 ExecuteScalar 中。它返回标量变量(单个值)...在您的查询中,您正在返回用户名和密码,因此您应该使用 ExecuteReader 代替...但我认为我发布的查询中的 COUNT(*) 以及 ExecuteScalar 可能成为更好的解决方案。

于 2012-10-19T18:35:14.767 回答
2

试试这个..

string selectString =
                "SELECT username, password " +
                "FROM users " +
                "WHERE username = '" + user + "' AND password = '" + password + "'";

                MySqlCommand mySqlCommand = new MySqlCommand(selectString, Program.mySqlConnection);
                Program.mySqlConnection.Open();
                String strResult = String.Empty;

                if (mySqlCommand.ExecuteScalar()== NULL)
                {
                    responseString = "invalid";
                    InvalidLogin = true;
                } else {
                    InvalidLogin = false;
                }
               Program.mySqlConnection.Close();
于 2012-10-19T18:42:56.780 回答
1

ExecuteScalar()返回单个值。你想要ExecuteReader(),因为你要带回用户名和密码

于 2012-10-19T18:24:35.453 回答