Я создаю форму для входа в систему и хочу добавить учетную запись пользователя и администратора. что я сделал в своей базе данных, это создать таблицу для моих пользователей с определенным типом пользователя. 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-запроса, но перед проверкой результатов вы также передаете тип пользователя.
Тип пользователя должен храниться в базе данных вместе с пользователем, и вы можете вернуть тип пользователя для соответствующей строки (на основе имени пользователя и пароля). И ваш синтаксис уходит в некоторых местах.
Упрощенный подход, основанный на том, что вы делаете, будет примерно таким:
Перед выполнением команды выполните проверку в текстовых полях. Если проверка прошла, выберите строку, соответствующую имени пользователя и паролю, и обработайте результаты соответственно:
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)
Если вы хотите аутентифицировать пользователя и сравнить тип, возвращайте 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
}
надеюсь это поможет