C# MySQLDataReader未读取C

C# MySQLDataReader未读取C,c#,mysql,mysqldatareader,C#,Mysql,Mysqldatareader,存储过程: BEGIN SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1; END 其中@p0和@p1为Varchar100 以及守则: using (MySqlConnection con = new MySqlConnection(Database.MySQLConstring)) { using (MySqlCommand cmd = new MySqlCommand("LoginCheck",

存储过程:

BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1;
END
其中@p0和@p1为Varchar100

以及守则:

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;
    }
}
代码成功运行,直到到达WhiileReader.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,因为没有行。还要确保表中确实存在您要查询的电子邮件和密码的值

尝试进行调试,使您的查询如下:

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现在应该返回true,因为此查询应该始终返回一行,因此检查DisplayName的值,它应该告诉您应用了哪些搜索词

您的存储过程在management studio中工作吗?@EhsanSajjad Im使用PHPMyAdmin,当我在那里运行它时,它就工作了。你确定重要的是添加参数的顺序,而不是它们的名称吗?您似乎在存储过程的定义中调用了参数@p0和@p1,然后将它们作为@email和@password添加到c中。我会尝试将存储过程更改为接受@email和@password,而不是@p0和@p1,然后看看c是否有效。您可能还需要在C名称中使用@,您说过代码会成功运行,直到它到达whilereader。Read->在您的代码中没有这样的部分code@CaiusJard我理解你的陈述,但起初我的参数名称与我在代码中命名它们的方式相同,但它不起作用。然后我在Stack overflow上发现有人将它们声明为“@p0”,即使在那里它被声明为不同的,这对他有效,我尝试过,对我也有效。这就是代码和SP中的名称不同的原因。我再次测试,以改变名称,使它们符合你的建议,但它仍然跳过循环,而我在开始时这样做了,但这也不起作用。然后我尝试了'@p0'和'@p1'名称,因为它们是对所创建存储过程的第一个和第二个参数的引用。至少这是我在堆栈溢出解决方案中看到的。我已经重写了存储过程,并按照建议将参数名称更改为更清晰的名称,我的阅读器再次工作。可能是因为参数没有到达我的存储过程。