位置0处没有行,例外

时间:2015-11-04 10:56:39

标签: asp.net c#-4.0

我在登录时遇到问题,注册用户的姓名,电子邮件和密码保存在数据库中,电子邮件是用户名。当我通过电子邮件和密码登录时,它会显示错误"位置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();

3 个答案:

答案 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查询时应该使用参数来避免注入攻击。

不要忘记SqlConnectionIDisposable,所以应该在using语句中(您可能已经在做这个,但我已将其包含在此以防万一)

看起来用户的密码与TextBox(或类似控件)的输入相比较?如果是这样,则用户的密码不应以纯文本形式存储在数据库中,因为这是一个安全问题。考虑散列存储的密码,对用户的输入执行相同的操作,然后进行比较。 我知道,这不是问题的一部分,但值得指出以防万一。