如何解决ASP.NET自定义登录页面错误?

时间:2015-05-31 05:29:41

标签: c# asp.net

在Login.aspx.cs文件中

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Web.Configuration;

namespace Leave_Management
{
    public partial class Login : System.Web.UI.Page
    {
        //private string strcon = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

        SqlConnection conn = new SqlConnection(@"Data Source=TAUFIQ-PC\SQLEXPRESS;Initial Catalog=LM;Integrated Security=True");

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            conn.Open();
            string checkuser = "select UserName from [User] where UserName='" + TextBoxUN + "'";
            SqlCommand com = new SqlCommand(checkuser, conn);

            int temp = Convert.ToInt32(com.ExecuteScalar().ToString());


            if (temp == 1)
            {
                string checkpass = "select password from [User] where UserName='" + TextBoxUN + "'";
                SqlCommand passcom = new SqlCommand(checkpass, conn);
                string password = passcom.ExecuteScalar().ToString().Replace(" ", "");
                conn.Close();
                if (password == TextBoxPass.Text)
                {
                    Response.Redirect("Registration.aspx");
                }
            } 
        }
    }
}

错误显示为

  

" NullReferenceException未被用户代码"

处理      

int temp = Convert.ToInt32(com.ExecuteScalar()。ToString());

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

评论太长了,您的代码有很多问题:

您将用户指定的值连接到SQL查询中。不要这样做,使用参数。

您正在将TextBoxUN放入SQL中,您可能需要TextBoxUN.Text。这就是你得到null的原因,因为没有这个名字的用户。

您必须获取ExecuteScalar()提供的值并检查它是否为空。现在是,所以你得到一个明确的错误。

为什么用用户名从数据库中获取用户名然后检查密码?您可以通过一个查询检查密码和用户名。

不要在数据库中以明文形式存储密码!使用哈希函数。

答案 1 :(得分:1)

您可以通过检查SQL语句中的用户名和密码来简化代码:

protected void Button1_Click(object sender, EventArgs e)
{
    conn.Open();
    string SQL = "select UserID from [User] where UserName=@UserName AND Password=@Password"; 
    SqlCommand com = new SqlCommand(SQL, conn);
    com.Parameters.AddWithValue("@UserName", TextBoxUN.Text);
    com.Parameters.AddWithValue("@Password", TextBoxPass.Text);
    SqlDataReader data = com.ExecuteReader();
    if (data.HasRows) // username and password match
    {
        conn.Close();
        Response.Redirect("Registration.aspx");
    }
    else
    {
        conn.Close();
        // display error here
    }
}

我认为UserID是Users表的主键。如果需要,可以使用其他列名称。

我还使用了parameters to avoid SQL injection。干杯!

答案 2 :(得分:0)

如果temp出现为null,那么你将得到错误。我会尝试:

...

   int temp = 0;
   try {
       temp = Convert.ToInt32(com.ExecuteScalar().ToString());
   } catch (exception) {}

...