当前位置: 首页 > 知识库问答 >
问题:

C#中的MySqlDataReader没有行

子车雅珺
2023-03-14

我正在尝试使用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总是空着返回?

共有1个答案

宰父俊彦
2023-03-14

使用数据阅读器时必须打开它的连接。DataReader在创建时不检索任何数据,它在使用时检索数据。它无法在关闭连接之前检索所有数据库。

 类似资料:
  • 我在PHPmyadmin中的查询有结果,但在C#中,a.read()不返回数据。

  • 我觉得我在这里吃了疯狂的药丸。通常,对于任何给定的任务,网络上总是有一百万个库和样本。我正在尝试使用JSON Web Tokens(JWT)使用Google“服务帐户”实现身份验证,如下所述。 然而,只有PHP、Python和Java的客户端库。即使在谷歌认证之外搜索JWT的例子,也只有关于JWT概念的蟋蟀和草稿。这真的这么新,可能是谷歌的专有系统吗? 我能解释的最接近的java示例看起来相当密集

  • 问题内容: 我用C语言编写“ hello world”程序 程序编译时显示警告为 这怎么可能?OS如何在不包含任何标题的情况下链接库? 问题答案: 编译器使用对称为的函数的引用来构建源文件, 而无需 知道其实际使用的参数或其返回类型是什么。生成的程序集在程序的静态数据区域中包含字符串地址的,后跟到。 将您的目标文件链接到可执行文件时,链接器会看到对它的引用并提供C标准库函数。通过 巧合 ,你传递的

  • 我有一个C++实验室,问题是:用户应该为X输入一个值(X是所持有的测试数)。如果x<15,程序不计算任何东西。如果X在16和30之间,程序应计算C=1.0/10.0*(24a);如果X>30,程序应计算C=0.15(24*a)。我的multiple if代码可以工作,但是当我输入X的值时,方程没有解出。有人知道吗??

  • 我正在尝试编译并运行以下程序,而不使用中的函数。我使用以下命令编译了程序。 编译器发出警告 好的,没问题。然后,我已经运行了可执行文件(a.out),两个< code>printf语句都打印成功,然后得到分段错误。 所以,我的问题是,为什么成功执行打印语句后会出现分段错误? 我的代码: 输出: 注意: 在这里, gcc 标志阻止编译器在链接时使用标准启动文件

  • 问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp