首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQLDataReader未读取C#

MySQLDataReader未读取C#
EN

Stack Overflow用户
提问于 2018-12-27 23:30:36
回答 1查看 156关注 0票数 1

存储过程:

代码语言:javascript
复制
BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1;
END

其中@p0和@p1是Varchar(100)。

和代码:

代码语言:javascript
复制
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中工作。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-27 23:47:20

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

代码语言:javascript
复制
CREATE PROCEDURE x(em VARCHAR, pw VARCHAR) --declaration of parameters
BEGIN
  SELECT * FROM `user` WHERE `EmailAddress`= em AND `Password` = pw;
END

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

代码语言:javascript
复制
cmd.Parameters.Add(new MySqlParameter("em", Email));
cmd.Parameters.Add(new MySqlParameter("pw", Password));

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

试着调试一下,让你的查询像这样:

代码语言:javascript
复制
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的值,它应该知道应用了什么搜索词

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53947361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档