我正在尝试在母版页的登录会话中显示用户名,登录后显示此错误
将nvarchar值转换为数据类型时,转换失败
这是我的MasterPage.cs
public partial class HRPortal_HRPortalMaster : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Username"] != null)
{
if (!IsPostBack)
{
GetName();
}
}
}
void GetName()
{
using (SqlConnection con = new SqlConnection(Helper.GetCon()))
{
string query = @"SELECT Username FROM Users WHERE UserID=@UserID";
con.Open();
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@UserID", Session["Username"].ToString());
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
ltName.Text = dr["Username"].ToString();
}
}
}
}
}
}
这是我的Login.cs
protected void btnLogin_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection(Helper.GetCon()))
{
con.Open();
string query = @"SELECT u.UserID, u.Username, u.Password, t.UserType FROM Users u INNER JOIN UserType t ON t.TypeID = u.TypeID WHERE Username=@Username AND Username=@Username";
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
cmd.Parameters.AddWithValue("@Password", Helper.CreateSHAHash(txtPassword.Text));
//DataTable dt = new DataTable();
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
while (dr.Read())
{
string Utype;
Utype = dr["UserType"].ToString();
if (Utype == "Employee")
{
Session["Username"] = txtUsername.Text;
Response.Redirect("~/HrPortal/Home.aspx");
}
else
{
Session["Username"] = txtUsername.Text;
Response.Redirect("~/Administrator/Home.aspx");
}
}
}
else
{
error.Visible = true;
}
}
}
}
答案 0 :(得分:1)
您写了
SELECT Username FROM Users WHERE UserID=@UserID
您输入用户名的@UserID
参数。
您确定不是要写
SELECT Username FROM Users WHERE Username = @UserID
那会更有意义。我希望UserID和用户名不太可能匹配。因为我假设数据库中的UserID
是一个整数列,而用户名是一个字符串(即SQL Server中的nvarchar),所以从逻辑上讲,您不能比较数字到一个字符串。
答案 1 :(得分:0)
UserID
的数据类型在您的数据库中是int
,而不是nvarchar
。试试:
cmd.Parameters.Add("@UserID",SqlDbType.Int).Value = int.Parse(Session["Username"].ToString());
答案 2 :(得分:0)
您要在此处传递用户名作为用户ID:
cmd.Parameters.AddWithValue("@UserID", Session["Username"].ToString());
改为传递用户ID,应该没有问题。
答案 3 :(得分:0)
您正在使用用户名作为用户ID。在这里:
cmd.Parameters.AddWithValue("@UserID", Session["Username"].ToString());
应该是:
cmd.Parameters.AddWithValue("@UserID", Session["UsedID"].ToString());
(如果已在会话中存储UserId)。
或SELECT Username FROM Users WHERE Username=@UserID
吗?
您在其他选择中也有错误,应该是
SELECT u.UserID, u.Username, u.Password, t.UserType FROM Users u INNER JOIN UserType t ON t.TypeID = u.TypeID WHERE Username=@Username AND **Password=@Password**
答案 4 :(得分:0)
我认为您必须在登录中设置session [“ UserID”]并在此查询中使用它
string query = @"SELECT Username FROM Users WHERE UserID=@UserID";
您选择的登录名依据,用户名与用户名不同