【发布时间】:2020-03-22 22:46:40
【问题描述】:
在下面的代码中:我想在用户尝试输入与数据库关联(不)关联的电子邮件时警告用户。当我输入某些内容不在我的数据库中时,它会显示“您的记录不在我们的数据库中”。但是当我输入有效的电子邮件时,它会显示:输入字符串的格式不正确
所以这行代码不起作用:smtpClient.Send(message);
string randomCode = "";
public static string to;
public ForgotPassword()
{
InitializeComponent();
}
private void btn_EmailSend_Click(object sender, EventArgs e)
{
string from, pass, messagebody;
#region Generating random code
Random ran = new Random();
string randText = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
int Length_randText = randText.Length;
for (int i = 0; i < 5; i++)
{
randomCode += randText[ran.Next(Length_randText)];
}
#endregion
MailMessage message = new MailMessage();
to = txt_Email.Text;
from = "------";
pass = "------";
messagebody = "You have requested to reset your password. Enter this \"" + randomCode + "\" - code to change your password";
message.To.Add(to);
message.From = new MailAddress(from);
message.Body = messagebody;
message.Subject = "Password resetting request";
SmtpClient smtpClient = new SmtpClient("smtp.gmail.com");
smtpClient.EnableSsl = true;
smtpClient.Port = 587;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Credentials = new NetworkCredential(from, pass);
try
{
using (DALC.GetConnection())
{
SqlCommand cmd = new SqlCommand("select email from loginuser where email = '" + to + "'", DALC.con);
object result = cmd.ExecuteScalar();
if (Convert.ToInt16(result)>0)
{
smtpClient.Send(message);
MessageBox.Show("I have sent your resetting code to you email. Check your inbox :)", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Your record is not in our database");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
【问题讨论】:
-
与您的问题无关,但请阅读有关 SQL 注入的信息。
-
我在您的代码中没有看到“发件人”的有效电子邮件
-
如果您检查异常,您将获得有关问题的更多详细信息。
-
您收到错误是因为您正在使用
ExecuteScaler从数据库 (select email from loginuser …) 中选择一封电子邮件,其中 "执行查询,并返回第一列查询返回的结果集中的第一行。” - 这将返回一个字符串,然后您在该字符串上调用Convert.ToInt16,然后抛出您看到的异常。您可以改用COUNT(*),但您必须参数化您的查询 - 请参阅xkcd.com/327 -
在“
result不是我所期望的”之后的基本调试步骤是查看该结果真正是什么。然后您会看到您正在将电子邮件地址转换为 Int16。
标签: c# sql winforms forgot-password