как добавить ограничения в форму входа?

1

Я создаю форму для входа в систему и хочу добавить учетную запись пользователя и администратора. что я сделал в своей базе данных, это создать таблицу для моих пользователей с определенным типом пользователя. U_Type будет либо 1 = admin, либо 2 = user.

Я хочу добавить оператор if, который будет вызывать мое имя столбца U_Type и сравнить его либо 1 или 2. ниже мой незавершенный код. Я использую Visual Studio 2008 С# и ms sql 2005

вот мой код:

float Outcome;
    private void button1_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection();

    conn.ConnectionString = "Data Source=MJ-PC\\SQLEXPRESS;Initial Catalog=Users;Integrated Security=True";
    conn.Open();

    String txtUser = textBox1.Text;
    String txtPass = textBox2.Text;

    string query = "SELECT * FROM tblUsers WHERE U_Name=@U_Name AND U_Pass=@U_Pass AND U_Type=@type";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.Parameters.Add(new SqlParameter("@U_Name", txtUser));
    cmd.Parameters.Add(new SqlParameter("@U_Pass", txtPass));
    cmd.Parameters.Add(new SqlParameter("@type", type));

    SqlDataReader dr = cmd.ExecuteReader();

    if (textBox1.Text.Trim().Length == 0)
    {
        MessageBox.Show("Login Failed");
        Outcome = Convert.ToInt32(lblOutcome.Text);
        Outcome = Outcome - 1;
        textBox1.Clear();
        textBox2.Clear();

        lblOutcome.Text = Outcome.ToString();
        if (Outcome == 0)
        {
            MessageBox.Show("You have reached the maximum number of trial");
            this.Close();
        }
    }

    else if (textBox2.Text.Trim().Length == 0)
    {
        MessageBox.Show("Login Failed");
        Outcome = Convert.ToInt32(lblOutcome.Text);
        Outcome = Outcome - 1;
        textBox1.Clear();
        textBox2.Clear();

        lblOutcome.Text = Outcome.ToString();
        if (Outcome == 0)
        {
            MessageBox.Show("You have reached the maximum number of trial");
            this.Close();
        }
    }

    else if (dr.HasRows == true)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "Data Source=MJ-PC\\SQLEXPRESS;Initial Catalog=Users;Integrated Security=True";
        SqlCommand command = new SqlCommand("SELECT U_Name ='"+textBox1.Text+"', U_Pass = '" +textBox2.Text+"', U_Type = 1 FROM tblUsers",con);


        con.Open();
        SqlDataReader sdr = command.ExecuteReader();


        if ()
        {
            MessageBox.Show("Login Successful");
            MDIParent1 settingsForm = new MDIParent1();
            settingsForm.Show();
            this.Hide();
        }
        else
        {
            MessageBox.Show("Login Successful");
            MDIParent2 settingsForm = new MDIParent2();
            settingsForm.Show();
            this.Hide();
        }
    }


        else
        {
            MessageBox.Show("Login Failed");
            Outcome = Convert.ToInt32(lblOutcome.Text);
            Outcome = Outcome - 1;
            textBox1.Clear();
            textBox2.Clear();

            lblOutcome.Text = Outcome.ToString();
            if (Outcome == 0)
            {
                MessageBox.Show("You have reached the maximum number of trial");
                this.Close();
            }
        }
    }

Я хочу, чтобы выражение if здесь

  else if (dr.HasRows == true)
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Data Source=MJ-PC\\SQLEXPRESS;Initial Catalog=Users;Integrated Security=True";
            SqlCommand command = new SqlCommand("SELECT U_Name ='"+textBox1.Text+"', U_Pass = '" +textBox2.Text+"', U_Type = 1 FROM tblUsers",con);


            con.Open();
            SqlDataReader sdr = command.ExecuteReader();


            if ("@type"==1)
            {
                MessageBox.Show("Login Successful");
                MDIParent1 settingsForm = new MDIParent1();
                settingsForm.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Login Successful");
                MDIParent2 settingsForm = new MDIParent2();
                settingsForm.Show();
                this.Hide();
            }
        }

я действительно не знаю правильного синтаксиса для него. Помогите мне, пожалуйста, я бы очень признателен. Спасибо

Теги:
sql-server

2 ответа

2
Лучший ответ

У вас, грубо говоря, правильная идея, но ваша реализация отключена.

Вы проверяете текстовые поля после отправки SQL-запроса, но перед проверкой результатов вы также передаете тип пользователя.

