【问题标题】:MySQLDataReader not reading C#MySQLDataReader 不读取 C#
【发布时间】:2018-12-27 15:30:36
【问题描述】:

存储过程:

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 部分。

【问题讨论】:

  • 您的存储过程是否在管理工作室工作?
  • @EhsanSajjad 我正在使用 PHPMyAdmin,当我在那里运行它时它可以工作。
  • 您确定重要的是添加参数的顺序而不是它们的名称吗?您似乎在存储过程的定义中调用了您的参数@p0@p1,然后在c# 中将它们添加为@email 和@password。我会尝试更改存储过程以接受@email 和@password 而不是@p0 和@p1,并查看c# 是否有效。您可能还需要在 C# 名称中使用 @
  • ps,你说 代码运行成功,直到出现 while(reader.Read()) -> 你的代码中没有这样的部分
  • @CaiusJard 我理解你的说法,但起初我的参数名称与我在代码中命名它们的方式相同,但它没有用。然后我在 Stack Overflow 上发现有人将它们声明为“@p0”,即使在那里它被声明为不同并且它对他有用,我尝试了它并且它对我有用。这就是为什么代码和 SP 中的名称不同的原因。我再次测试以更改名称,以便它们像您建议的那样匹配,但它仍然跳过 While 循环

标签: c# mysql mysqldatareader


【解决方案1】:

如果我要执行一个声明为:

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 的值,它应该知道应用了哪些搜索词

【讨论】:

  • 我一开始就这样做了,但也没有成功。然后我尝试了“@p0”和“@p1”名称,因为它们是对您为创建的存储过程声明的第一个和第二个参数的引用。至少这就是我对堆栈溢出解决方案的看法。
  • 我已经重写了我的存储过程,并将我的参数名称更改为更清晰的名称,如建议的那样,我的阅读器再次工作。可能是参数没有到达我的存储过程的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2011-03-21
  • 2020-06-18
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多