必须声明标量变量“@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; }
更多信息在这里 。
上述就是C#学习教程:必须声明标量变量“@Email”分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1017950.html