Ошибка входа
Как вы можете видеть, я хочу поймать исключение public SqlDataReader Login ( BELLogin bellog ) { SqlCommand cmd = new SqlCommand (); cmd . Соединение = Кон . getcon (); cmd . CommandType = CommandType . Текст ; cmd . CommandText = "SELECT имя пользователя, пароль FROM tbl_login WHERE username = @Username AND password = @Password" ; cmd . Параметры . AddWithValue ( "@Username" , bellog . Acctname ); cmd . Параметры . AddWithValue ( «@Password» , bellog . Пароль ); SqlDataReader dr = cmd . ExecuteReader (); return dr ; } пользователь подделывает кнопку входа в систему, если в полях нет значений или если они не соответствуют информации в базе данных.
Например: поле не имеет значений, и я один раз нажимаю кнопку «Вход», это говорит об ошибке. После того, как я нажал кнопку «ОК», я снова нажму кнопку «Логин», и теперь он говорит: «ExecuteReader требует открытого и доступного соединения. Текущее состояние подключения закрыто».
Я использую 3-х уровневое приложение для архитектуры Windows.
BEL:
public class BELLogin
{
public string Acctname { get; set; }
public string Password { get; set; }
}
БАЛ:
public SqlConnection getcon()
{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
else if (con.State == System.Data.ConnectionState.Open)
con.Close();
return con;
}
public DataTable ExeReader(SqlCommand cmd)
{
getcon();
cmd.Connection = getcon();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
return dt;
}
DBConnection:
private void btn_login_Click(object sender, EventArgs e)
{
BELog.Acctname = txb_accName.Text;
BELog.Password = txb_password.Text;
SqlDataReader dr;
dr = BALog.Login(BELog);
if (txb_accName.Text == "" || txb_password.Text == "")
{
MessageBox.Show("Some fields are empty. Please fill up all fields before clicking LOGIN button.", "Login Status", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (dr.HasRows == true)
{
dr.Read();
Inventory Inv = new Inventory();
Inv.Show();
this.Hide();
}
else
{
MessageBox.Show("You have entered your password or account name incorrectly. Please check your password and account name and try again.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
dr.Close();
}
GUI:
public BELLogin Login(BELLogin bellog)
{
SqlConnection conn = new SqlConnection(connectionsString);
try
{
using (SqlCommand cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT username,password FROM tbl_login WHERE username = @Username AND password = @Password";
cmd.Parameters.AddWithValue("@Username", bellog.Acctname);
cmd.Parameters.AddWithValue("@Password", bellog.Password);
//really this should be in a using as well.
//You be better off reading your data
//into a class and returnig the class not the reader.
using (SqlDataReader dr = cmd.ExecuteReader())
{
BELLogin obj = new BELLogin();
while(dr.Read())
{
//populate obj
}
return obj;
}
}
}
finally
{
conn.Close();
conn.Dispose();
}
}
Вход в систему в порядке, но что, если пользователь подделывает кнопку? Спасибо, что помогли мне: D