Winform三层架构以登录为例

  

三层架构的设计模式中,所谓的分层架构是为了使各层之间互不干扰。一旦哪一层的结构发生了变化,只需改变相应层上的代码而其他层则无需改变。可以增强代码的重用性。
三层架构由底自上分别是数据访问层(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.注意三层架构的正确搭建,及对各个层正确编译之后才能执行引用。操作:在解决方案窗口,右击层名,选“生成”完成编译操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值