必须声明标量变量“@Email”

本文关键字:@Email 变量 标量 声明 | 更新日期: 2023-09-27 17:57:06

我正在尝试将值从数据库表传递到几个标签,其中电子邮件列与输入的电子邮件匹配。我已使用会话将从登录页面输入的电子邮件传递到此页面。喜欢这个:

    protected void btnLogin_Click(object sender, EventArgs e)
    {
    if (AuthenticateUser(txtEmail.Text, txtPassword.Text))
    {
        FormsAuthentication.RedirectFromLoginPage(txtEmail.Text, chkBoxRememberMe.Checked);
        Session["Email"] = txtEmail.Text;
        Response.Redirect("~/Account.aspx");
     }

然后我正在将会话值传递给 ACOUNTS 页面上的 lblEmail,然后我尝试从数据库选项卡中检索值"名称"和"余额",其中电子邮件与表中的电子邮件匹配。喜欢这个:

     protected void Page_Load(object sender, EventArgs e)
{
    lblEmail.Text = Session["Email"].ToString();
    string CS = ConfigurationManager.ConnectionStrings["ABCD"].ConnectionString;
    using (SqlConnection con = new SqlConnection(CS))
    {
        SqlCommand cmd = new SqlCommand("Select * from tblRegister where @Email = " + lblEmail.Text, con);
        con.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        rdr.Read();
        lblName.Text = rdr["Name"].ToString();
        lblBalance.Text = rdr["Balance"].ToString();

    }

但是我在下面一行收到一条错误消息,指出"必须声明标量可@Email":

   SqlDataReader rdr = cmd.ExecuteReader();

我做错了什么?

必须声明标量变量“@Email”

试试这样

  SqlCommand cmd = new SqlCommand("Select * from tblRegister where Email = @Email", con);
  cmd.Parameters.AddWithValue("@Email", lblEmail.Text);
  SqlDataReader rdr = cmd.ExecuteReader();
  //...

@Email表示变量,而不是字段名称。如果表中的字段名称是@Email请将其括在方括号中...[@Email] 但我猜字段名称是电子邮件。

编辑:

您对 where 语句也有问题,如果您要发送文本,则需要将其括在引号中:

SqlCommand cmd = new SqlCommand("Select * from tblRegister where Email = '" + lblEmail.Text + "'", con);

这种类型的查询,只需传递用户输入的值即可打开SQL注入。

更多信息

您在错误的位置使用了电子邮件参数。

请尝试改用以下内容:

SqlCommand cmd = new SqlCommand("Select * from tblRegister where Email = @Email", con);
cmd.Parameters.AddWithValue("@Email", lblEmail.Text);

其他答案已经回答了您关于@Email的最初问题。

这是我发现的

由于您使用的是表单身份验证,因此不应将电子邮件保存在会话状态中。(通常,FormsAuthentication 使用用户名,但电子邮件地址是可以的,因为您是通过电子邮件地址检索用户信息。

它违背了使用 FormsAuthentication 的目的,因为它已经将电子邮件保存在 FormsAuthenticationTicket 中。

protected void btnLogin_Click(object sender, EventArgs e)
{
   if (AuthenticateUser(txtEmail.Text, txtPassword.Text))
   {
      // Thus all you need
      FormsAuthentication.RedirectFromLoginPage(username, true);
   }
}

全球.asax.cs

您需要它才能从cookie中检索电子邮件,并将电子邮件保存在IPrincipal Object中。

public class Global : HttpApplication
{
    private void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpCookie decryptedCookie =
            Context.Request.Cookies[FormsAuthentication.FormsCookieName];
        FormsAuthenticationTicket ticket =
            FormsAuthentication.Decrypt(decryptedCookie.Value);
        var identity = new GenericIdentity(ticket.Name);
        var principal = new GenericPrincipal(identity, null);
        HttpContext.Current.User = principal;
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }
}

用法

protected void Page_Load(object sender, EventArgs e)
{
    var email = User.Identity.Name;
}

更多信息在这里。