C#三层架构登陆实例

原创 2014年05月01日 10:45:38

    很早之前,就听说过三层结构了。当时只知道 三层结构 是把 系统的 界面  跟 数据库操作等不相关的程序分别开来。原来这么简单的实现,确实传说中的 三层结构啊。

    首先,先来看一下是哪三层。表示层(UI,User Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data Access Layer)。三层的划分是物理上的划分。

 

    表示层(UI),这个最容易理解,就是用户看到的主界面。

    数据访问层(DAL),也不难理解,主要是负责数据的增删改查。

    业务逻辑层(BLL),算是表示层和数据访问层的桥梁吧。里面主要存放一些业务流程。也就是逻辑。主要作用就是从DAL中获取数据,然后显示到UI上。

 

    举一个例子,三层结构可以用饭店的实例来理解。

    UI指的是服务员,BLL是厨师,DAL是采购员。

    在顾客的眼里,只能看到服务员为他们服务。并不知道后台厨师和采购员是如何做的。对于上述三种不同的角色来说,无论哪个环节出了问题,只需要更换一个员工就可以照常营业的。

三层架构的优势,还是职责分离,降低耦合。

 

    接下来,看一个使用三层结构的登陆实例。首先,需要声明一下。这个实例中有很多bug需要优化。不过对于展示三层的主要思想足够了。仅仅是一个实例而已。

数据库表:

    这是数据模块图:

    细心的读者肯定会发现,除了UI,BLL,DAL这三个之外还有一个Moudel存在,这个Moudel不属于任何一层,只是为了更好地链接三层而存在的。这个类只存储,与以上三类共同使用的东西。起一个协调的作用。Moudel类,也就是实体类。

    下面是这几个层次的关系。

接下来需要看一下,他们分别是如何实现各自的分工的。

Entity类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Model
{
    public class UserInfo       //实体类,用于保存用户信息
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}


U层:

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 LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                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);
            }
            catch (Exception ex)   //如果登陆有异常 则登陆失败
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}


B层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.BLL    //业务逻辑层
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string Password)
        {
            ///throw new NotImplementedException();
            Login.DAL.UserDAO uDAO = new Login.DAL.UserDAO();  //创建一个user
            Login.Model.UserInfo user= uDAO.SelectUser(userName, Password);  //通过ui中填写的内容 返回来相应的数据

            if (user!= null)        //如果数据库中没有数据,即为首次登陆了。增加10积分
            {
                Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO(); 
                sDAO.UpdateScore(userName, 10);
                return user;
            }
            else       //如果数据库中没有该用户名,则登陆失败
            {                 
                throw new Exception("登陆失败");
            }
        }
    }
}


 


D层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.DAL     //数据访问层
{
    class DbUtil        //用于保存 链接服务器的sql语句
    {
        public static string ConnString = @"Server=zc-pc;Database=Login;User ID=sa; Password=123456";
    }
}


 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace Login.DAL
{
    public class UserDAO
    {
        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);
                    if(!reader.IsDBNull(3))         //不要求一定要有email,也可以返回
                    {
                        user.Email=reader.GetString(3);
                    }                    
                }
                return user;
            }
            
        }
    }
}


 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace Login.DAL
{
    public class ScoreDAO     //首次登陆,增加10积分
    {
        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)";  //修改Score表数据
                cmd.Parameters.Add(new SqlParameter("@userName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}

 

接下来,看一下执行结果:

执行成功的情况:

输入错误信息:

 

    虽然这是一个很小的实例,但是用来学习三层却足够了。有写的不好的地方可以理解。

    总结:对于使用三层架构的程序来说,哪层出错改哪里。极大程度的降低了系统的耦合性。当然,具有层次的程序,维护起来必然要方便许多。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

三层架构下实现用户登陆C#

上篇文章讲到三层。接下来就通过一个实例具体的看怎么用三层实现用户登陆界面。   一、Model实体(LoginModel):          namespace LoginModel { ...

三层架构之数据库访问层完全篇(C#)

 三层架构之数据库访问层完全篇(C#)  using System; using System.Data; using System.Data.SqlClient; using System.Conf...

用三层架构来做winform程序

三层架构是一种代码分层思想,简单的说就是将一个项目分为界面展示、业务逻辑、数据访问三层,各层之间保持一定的独立性,降低代码之间的耦合性,这样做的好处是显而易见的: 1、各层之间的改动不会影响到其他层(...
  • clb929
  • clb929
  • 2017年01月09日 22:56
  • 3607

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C# 使用三层架构实例演示-winForm 窗体登录功能

数据库: 名称:threeLayer 表:

深入浅出C#三层架构

深入浅出C#三层架构 原文出处:http://blog.csdn.net/l0veit/article/details/7758012 本文用一个示例来介绍如何建设一个三层架构的项目,并说明项...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C#中三层架构UI、BLL、DAL、Model实际操作

三层架构分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 ...
  • eyoonet
  • eyoonet
  • 2016年09月15日 15:50
  • 7396

C#三十六 三层架构的实现

2.1 使用DataSet构建三层结构            开发三层结构应用系统时,在表示层、业务逻辑层、数据访问层各层中如何使用DataSet呢?DataSet在三层结构中的层次如下图所示:...

C#学习之三层架构实例

如有雷同,不胜荣欣,如转载,请注明
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#三层架构登陆实例
举报原因:
原因补充:

(最多只允许输入30个字)