【问题标题】:Returning value from Stored Procedure and using it in C#从存储过程返回值并在 C# 中使用它
【发布时间】:2017-07-27 23:37:42
【问题描述】:

我创建了一个函数“Recover(string UserEmail)”,当他/她忘记登录信息时接收用户的电子邮件。此函数运行一个名为“Recover_PassWord”的存储过程,我希望它返回用户名和密码,以便我可以向用户发送电子邮件。我不太熟悉创建返回此信息的简单存储过程的语法。我也不太熟悉在 C# 中存储返回的值,所以我可以使用它。

Recover_PassWord:

   CREATE DEFINER=`root`@`localhost` PROCEDURE `Recover_Password`(IN Email CHAR(40))
BEGIN
  SELECT UserName,PassWord FROM  userdata
  WHERE Email=ContactEmail;
 END

恢复(字符串用户电子邮件):

 public ActionResult Recover(string UserEmail)
    {
        Login model = new Login();
        MySqlConnection connect = DbConnection();
        MySqlCommand cmd = new MySqlCommand("Recover_PassWord",connect);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Email", UserEmail);
        MySqlDataReader rd = cmd.ExecuteReader();
        while (rd.Read())
        {
            if (UserEmail == rd["ContactEmail"].ToString())
            {
                MailMessage msg = new MailMessage();
                msg.To.Add(UserEmail);
                msg.Subject = "Recovered Login Information";
                msg.Body = "Hello," + Environment.NewLine + "Your Login Information: "; //this is where i want to be able to use the returned value
            }
        }
        return null;
    }

有人对我如何实现这一目标有任何建议和建议吗?

【问题讨论】:

  • 你尝试过使用实体框架吗?
  • 我没有。最近有没有关于如何使用它的文章?
  • 你应该试试,用它调用SP真的很方便entityframeworktutorial.net/EntityFramework5/…
  • 如果您可以将用户密码返回给他们,那么您做错了什么。密码绝不应以明文形式或使用可逆加密存储。
  • @DanielMann 我知道我应该对我的密码进行散列和加盐,但我现在只是想让该功能正常工作

标签: c# mysql stored-procedures


【解决方案1】:

试试下面的代码。如果有效,请将答案标记为肯定。谢谢!

    public ActionResult Recover(string UserEmail)
    {
        Login model = new Login();
        MySqlConnection connect = DbConnection();
        MySqlCommand cmd = new MySqlCommand("Recover_PassWord",connect);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Email", UserEmail);
        MySqlDataReader rd = cmd.ExecuteReader();
        while (rd.Read())
        {
            if (UserEmail == rd["ContactEmail"].ToString())
            {
                try
                {
                    SmtpClient mySmtpClient = new SmtpClient("my.smtp.exampleserver.net");

                    // set smtp-client with basicAuthentication
                    mySmtpClient.UseDefaultCredentials = false;
                    System.Net.NetworkCredential basicAuthenticationInfo = new System.Net.NetworkCredential("username", "password");
                    mySmtpClient.Credentials = basicAuthenticationInfo;                    

                    MailMessage msg = new MailMessage();
                    msg.To.Add(UserEmail);
                    msg.Subject = "Recovered Login Information";
                    msg.Body = "Hello," + Environment.NewLine + "Your Login Information: "; //this is where i want to be able to use the returned value

                    msg.Body += Environment.NewLine + "username:" + (string)rd["username"];
                    msg.Body += Environment.NewLine + "password:" + (string)rd["password"];          

                    mySmtpClient.Send(msg);

                }
                catch (SmtpException ex)
                {
                  throw new ApplicationException
                    ("SmtpException has occured: " + ex.Message);
                }
                catch (Exception ex)
                {
                   throw ex;
                }
            }
        }
        return null;
    }

【讨论】:

  • 不应该是“mySmtpClient.Send(myMail);”是“mySmtpClient.Send(msg);”?
  • 哇,对不起,我的代码在这里,没错,只是改变!更正上面的代码!
  • 除了我得到一个 smtpexception 之外几乎可以工作。没有 InnerException 的“发送邮件失败”。你知道可能是什么问题吗?
  • 此错误用于配置您的 smtp 服务器。如果您使用 gmail 作为 smtp,请遵循以下准则:support.google.com/a/answer/176600?hl=en
【解决方案2】:

你必须使用:这样调用,

MySqlCommand cmd = new MySqlCommand("call Recover_PassWord",connect);

如果你使用参数:

create procedure Recover_Password(Email char(40))
BEGIN
 SELECT UserName,PassWord FROM  userdata
  WHERE  ContactEmail =Email;
end

使用:

String emailInput = "thisIsMyEmailInput";
    MySqlCommand cmd = new MySqlCommand("call Recover_Password('" + emailInput + "')",connect);

【讨论】:

  • 如果是存储过程而不是函数。函数和存储过程不同。
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-09-06
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多