【发布时间】:2016-10-14 07:33:28
【问题描述】:
如您所见,如果字段中没有值或与数据库中的信息不匹配,我想捕获用户篡改登录按钮的异常。
例如: 该字段没有值,我单击登录按钮一次,它说错误。单击确定按钮后,我再次单击登录按钮,现在它说, “ExecuteReader 需要一个打开且可用的连接。连接的当前状态为关闭。”
我使用 3 层架构 Windows 应用程序。
比利时:
public SqlDataReader Login(BELLogin bellog)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = Con.getcon();
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);
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
BAL:
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;
}
图形界面:
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();
}
登录没问题,但如果用户篡改了按钮怎么办? 谢谢你帮助我:D
【问题讨论】:
-
那似乎有 4 层?只是说
-
第一次从
ExeReader方法调用getcon方法是多余的,因为它在下一行再次调用,这次分配返回值。您应该删除不必要的呼叫。我进一步建议检查此代码是否存在“过度工程”... -
1.不要重复使用这样的连接,这是不好的做法并且没有必要。 2. 将所有实现
IDisposable的类型实例包装在using块中,以便释放资源。在你的情况下SqlConnection,SqlCommand,SqlDataReader,DataTable。见Best Practices - Executing Sql Statements。 -
从安全的角度来看,您应该从不存储您的用户密码(任何地方,不是数据库,不是文件,不是注册表等,只是不要存储它们)。您需要存储哈希值,而不是密码,然后比较哈希值。
-
你的设计真的很糟糕。
标签: c# .net sql-server-2014