必须声明标量变量“@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();
我做错了什么?
试试这样
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;
}
更多信息在这里。