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

小弟第一次写博客,写的不好或者有什么不对的地方。欢迎大家批评指正。大笑

什么是三层架构?百度百科讲的很详细,大家可以去搜索。这篇文章并不是讨论这个问题。而是通过一个例子帮助大家理解三层。理论上的东西讲的比较少。希望可以帮助到像我这样的小白学习。希望可以帮助到大家!

个人觉得这个例子还是很基础的,但是也可以帮助大家理解三层的设计理念。完成了这个小例子之后,你可以轻松的创建拥有相同功能的asp页面,而不需要更改太多的代码,因为代码处理的逻辑与数据操作已经实现了,只需更改网页空间属性及调用方法即可,同时帮助了解分层的便利性。至于三层的缺陷,大家可以在以后的开发中慢慢了解。

好了废话不说了,下面我们就直接开始正文吧。


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

数据库名称:threeLayer    

表: users     

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

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

CREATE TABLE [dbo].[users](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[username] [varchar](50) NULL,
	[password] [varchar](50) NULL,
 CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[users] ON
INSERT [dbo].[users] ([id], [username], [password]) VALUES (1, N'admin', N'admin')
INSERT [dbo].[users] ([id], [username], [password]) VALUES (2, N'user1', N'user1')
INSERT [dbo].[users] ([id], [username], [password]) VALUES (3, N'user2', N'user2')
INSERT [dbo].[users] ([id], [username], [password]) VALUES (4, N'user3', N'user3')
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完整内容如下
      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <connectionStrings>
          <add name="dbConnection" connectionString="Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123"
                providerName="SQLClient" />
        </connectionStrings>
      </configuration>

  5. 添加类库:右键项目解决方案-添加-新建项目-类库,命名,确定
    1. 分别添加DAL、BAL、Model三个类库

  6. 在Model类库中添加userInfo类,用于在各个层之间传递数据
    1. 在类库中新建一个用户类 userInfo:右键Model类库-添加-类(或者选中model类库,使用shift+alt+c快捷键)
    2. 在userInfo类中添加属性
      private string _username;
      private string _psw;
      
      public string username
      {
            set { _username = value; }
            get { return _username; }
      }
      public string psw
      {
            set { _psw = value; }
            get { return _psw; }
      }
    3. Model类完整代码如下:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace Model
      {
          public class userInfo
          {
              private string _username;
              private string _psw;
      
              public string username
              {
                  set { _username = value; }
                  get { return _username; }
              }
              public string psw
              {
                  set { _psw = value; }
                  get { return _psw; }
              }
          }
      }
      

  7. 在DAL层中添加数据连接、查询操作类和方法
    1. 添加system.configuration引用,使类可以读取配置文件节点,读取配置文件中连接数据库语句;右键引用-添加引用-选择程序集-勾选-确定


    2. 添加 DBbase类(右键DAL项目-添加-新建项-命名好-确定) 用于连接数据库,添加System.Data 和 System.Data.SqlClient 命名空间,别问我用来干吗,其实我也不知道用来干吗的。
      创建一个基本的查询方法用于查询并返回记录条数。DBbase类完整代码如下:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Data;
      using System.Data.SqlClient;
      
      namespace DAL
      {
          public class DBbase
          {
              //读取配置文件 连接数据库语句
              public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
              //public static string strCon = "Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123";
              
              //实例化连接对象 con
              SqlConnection con = new SqlConnection(strCon);
      
              //检测连接是否打开
              public void chkConnection()
              {
                  if (this.con.State == ConnectionState.Closed)
                  {
                      this.con.Open();
                  }
              }
      
              //执行语句,返回该语句查询的数据行的总数
              public int returnRowCount(string strSQL)
              {
                  chkConnection();
                  try
                  {
                      SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
                      DataSet ds = new DataSet();
                      da.Fill(ds);
                      return ds.Tables[0].Rows.Count;
                  }
                  catch
                  {
                      return 0;
                  }
              }
          }
      }
      
    3. 添加 userAccess类(右键DAL项目-添加-新建项-命名好-确定) 用执行查询语句查找用户输入账号密码在数据库中存在记录条数
      userAccess类完整代码如下:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace DAL
      {
          public class userAccess
          {
              //实例化DBbase 对象
              DBbase db = new DBbase();
      
              //用户登录的方法
              public int userLogin(string name, string psw)
              {
                  string strsql = "select * from users where username = '" + name + "' and password = '" + psw + "'";
                  return db.returnRowCount(strsql);
              }
          }
      }
      


  8. 在BLL层中添加用户输入数据与数据库匹配的逻辑代码
    1. 添加Model、DAL类库引用:右键BLL类库中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、DAL-确定
    2. 实例化DAL.userAccess 类,并新建一个方法调用DAL.userAccess方法,参数为Model实体类中的useInfo类,完整代码如下:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text; 
      
      namespace BLL
      {
          public class userAccess
          {
              DAL.userAccess d_userAccess = new DAL.userAccess();
              public int userLogin(Model.userInfo m_userInfo)
              {
                  return d_userAccess.userLogin(m_userInfo.username, m_userInfo.psw);
              }
          }
      }
      
  9. 回到窗体设计中,添加用户输入处理与调用BLL层方法
    1. 添加Model、DAL类库引用:右键threeLayerText项目中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、BLL-确定

    2. 打开窗体后台代码,实例化Model.userInfo 、BLL.userAccess。代码如下
      //实例化model层中 userInfo类用于传递数据
      Model.userInfo m_userInfo = new Model.userInfo();
      
      //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
      BLL.userAccess b_userAccess = new BLL.userAccess();

    3. 双击登录按钮,添加点击事件。代码如下
      //将用户输入的账号密码 赋值给userInfo类 username、psw属性
      m_userInfo.username = textBoxAccount.Text.Trim().ToString();
      m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
      
      //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
      if (b_userAccess.userLogin(m_userInfo) > 0)
      {
         MessageBox.Show("登录成功");
      }
      else
      {
         MessageBox.Show("登录失败");
       }
    4. 完整Form1.cs 代码如下
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;
      
      namespace threeLayerText
      {
          public partial class Form1 : Form
          {
              //实例化model层中 userInfo类用于传递数据
              Model.userInfo m_userInfo = new Model.userInfo();
      
              //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
              BLL.userAccess b_userAccess = new BLL.userAccess();
      
              public Form1()
              {
                  InitializeComponent();
              }
      
              private void Form1_Load(object sender, EventArgs e)
              {
      
              }
      
              //登录按钮 事件
              private void butLogin_Click(object sender, EventArgs e)
              {
                  //将用户输入的账号密码 赋值给userInfo类 username、psw属性
                  m_userInfo.username = textBoxAccount.Text.Trim().ToString();
                  m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
      
                  //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
                  if (b_userAccess.userLogin(m_userInfo) > 0)
                  {
                      MessageBox.Show("登录成功");
                  }
                  else
                  {
                      MessageBox.Show("登录失败");
                  }
              }
          }
      }
      

  10. 保存,可以调试了。


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

摘自:http://www.cnblogs.com/sdjxcolin/archive/2008/12/12/1353780.html 这篇文章讲解了这个问题


终于写完了,原来写篇博客也这么难啊哭




  • 23
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值