Ошибка в базе данных sql «Необходимо объявить скалярную переменную»

#c# #sql

#c# #asp.net #sql

Вопрос:

У меня проблема с моей системой входа в систему. Я создал простую систему, которая работала хорошо, но я хотел сделать ее более продвинутой и отображать другую стартовую страницу в зависимости от пользователя UserType . Однако я сталкиваюсь со следующей ошибкой: «Необходимо объявить скалярную переменную @UserType».

 using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public partial class LoginwithEncryption : System.Web.UI.Page
{

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString);
        con.Open();
        SqlCommand cmd = new SqlCommand(
            "select * from dbo.UserInfo where Login =@Login and UserType=@UserType and Password=@Password and UserType=@UserType", con);
        cmd.Parameters.AddWithValue("@Login", txtUserName.Text);
        cmd.Parameters.AddWithValue("@Password", txtPWD.Text ".123");


        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            int usertype = Convert.ToInt32(dt.Rows[0]["UserType"]);


            if (usertype == 1)
            {
                Response.Redirect("StartPage.aspx");
            }
            else if (usertype == 2)
            {
                Response.Redirect("DiferentStartPage.aspx");
            }

        }
        else
        {
            ClientScript.RegisterStartupScript(Page.GetType(), "validation",
                "<script language='javascript'>alert('Invalid UserName and Password')</script>");
        }

    }
}
  

Комментарии:

1. Вы хотели сказать and UserType=@UserType дважды? Почему вы не включили cmd.Parameters.AddWithValue("@UserType"... ?

Ответ №1:

Как указано в ошибке: необходимо объявить скалярную переменную «@UserType»

Другими словами, команда SQL имеет параметр для @UserType , но в коллекции параметров нет параметров, объявленных.

 SqlCommand cmd = new SqlCommand(
"select * from dbo.UserInfo where Login =@Login and UserType=@UserType and Password=@Password and UserType=@UserType", con);
cmd.Parameters.AddWithValue("@Login", txtUserName.Text);
cmd.Parameters.AddWithValue("@Password", txtPWD.Text ".123");
  

Добавьте другой параметр для @UserType параметра:

 cmd.Parameters.AddWithValue("@UserType", "User Type");
  

Кроме того, SQL содержит повторяющуюся ссылку на for @UserType :

 select * from dbo.UserInfo 
where Login=@Login 
      and UserType=@UserType 
      and Password=@Password 
      and UserType=@UserType
  

Вероятно, должно быть:

 select * from dbo.UserInfo 
where Login=@Login 
      and Password=@Password
      and UserType=@UserType 
  

Комментарии:

1. Странно, я добавил cmd.Parameters. AddWithValue(«@UserType», «User Type»); в мою программу, но login перестал работать. (удаление UserType для повторного входа в систему) есть идеи, что может быть не так?

2. Вы должны указать фактическое значение для @UserType ; в примере "User Type" должно быть заменено вашим значением.

3. cmd.Параметры. AddWithValue(«@UserType», SqlDbType.Int ); Это правильный путь?

4. При повторном прочтении вашего вопроса выясняется, что вы, возможно, не захотите использовать этот @UserType параметр; скорее, вы пытаетесь использовать UserType перенаправление на основе входа в систему. Если это так, то просто удалите @UserType из команды SQL и не добавляйте никаких других параметров.

5. Отлично! Если вы так склонны, не стесняйтесь проголосовать и принять этот ответ 🙂

Ответ №2:

Вы передали @Login и @Password в качестве параметров для вашего запроса, но вы не передали @UserType в качестве параметра для вашего запроса.