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

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

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。然后我试图从数据库tabel中检索值’Name’和’Balance’,其中Emails匹配表中的那个。像这样:

  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(); 

我究竟做错了什么?

请尝试这样做

  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使用用户名,但电子邮件地址正常,因为您通过电子邮件地址检索用户信息。)

它违背了使用FormsAuthentication的目的,因为它已经在FormsAuthenticationTicket中保存了Email

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

的Global.asax.cs

您需要这样才能从cookie检索电子邮件,并将电子邮件保存在IPrincipal对象中

 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; } 

更多信息在这里 。