在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());
请帮我解决这个问题。
答案 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) {}
...