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インジェクション」を検索して、自分に何が起こるかについて詳しく調べてください。常にパラメータを使用してください。これはコンソールアプリだとおっしゃっていましたが、良い習慣が重要です。
  • 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 に答える