【发布时间】: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