数据库设计相当简单,就一个数据库然后又张存着用户名和密码的表。
数据库设计:

数据库名称:threeLayer

表: users

列:1.username 账号   2.password  密码

数据库创建表的脚本如下:

[sql] view plain copy
  1. CREATE TABLE [dbo].[users](
  2. [id] [int] IDENTITY(1,1) NOT NULL,
  3. [username] [varchar](50) NULL,
  4. [password] [varchar](50) NULL,
  5. CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
  6. (
  7. [id] ASC
  8. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]
  9. ON [PRIMARY]
  10. GO
  11. SET ANSI_PADDING OFF
  12. GO
  13. SET IDENTITY_INSERT [dbo].[users] ON
  14. INSERT [dbo].[users] ([id], [username], [password]) VALUES (1, N'admin', N'admin')
  15. INSERT [dbo].[users] ([id], [username], [password]) VALUES (2, N'user1', N'user1')
  16. INSERT [dbo].[users] ([id], [username], [password]) VALUES (3, N'user2', N'user2')
  17. INSERT [dbo].[users] ([id], [username], [password]) VALUES (4, N'user3', N'user3')
  18. SET IDENTITY_INSERT [dbo].[users] OFF

三层数据传递整体思路:

用户输入账号密码->点击登录->进入BLL层进行输入与数据的逻辑处理->进入DAL层将BAL层的逻辑进行实现(用户输入的账号的密码与数据库匹配),返回结果

其中数据的传递用model实体类属性来传递

步骤:

  1. 新建一个windows 窗体应用程序项目并命名为threeLayerText,路径自己选吧,可以选择回收站
  2. 在自动新建的窗体项目中,双击Form1.cs,打开窗体设计。
  3. 在窗体中添加两个label,两个TextBox分别命名为textBoxAccount、textBoxtextBoxPsw和一个button 命名为 butLogin。这里命名指的是控件name属性
  4. 为窗体添加一个应用配置文件:右键窗体项目文件-添加-新建项-应用程序配置文件
    1. 在配置文件<configuration>节点中添加数据库连接语句
    2. 根据数据库配置Initial Catalog 为数据库名称,User ID 为登录数据库账户,Password 为改账号密码
      添加后app.config完整内容如下

      [html] view plain copy
      1. <?xml version="1.0" encoding="utf-8" ?>
      2. <configuration>
      3. <connectionStrings>
      4. <add name="dbConnection" connectionString="Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123"
      5. providerName="SQLClient" />
      6. </connectionStrings>
      7. </configuration>
  5. 添加类库:右键项目解决方案-添加-新建项目-类库,命名,确定
    1. 分别添加DAL、BLL、Model三个类库
  6. 在Model类库中添加userInfo类,用于在各个层之间传递数据
    1. 在类库中新建一个用户类 userInfo:右键Model类库-添加-类(或者选中model类库,使用shift+alt+c快捷键)
    2. 在userInfo类中添加属性
      [csharp] view plain copy
      1. private string _username;
      2. private string _psw;
      3. public string username
      4. {
      5. set { _username = value; }
      6. get { return _username; }
      7. }
      8. public string psw
      9. {
      10. set { _psw = value; }
      11. get { return _psw; }
      12. }
    3. Model类完整代码如下:
      [csharp] view plain copy
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. namespace Model
      6. {
      7. public class userInfo
      8. {
      9. private string _username;
      10. private string _psw;
      11. public string username
      12. {
      13. set { _username = value; }
      14. get { return _username; }
      15. }
      16. public string psw
      17. {
      18. set { _psw = value; }
      19. get { return _psw; }
      20. }
      21. }
      22. }
  7. 在DAL层中添加数据连接、查询操作类和方法
    1. 添加system.configuration引用,使类可以读取配置文件节点,读取配置文件中连接数据库语句;右键引用-添加引用-选择程序集-勾选-确定
    2. 添加 DBbase类(右键DAL项目-添加-新建项-命名好-确定) 用于连接数据库,添加System.Data 和 System.Data.SqlClient 命名空间,别问我用来干吗,其实我也不知道用来干吗的。
      创建一个基本的查询方法用于查询并返回记录条数。DBbase类完整代码如下:

      [csharp] view plain copy
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. using System.Data;
      6. using System.Data.SqlClient;
      7. namespace DAL
      8. {
      9. public class DBbase
      10. {
      11. //读取配置文件 连接数据库语句
      12. public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
      13. //public static string strCon = "Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123";
      14. //实例化连接对象 con
      15. SqlConnection con = new SqlConnection(strCon);
      16. //检测连接是否打开
      17. public void chkConnection()
      18. {
      19. if (this.con.State == ConnectionState.Closed)
      20. {
      21. this.con.Open();
      22. }
      23. }
      24. //执行语句,返回该语句查询的数据行的总数
      25. public int returnRowCount(string strSQL)
      26. {
      27. chkConnection();
      28. try
      29. {
      30. SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
      31. DataSet ds = new DataSet();
      32. da.Fill(ds);
      33. return ds.Tables[0].Rows.Count;
      34. }
      35. catch
      36. {
      37. return 0;
      38. }
      39. }
      40. }
      41. }
    3. 添加 userAccess类(右键DAL项目-添加-新建项-命名好-确定) 用执行查询语句查找用户输入账号密码在数据库中存在记录条数
      userAccess类完整代码如下:

      [csharp] view plain copy
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. namespace DAL
      6. {
      7. public class userAccess
      8. {
      9. //实例化DBbase 对象
      10. DBbase db = new DBbase();
      11. //用户登录的方法
      12. public int userLogin(string name, string psw)
      13. {
      14. string strsql = "select * from users where username = '" + name + "' and password = '" + psw + "'";
      15. return db.returnRowCount(strsql);
      16. }
      17. }
      18. }
  8. 在BLL层中添加用户输入数据与数据库匹配的逻辑代码
    1. 添加Model、DAL类库引用:右键BLL类库中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、DAL-确定
    2. 实例化DAL.userAccess 类,并新建一个方法调用DAL.userAccess方法,参数为Model实体类中的useInfo类,完整代码如下:
      [csharp] view plain copy
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. namespace BLL
      6. {
      7. public class userAccess
      8. {
      9. DAL.userAccess d_userAccess = new DAL.userAccess();
      10. public int userLogin(Model.userInfo m_userInfo)
      11. {
      12. return d_userAccess.userLogin(m_userInfo.username, m_userInfo.psw);
      13. }
      14. }
      15. }
  9. 回到窗体设计中,添加用户输入处理与调用BLL层方法
    1. 添加Model、DAL类库引用:右键threeLayerText项目中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、BLL-确定
    2. 打开窗体后台代码,实例化Model.userInfo 、BLL.userAccess。代码如下
      [csharp] view plain copy
      1. //实例化model层中 userInfo类用于传递数据
      2. Model.userInfo m_userInfo = new Model.userInfo();
      3. //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
      4. BLL.userAccess b_userAccess = new BLL.userAccess();
    3. 双击登录按钮,添加点击事件。代码如下
      [csharp] view plain copy
      1. //将用户输入的账号密码 赋值给userInfo类 username、psw属性
      2. m_userInfo.username = textBoxAccount.Text.Trim().ToString();
      3. m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
      4. //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
      5. if (b_userAccess.userLogin(m_userInfo) > 0)
      6. {
      7. MessageBox.Show("登录成功");
      8. }
      9. else
      10. {
      11. MessageBox.Show("登录失败");
      12. }
    4. 完整Form1.cs 代码如下
      [csharp] view plain copy
      1. using System;
      2. using System.Collections.Generic;
      3. using System.ComponentModel;
      4. using System.Data;
      5. using System.Drawing;
      6. using System.Linq;
      7. using System.Text;
      8. using System.Windows.Forms;
      9. namespace threeLayerText
      10. {
      11. public partial class Form1 : Form
      12. {
      13. //实例化model层中 userInfo类用于传递数据
      14. Model.userInfo m_userInfo = new Model.userInfo();
      15. //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
      16. BLL.userAccess b_userAccess = new BLL.userAccess();
      17. public Form1()
      18. {
      19. InitializeComponent();
      20. }
      21. private void Form1_Load(object sender, EventArgs e)
      22. {
      23. }
      24. //登录按钮 事件
      25. private void butLogin_Click(object sender, EventArgs e)
      26. {
      27. //将用户输入的账号密码 赋值给userInfo类 username、psw属性
      28. m_userInfo.username = textBoxAccount.Text.Trim().ToString();
      29. m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
      30. //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
      31. if (b_userAccess.userLogin(m_userInfo) > 0)
      32. {
      33. MessageBox.Show("登录成功");
      34. }
      35. else
      36. {
      37. MessageBox.Show("登录失败");
      38. }
      39. }
      40. }
      41. }
  10. 保存,可以调试了。

关于Model实体层的描述:
Model 又叫实体类,这个东西,大家可能觉得不好分层。我是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL,如此则认为Model在各层之间起到了一个数据传输的桥梁作用。不过在这里,我们不是把事情想简单,而是想复杂了。

winform 三层(BLL.DAL.MODEL)相关推荐

  1. C# 三层架构搭建详解(BLL DAL Model)

    C# 三层架构搭建详解(BLL DAL Model) 1.建立好方案 在方案上右键 用上面的方法添加三个类库:DAL(数据访问层) BLL(业务逻辑层) Model(模型层) 注意要按顺序添加引用 D ...

  2. C#_三层(BLL DAL Model)架构详解

    C#_三层架构详解 三层架构: 表现层(UI).业务逻辑层(BLL).数据访问层(DAL)再加上实体类库(Model) 表现层(UI):一般都是窗体的设计或者网页的设计,是可以一眼就可以看到的界面. ...

  3. EF 三层 BLL DAL

    项目图片 DAL 增 using EF.Entity; using System; using System.Collections.Generic; using System.Linq; using ...

  4. ASP.NET的三层架构(DAL,BLL,UI)

    BLL   是业务逻辑层   Business   Logic   Layer DAL   是数据访问层   Data   Access   Layer ASP.NET的三层架构(DAL,BLL,UI ...

  5. MVC中Model BLL层Model模型互转

    MVC中Model BLL层Model模型互转 一. 模型通常可以做2种:充血模型和失血模型,一般做法是模型就是模型,不具备方法来操作,只具有属性,这种叫做失血模型(可能不准确):具备对模型一定的简单 ...

  6. ASP.NET 常见参考项目的 UI、BLL 、Model 、 DAL 分析

    应用/项目名称 UI层实现 Business Model & Logic Layer 实现 Data Access Layer 实现 Personal Web Site Starter Kit ...

  7. Winform 三层架构小例子

    在web开发中常常用到工厂模式三层架构,现在也在Winform中应用这种架构方式,尝试了很多,也模仿了经典例子PetShop,但是还是不行,也参考了网上的一些例子.现在把我这个例子的整个制作过程简单的 ...

  8. [.NET 三层架构(ADO.NET)+Web Service+多语言]WinForm三层架构重新实现TaskVision,外加WebService提供数据和多语言...

    前言: 关于不同框架实现同一个TaskVision: 前面DebugLZQ先是用WPF(没有使用MVVM,因为前面使用MVVM实现过过点餐系统),因而这个关键点就放在了WPF的Binding上面: 然 ...

  9. 【转】谈谈三层架构中MODEL的作用

    Model又叫实体类,这个东西,大家可能觉得不好分层.包括我以前在内,是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL ...

最新文章

  1. 【中级软考】计算能力足够强大,所有加密算法原理上都会被破解吗?
  2. 高级程序员值得一看的33本编程书籍
  3. (转)离散化:两种离散化方式详解
  4. 【HDU - 4509】湫湫系列故事——减肥记II(合并区间模板 or 离散化标记 or 线段树)
  5. 今天研究了一下关于Asp.net文件上传时的内存消耗问题
  6. qt翻译--QDragMoveEvent拖放类
  7. 反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)加入自己的思考(pytorch函数)(二)
  8. Xshell上传文件【转】
  9. handler 与message的一些理解
  10. Nginx作为静态资源服务器
  11. nodejs轻量型个人文档管理系统
  12. 厦门大学计算机学院控制系,厦门大学
  13. charles android 抓取https 出现unknown简单明了的解决教程
  14. Python .format()的详细使用(英文版)
  15. 计算机控制系统第2次作业,201609计算机控制系统作业2
  16. 计算机之大尾数、小尾数
  17. 阿里P8传授给小老弟的Java面试宝典,竟让让小弟也拿到了P8的offer,傻眼了
  18. TCP的三个窗口:发送窗口swnd、接收窗口rwnd、拥塞窗口cwnd
  19. AngularJS中的谷歌地图开发
  20. 干测试三年,我对数据库那可是一脸懵逼!

热门文章

  1. 希腊字母表__手写 拍照版
  2. 2018.1.7 计算机算法课后习题总结
  3. 大一第一学期期末C语言程序设计笔记(五)
  4. SpringBoot+Vue项目校园二手交易平台
  5. 反向题在测试问卷信效度_如何确认问卷(考卷)的信度与效度?
  6. vue之vue的生命周期、swiper、自定义组件的封装、自定义指令、过滤器、单文件组件及vue-cli
  7. Python3-豆瓣电影影片差评和影片封面照片的爬取
  8. 计算机考证可直接考二级吗
  9. Android震动vibrator(马达)--系统到驱动的流程【转】
  10. 【名企笔试】小米实习生招聘(风口的猪)