我在登录时遇到问题,注册用户的姓名,电子邮件和密码保存在数据库中,电子邮件是用户名。当我通过电子邮件和密码登录时,它会显示错误"位置0处没有行。" 这是我的代码:
con.Open();
cmd = new SqlCommand("select * from userinfo where username='" + t1.Text.ToString() + "' and password='" + t2.Text.ToString() + "'", con);
da = new SqlDataAdapter(cmd);
da.Fill(ds, "abc");
Session["name"] = ds.Tables["abc"].Rows[0][1].ToString();
con.Close();
答案 0 :(得分:0)
因为原因是在Db中找到的没有人记录与通过的用户名和密码相同,你可以直接访问,所以它给予例外。如果条件如下,请添加一个。
con.Open();
cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @username AND password = @password", con);
cmd.Paramater.AddWithValue("@username", t1.Text.ToString());
cmd.Paramater.AddWithValue("@password", t2.Text.ToString());
da = new SqlDataAdapter(cmd);
da.Fill(ds, "abc");
if(ds.Tables["abc"].Rows.Count>0)
{
Session["name"] = ds.Tables["abc"].Rows[0][1].ToString();
}
con.Close();
答案 1 :(得分:0)
cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @username AND password = @password", con);
cmd.Paramater.AddWithValue("@username", t1.Text.ToString());
cmd.Paramater.AddWithValue("@password", t2.Text.ToString());
con.open();
SqlDataReader dr = cmd.ExecuteReader();
dr.read();
if(dr.hasRows){
Session["name"] = dr["username"].ToString();
}
con.close();
尽量不要将变量抛出到sql命令中。 SQL注入和所有。尝试并通过参数
答案 2 :(得分:0)
例外是因为该表中没有记录。
没有行,因此没有Rows[0]
。
尝试这样的事情:
using (var con = new SqlConnection(connectionString))
{
con.Open();
cmd = new SqlCommand("SELECT * FROM userinfo WHERE username = @1 AND password = @2", con);
cmd.Paramater.AddWithValue("@1", t1.Text);
cmd.Paramater.AddWithValue("@2", t2.Text);
da = new SqlDataAdapter(cmd);
da.Fill(ds, "abc");
if(ds.Tables["abc"].Rows.Any())
Session["name"] = ds.Tables["abc"].Rows[0][1].ToString();
con.Close();
}
在构造SQL查询时应该使用参数来避免注入攻击。
不要忘记SqlConnection
是IDisposable
,所以应该在using
语句中(您可能已经在做这个,但我已将其包含在此以防万一)
看起来用户的密码与TextBox
(或类似控件)的输入相比较?如果是这样,则用户的密码不应以纯文本形式存储在数据库中,因为这是一个安全问题。考虑散列存储的密码,对用户的输入执行相同的操作,然后进行比较。
我知道,这不是问题的一部分,但值得指出以防万一。