Тип пользователя должен храниться в базе данных вместе с пользователем, и вы можете вернуть тип пользователя для соответствующей строки (на основе имени пользователя и пароля). И ваш синтаксис уходит в некоторых местах.

Упрощенный подход, основанный на том, что вы делаете, будет примерно таким:

Перед выполнением команды выполните проверку в текстовых полях. Если проверка прошла, выберите строку, соответствующую имени пользователя и паролю, и обработайте результаты соответственно:

private void button1_Click(object sender, EventArgs e)
{

    bool validInput = false;

    if (!String.IsNullOrWhitespace(textBox1.Text))
    {
        validInput = true;
    }
    else
    {
        MessageBox.Show("Please enter a user name.");
    }
    if (!String.IsNullOrWhitespace(textBox2.Text))
    {
        validInput = true;
    }
    else
    {
        MessageBox.Show("Please enter a password.");
    }

    if (validInput)
    {
        using (SqlConnection conn = new SqlConnection("Data Source=MJ-PC\\SQLEXPRESS;Initial Catalog=Users;Integrated Security=True"))
        {
            conn.Open();
            SqlCommand command = new SqlCommand("SELECT * FROM tblUsers WHERE U_Name = @U_Name AND U_Pass = @U_Pass", conn);
            command.Parameters.Add("@U_Name", SqlDbType.VarChar).Value = textBox1.Text;
            command.Parameters.Add("@U_Pass", SqlDbType.VarChar).Value = textBox2.Text;

            using (SqlDataReader reader = command.ExecuteReader())
            {

                if (reader.HasRows)
                {
                    reader.Read();
                    string userType = reader["U_type"].ToString();
                    if (userType == "1")
                    {
                        // Handle regular users
                    }
                    else if (userType == "2")
                    {
                        // Handle admin users
                    }

                }
                else
                {
                    MessageBox.Show("Login failed.");
                }
            }
        }
    }
}

Приведенный выше код иллюстрирует подход. Если оба текстовых поля имеют в них текст, флаг validInput имеет значение true. Затем соединение открывается, задаются команда и параметры, выполняется команда и возвращается читатель. Если у читателя есть строки (что означает 1 или более записей, совпадающих с именем пользователя и паролем), reader переходит к первой записи (должно быть только одно совпадение для данной комбинации имени пользователя и пароля).

Столбец "U_type" опрошен, чтобы узнать, является ли он обычным пользователем или администратором, и пользователь обрабатывается соответствующим образом.

Из вашего опубликованного кода неясно, является ли "U_type" строкой или целым числом; если это целое число, вам нужно будет преобразовать его так:

int userType = Convert.ToInt32(reader["U_type"]);

И измените соответствующие проверки:

if (userType == 1)

а также

if (userType == 2)
  • 0
    это инт. спасибо за помощь, я попробую этот код сразу
  • 0
    благодарю вас!!! код работал отлично :) спасибо, что научили меня
Показать ещё 1 комментарий
1

Если вы хотите аутентифицировать пользователя и сравнить тип, возвращайте DataTable.

 public DataTable ValidateUser(string username,string password)
    {
        DataTable dt = new DataTable();
        SqlCommand cmd; SqlDataReader dr;
        SqlConnection con = new SqlConnection(yourConnectionString);
        try
        {
            cmd = new SqlCommand();
            cmd.CommandText = "Select * from tblUsers where U_Name=@U_Name and U_Pass=@U_Pass";
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@U_Name", username);
            cmd.Parameters.AddWithValue("@U_Pass", password);
            cmd.Connection = con;
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            dr = cmd.ExecuteReader();
            dt.Load(dr);
        }
        catch (Exception ex)
        {
            dt = null;

        }
        finally
        {
            if (con.State != ConnectionState.Closed)
            {
                con.Close(); con.Dispose();
            }
        }
        return dt;
    }

Вызов метода ValidateUser:

DataTable dt=new DataTable();
dt=ValidateUser();
if(dt!=null && dt.Rows.Count>0)
{
    if(Convert.ToInt32(dt.Rows.[0]["U_Type"])==1)
    {
       //show form for user where utpe=1
    }
    else if(Convert.ToInt32(dt.Rows.[0]["U_Type"])==2)
   {
       //show form for user where utype=1
    }
    else
    {
       //otherstuff
    }
}
else
{
 //invwalid user
}

надеюсь это поможет

  • 0
    попробую, спасибо
  • 0
    что это за ConnectionStringBiz ??
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню