三层架构的设计模式中,所谓的分层架构是为了使各层之间互不干扰。一旦哪一层的结构发生了变化,只需改变相应层上的代码而其他层则无需改变。可以增强代码的重用性。
三层架构由底自上分别是数据访问层(DAL)、业务逻辑层(BLL)和表示层(PL或UI)。
数据访问层:主要提供数据库中所有数据表信息的存储和查询功能。一般对数据库操作的代码都在该层上完成。如:执行数据库连接、SOL语句和存储过程的实现等。
业务逻辑层:提供所有和数据库之间的操作。例如向数据库中返回数据信息或从数据库相应的表中返回数据集(DataSet)等。
表示层:提供给用户一种交互式的界面。在winform中,主要以窗体呈现。
实体类(Model):特殊的一层,用于实现各层数据的传送。
三层架构的搭建需要在“解决方案资源管理器”中建立3个项目,分别是数据访问层、业务逻辑层和表示层(即winform页面),另外从结构上考虑,还需要一个与数据库中表相对应的实体类,用于实现各层数据的传送。
以用户登录为例:
1.创建实体层
实体层是与数据库中表的相互对应关系。数据表User的结构
在新建“项目”的其他项目类型下,选“空白解决方案”(命名为userLogin),在解决方案的项目名称上单击鼠标右键,选择“添加”\“新建项目”,如图所示。打开“添加新项目”对话框,选择“类库”,并命名为“Model”
在Model类库创建类,命名为"UserInfo",实体层代码如下:
Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model
{
public class UserInfo
{
public string username { get; set; }
public string password { get; set; }
public string sex { get; set; }
public string email { get; set; }
}
}
2.创建数据访问层
在解决方案的项目名称上单击鼠标右键,选择“添加”\“新建项目”。在DAL类库,创建类,命名“UserDal”,再创建一个“SqlHelper”类
添加引用
代码如下:
UserDal
using Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class UserDal
{
//登录
public int Login(UserInfo user)
{
string sql = "select * from [User] where username=@username and userpwd=@pwd";
SqlParameter[] sqlParameters =
{
new SqlParameter("username",user.username),
new SqlParameter("pwd",user.password)
};
return SqlHelper.countData(sql, sqlParameters);
}
//查询用户
public DataSet GetUser()
{
string sql = "select * from [User]";
SqlParameter[] sqlParameters = new SqlParameter[] { };
return SqlHelper.getDataSet(sql,sqlParameters);
}
}
}
SqlHelper
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
internal class SqlHelper
{
private static SqlCommand createCmd(string strSql, SqlParameter[] sqlParameters)
{
string constr = "server=.;database=UserLogin;uid=sa;pwd=123456";
SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand cmd = new SqlCommand(strSql, con);
if (sqlParameters != null)
{
cmd.Parameters.AddRange(sqlParameters);
}
return cmd;
}
/// <summary>
/// 查询
/// </summary>
/// <param name="strSql"></param>
/// <param name="sqlParameters"></param>
/// <returns></returns>
public static DataSet getDataSet(string strSql, SqlParameter[] sqlParameters)
{
SqlCommand cmd = createCmd(strSql, sqlParameters);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds;
}
/// <summary>
/// 增删改
/// </summary>
/// <param name="strSql"></param>
/// <param name="sqlParameters"></param>
/// <returns></returns>
public static int operateData(string strSql, SqlParameter[] sqlParameters)
{
try
{
SqlCommand cmd = createCmd(strSql, sqlParameters);
return cmd.ExecuteNonQuery();
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// 查询返回一条数据
/// </summary>
/// <param name="strSql"></param>
/// <param name="sqlParameters"></param>
/// <returns></returns>
public static int countData(string strSql, SqlParameter[] sqlParameters)
{
try
{
SqlCommand cmd = createCmd(strSql, sqlParameters);
if (cmd.ExecuteScalar() == null)
{
return 0;
}
else
{
return int.Parse(cmd.ExecuteScalar().ToString());
}
}
catch (Exception)
{
return 0;
}
}
}
}
3.创建业务逻辑层
在解决方案的项目名称上单击鼠标右键,选择“添加”\“新建项目”。在BLL类库,创建类,命名“UserBll”
UserBll
添加引用
代码如下:
using DAL;
using Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BLL
{
public class UserBll
{
//登录
public bool Login(UserInfo user)
{
UserDal dal = new UserDal();
if (dal.Login(user)>0)
{
return true;
}
else
{
return false;
}
}
//查询用户
public DataSet GetUser()
{
UserDal user = new UserDal();
return user.GetUser();
}
}
}
4.创建表现层
添加引用
窗体设计
1.FrmLogin
代码:
using BLL;
using Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace userLogin
{
public partial class FrmLogin : Form
{
public FrmLogin()
{
InitializeComponent();
}
FrmMain frm=new FrmMain();
private void btnLogin_Click(object sender, EventArgs e)
{
UserInfo model=new UserInfo();
UserBll bll = new UserBll();
model.username=txtName.Text;
model.password=txtPwd.Text;
if (bll.Login(model))
{
if (IsDisposed)
{
frm = new FrmMain();
}
Hide();
frm.Show();
}
else
{
MessageBox.Show("登录失败,请检查用户或密码");
}
}
}
}
2.FrmMain
窗体设计
代码:
using BLL;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace userLogin
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void FrmMain_Load(object sender, EventArgs e)
{
UserBll user = new UserBll();
dataGridView1.DataSource = user.GetUser().Tables[0];
}
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
}
}
5.登录的效果图
提示:
1.注意三层架构各个层之间的引用关系是:UI->BLL->DAL,具体设置项目依赖的关系如下:DAL引用Model实体层;BLL引用DAL和Model实体层;表示层(UI)引用BLL和Model实体层。
2.注意三层架构的正确搭建,及对各个层正确编译之后才能执行引用。操作:在解决方案窗口,右击层名,选“生成”完成编译操作。