转换nvarchar值时,ASP.NET转换失败

时间:2018-10-01 10:43:40

标签: c# sql asp.net sql-server

我正在尝试在母版页的登录会话中显示用户名,登录后显示此错误

  

将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;
                }
            }
        }
    }

5 个答案:

答案 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";

您选择的登录名依据,用户名与用户名不同