c# - MySQLDataReader 不读取 C#

标签 c# mysql mysqldatareader

存储过程:

BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1;
END

@p0 和@p1 是 Varchar(100)。

还有代码:

using (MySqlConnection con = new MySqlConnection(Database.MySQLConstring))
{
    using (MySqlCommand cmd = new MySqlCommand("LoginCheck", con))
    {
        cmd.CommandType = CommandType.StoredProcedure; //"LoginCheck"
        cmd.Parameters.AddWithValue("email", Email);
        cmd.Parameters.AddWithValue("password", Pword);

        con.Open();

        MySqlDataReader reader = cmd.ExecuteReader();
        UserModel UM = new UserModel();
        While (reader.Read())
        {
            UM.UserId = (int)reader["UserID"];
            UM.DisplayName = (string)reader["DisplayName"];
            UM.Moderator = (int)reader["Moderator"];
        }

        con.Close();
        While(!string.IsNullOrEmpty(UM.DisplayName) && UM.UserId != 0)
        {
            Result = 1;
            return UM;
        }

        Result = -1;
        return UM;
    }
}

代码运行成功,直到到达 while(reader.Read()) 部分,然后跳过它并转到 con.close()。不会抛出任何错误或异常。当一切都是 SQL 而不是 MySQL 时,当我使用它时它起作用了,但我需要让它在 MySQL 中工作。

当我在数据库中运行存储过程本身时,我得到了我需要的结果。但是当我使用代码时,它会跳过代码的 While 部分。

最佳答案

如果我要执行声明为的过程:

CREATE PROCEDURE x(em VARCHAR, pw VARCHAR) --declaration of parameters
BEGIN
  SELECT * FROM `user` WHERE `EmailAddress`= em AND `Password` = pw;
END

我会确保我的 C# 代码中的参数命名与存储过程声明中的相同:

cmd.Parameters.Add(new MySqlParameter("em", Email));
cmd.Parameters.Add(new MySqlParameter("pw", Password));

我怀疑您的查询没有获取任何行,因为您设置的值永远不会进入参数,因此永远不会用于查询。 reader.Read() 返回 false,因为没有行。还要确保您查询的 EMail 和 Password 的值确实存在于表中

尝试作为调试工具,使您的查询像这样:

SELECT UserID, DisplayName, Moderator FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1 
UNION ALL 
SELECT 0, CONCAT_WS(' ', 'There is no user with email/password of', @p0, '/', @p1), '' FROM DUAL;

或者您的参数现在已命名..

你的 reader.Read() 现在应该返回真,因为这个查询应该总是返回一行,所以检查 DisplayName 的值,它应该告诉你应用了哪些搜索词

关于c# - MySQLDataReader 不读取 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53947361/

相关文章:

c# - 以编程方式获取转换和输出运算符类型

c# - 尝试更新 MongoDb 数组元素时出错

mysql - MySQL数据库管理器

mysql - 如何从一个 DBCommand 对象执行两个单独的查询?

c# - 无法从 MySQL 获取值并打印到 TextBox

c# - 阅读文本段落,使用 StreamReader 获取下一行

c# - 如何在 Rx.NET 中以正确的方式约束并发

mysql - 按优先级分组

mysql - WordPress 开发周期

c# - ASP.NET - 页面重新加载后 GridView 为空