前言:
上篇博客为大家详细讲解了三层的理论知识,这篇文章就由小编带领大家来实践一番吧!
建立以下的Windows应用程序以及类库,并按照上篇文章介绍的三层架构引用原则对其进行引用:
在UI层建立窗体:
代码展示:
UI层:
private void btnLogin_Click(object sender, EventArgs e)
{
//IDbConnection conn = new SqlConnection("c......"); //单层
//IDbConnection cmd = conn.CreateCommand();
//cmd.CommandText = "Select UserName From USERS WHERE...";
//cmd.ExecuteReader();
string userName=txtUserName.Text.Trim();
string password=txtPassword.Text;
//取出用户界面的数据
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
Login.Model.UserInfo user = mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}
B层:
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//构建D层UserDAO实例
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
if (user != null) //如果数据库中没有数据,即为首次登陆了,增加10积分
{
Login.DAL.ScoreDAO sDao = new DAL.ScoreDAO();
sDao.UpdateScore(userName,10);
return user;
}
else
{
throw new Exception("登录失败。");
}
}
D层:
public Login.Model.UserInfo SelectUser(string userName, string password)
// 根据UI,选择返回一个user
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//创建一个命令对象,并添加命令
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SElECT ID,UserName,Password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Password", password));
conn.Open(); //打开数据连接
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;
while (reader.Read())
{
if (user == null)
{
user=new Login.Model.UserInfo();
}
user.ID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);//not suggestion
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
public class ScoreDAO
{
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values (@UserName,@Score)";
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
小结:
通过代码对三层的理解更加深入了,特别是其中互相引用的关系。在三层结构中,各层之间相互依赖,表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。根据功能需求,从下而上设计,实际运行时,从上而下调用。
学习永无止境,让我们继续加油吧!