Перетворення ASP.NET не вдалося при перетворенні значення nvarchar

Я намагаюся відобразити ім'я користувача в сеансі входу на сторінці-шаблоні, я отримав цю помилку після того, як я зареєструвався в ній

Помилка конверсії при перетворенні значення nvarchar у тип даних   int.

Ось мій 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
Який тип даних стовпця UserID у таблиці Користувачі ?
додано Автор Wanderer, джерело
Ім'я облікового запису користувача та внутрішній ідентифікатор облікового запису - це дві різні речі.
додано Автор StingyJack, джерело

5 Відповіді

Ви написали

SELECT Username FROM Users WHERE [email protected]

але для параметра @UserID ви переходите до імені користувача.

Ви впевнені, що ви не хотіли писати

SELECT Username FROM Users WHERE Username = @UserID

Це має більше сенсу. UserID і ім'я користувача навряд чи будуть відповідати, я очікую. Це також допоможе пояснити помилку, оскільки я припускаю, що UserID в базі даних є цілим стовпцем, тоді як ім'я користувача - це рядок (тобто nvarchar в мові SQL Server) - і логічно ви не можете порівнювати число з рядком.

1
додано

виразно тип даних UserID є int , а не nvarchar на вашій базі даних. Спробуйте:

 cmd.Parameters.Add("@UserID",SqlDbType.Int).Value = int.Parse(Session["Username"].ToString());
0
додано

Я думаю, ви повинні встановити сеанс ["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 у вашому сеансі. або ВИБРАТИ Ім'я користувача від користувачів WHERE Ім'я користувача = @ 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
додано

Тут ви передаєте ім’я користувача як userid:

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

замість цього перейдіть до Userid і не повинно бути ніяких проблем.

0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug