1

mysqlデータベースを使用して、C#(私の最初のC#アプリ)で小さなユーザーユーザーメッセージングシステムを開発しようとしています。

データベースの操作にはEFのようなものを使用するのがベストプラクティスであることはわかっていますが、構文に慣れるために、これを「ばかげた」方法で書いています。

私はvbのバックグラウンドから来ているので、基本的にvbで通常行うことを変換しているだけです。そのため、データベースに一致する行があるにもかかわらず、DataReaderが行なしで戻ってくる理由を理解できません。下記参照:

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        Page.Validate("Login");

        if (!IsValid)
        {
            return;
        }

        if (checkLogin())
        {
            Response.Redirect("Default.aspx");
        }
        else
        {
            lblErr.Text = "Invalid login attempt";
        }
    }

    protected Boolean checkLogin()
    {
        MySql db = new MySql();

        string sql = "select userid, firstname, lastname, ifnull(lastlogin, '') from users where email = @email and pass = @pass";

        List<MySqlParameter> args = new List<MySqlParameter>();
        args.Add(new MySqlParameter() { ParameterName = "@email", MySqlDbType = MySqlDbType.VarChar, Size = 100, Value = txtEmail.Text });
        args.Add(new MySqlParameter() { ParameterName = "@pass", MySqlDbType = MySqlDbType.VarChar, Size = 20, Value = txtPass.Text });

        MySqlDataReader dr = db.getReader(sql, args);

        if (dr.HasRows)
        {
            dr.Read();

            Session["userid"] = dr.GetInt32("userid");
            Session["firstname"] = dr.GetString("firstname");
            Session["lastname"] = dr.GetString("lastname");
            Session["lastlogin"] = dr.GetDateTime("lastlogin");

            dr.Close();

            return true;
        }
        else
        {
            return false;
        }
    }

上記のコードは、データベースに対してユーザー入力をチェックし、ユーザー入力と一致する行がテーブルにある場合は行を返します。

データベースとの相互作用のコードは次のとおりです...

public class MySql
{
    static string connStr = "data source=localhost; initial catalog=mail; user id=root; password=Ly@12157114;";
    MySqlConnection conn = new MySqlConnection(connStr);

    public MySqlDataReader getReader(string sql, List<MySqlParameter> args)
    {
        if (args.Count == 0)
        {
            return getReader(sql);
        }
        else
        {
            return getReader(sql, args.ToArray());
        }
    }
    public MySqlDataReader getReader(string sql, MySqlParameter[] args = null)
    {
        MySqlCommand cmd = new MySqlCommand(sql, conn);

        if (args != null)
        {
            cmd.Parameters.AddRange(args);
        }

        conn.Open();

        MySqlDataReader dr = cmd.ExecuteReader();

        conn.Close();

        return dr;
    }
}

ここではエラーや問題の兆候は見られず、ログインフィールドへの入力と一致するデータがあると確信しています。

DataReaderが空に戻り続ける理由を誰かが理解するのを手伝ってもらえますか?

4

1 に答える 1

4

データリーダーを使用するときは、データリーダーの接続を開く必要があります。DataReaderは、作成時にデータを取得せず、使用時にデータを取得します。接続を閉じる前に、すべてのデータベースを取得することはできません。

于 2012-10-16T13:43:34.087 に答える