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

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

将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 [email protected]";
        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 [email protected] AND [email protected]";

        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
Users 表中 UserID 列的数据类型是什么?
额外 作者 Wanderer,
用户的帐户凭据名称和内部标识符是两个不同的东西。
额外 作者 StingyJack,

5 答案

你写了

SELECT Username FROM Users WHERE [email protected]

但是对于 @UserID 参数,您传递了用户名。

你确定你不打算写

SELECT Username FROM Users WHERE Username = @UserID

这会更有意义。我希望,UserID和用户名不太可能匹配。它也有助于解释错误,因为我假设数据库中的 UserID 是一个整数列,而用户名是一个字符串(即SQL Server用语中的nvarchar) - 从逻辑上讲,你不能将数字与字符串进行比较。

1
额外

在您的数据库中, UserID 数据类型是 int 而不是 nvarchar 。尝试:

 cmd.Parameters.Add("@UserID",SqlDbType.Int).Value = int.Parse(Session["Username"].ToString());
0
额外

我认为你必须在登录中设置session [“UserID”]并在此查询中使用它

string query = @"SELECT Username FROM Users WHERE [email protected]";

登录时选择的基础,UserID与用户名不同

0
额外

您正在使用您的用户名作为您的用户名。这里:

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 [email protected] AND **[email protected]**
0
额外

您在此处将用户名作为用户名传递:

 cmd.Parameters.AddWithValue("@UserID", Session["Username"].ToString());

改为传递Userid,应该没有问题。

0
额外