C# 三层架构之系统的登录验证与添加数据的实现
利用三层架构体系,实现学生管理系统中用户的登录与添加班级信息的功能,一下代码为具体实现步骤的拆分过程:
一、用户登录界面功能的实现
1、在数据访问层(LoginDAL)进行对数据库中数据的访问操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引入命名空间
using System.Data;
using System.Data.SqlClient; namespace StudentMisDAL
{
public class LoginDAL
{
/// <summary>
/// 创建返回值类型为DataSet的有参构造函数
/// </summary>
/// <param name="name"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public DataSet DoLogin(string name,string pwd)
{
string connstring = "server=.;database=StudentMISDB;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(connstring);
//执行参数化的sql查询语句
string sql = @"select * from Login where LoginName=@LoginName and pwd=@pwd";
SqlCommand cmd = new SqlCommand(sql, conn);
//定义参数
SqlParameter[] parameter = new SqlParameter[]{
new SqlParameter("@LoginName",SqlDbType.VarChar,),
new SqlParameter("@pwd",SqlDbType.VarChar,)
};
//给参数赋值
parameter[].Value = name;
parameter[].Value = pwd;
//将参数添加到命令对象中
cmd.Parameters.AddRange(parameter);
//创建适配器
SqlDataAdapter da = new SqlDataAdapter(cmd);
//创建缓冲区
DataSet ds = new DataSet();
conn.Open();
da.Fill(ds);
conn.Close();
//返回ds
return ds;
}
}
}
2、在业务逻辑层(LoginBLL)对数据访问层中获取到的数据进行逻辑判断分析
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引入命名空间
using System.Data;
using StudentMisDAL; namespace StudentMisBLL
{
public class LoginBLL
{
/// <summary>
/// 创建一个返回值类型为bool型的有参构造函数
/// </summary>
/// <param name="name"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public bool GetMisUI(string name,string pwd){
//实例化类LoginDAL(数据访问层)
LoginDAL ld = new LoginDAL();
//调用方法并接收返回值
DataSet ds=ld.DoLogin(name,pwd);
//根据返回值:受影响的行数,来进行判断
if (ds.Tables[].Rows.Count<)
{
return false;
}
//防SQL注入
//获取到数据库中对应的第一张表中的第一行(也可以传入下标值)的列名叫做LoginName和pwd的值
string Name = ds.Tables[].Rows[]["LoginName"].ToString();
string PWD = ds.Tables[].Rows[]["pwd"].ToString();
if (name==Name&&pwd==PWD)
{
return true;
}
return false;
}
}
}
3、在表示层(LoginUI)对业务逻辑层(LoginBLL)中的分析与判断进行调用和可视化
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;
//引入命名空间
using StudentMisBLL; namespace StudentMisUI
{
public partial class LoginUI : Form
{
public LoginUI()
{
InitializeComponent();
}
/// <summary>
/// 为登录按钮添加点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//获取到文本框中输入的值
string name = this.txtLoginName.Text.Trim();
string pwd = this.txtPwd.Text.Trim();
//将LoginBLL类(逻辑层)进行实例化
LoginBLL lb = new LoginBLL();
//调用方法
bool bo=lb.GetMisUI(name,pwd);
if (bo==true)
{
MessageBox.Show("登陆成功!");
//跳转至主窗体
FrmMainUI frmMain = new FrmMainUI();
frmMain.Show();
this.Hide();
}
else
{
MessageBox.Show("登陆失败,登录名或密码错误!");
//清空输入框
this.txtLoginName.Text = "";
this.txtPwd.Text = "";
}
}
}
}
二、添加班级信息功能的实现
1、在表示层(LoginUI)中进行操作:将LoginUI窗体进行隐藏,将主窗体(FrmMainUI)进行展示
代码如下:
if (bo==true)
{
MessageBox.Show("登陆成功!");
//跳转至主窗体
FrmMainUI frmMain = new FrmMainUI();
frmMain.Show();
this.Hide();
}
else
{
MessageBox.Show("登陆失败,登录名或密码错误!");
//清空输入框
this.txtLoginName.Text = "";
this.txtPwd.Text = "";
}
2、在表示层(StudentMisUI)创建主窗体(FrmMainUI)

3、位子菜单的“添加班级”菜单创建一个窗体

5、为“添加”按钮添加点击事件
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;
//引入命名空间
using StudentMisModel;
using StudentMisBLL; namespace StudentMisUI
{
public partial class FrmAddClassesUI : Form
{
public FrmAddClassesUI()
{
InitializeComponent();
}
/// <summary>
/// 为‘添加班级’窗体中的‘添加按钮’添加点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
//实例化‘添加班机’实体类
ClassesMod classes = new ClassesMod();
//给实体类赋值
classes.ClassesNo = this.txtClassesNo.Text.Trim();
classes.ByName = this.txtByName.Text.Trim();
classes.Name = this.txtClassesName.Text.Trim();
//实例化ClassesBLL类(逻辑层)
ClassesBLL cb = new ClassesBLL();
bool bo = cb.AddClassesInfor(classes);
if (bo==true)
{
MessageBox.Show("添加成功!");
//添加成功后清空输入框
this.txtClassesNo.Text = "";
this.txtByName.Text = "";
this.txtClassesName.Text = "";
}
else
{
MessageBox.Show("添加失败!");
}
} }
}
4、为该系统结构添加实体类(ClassesMod)(序号顺序写反了,但是没有写错)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace StudentMisModel
{
/// <summary>
/// 为‘添加班级’创建实体类
/// </summary>
public class ClassesMod
{
//创建班级ID属性
public int ClassId { get; set; }
//创建班级名称属性
public string Name { get; set; }
//创建班级别名属性
public string ByName { get; set; }
//创建班级编号属性
public string ClassesNo { get; set; }
}
}
6、在数据访问层(ClassesDAL)进行数据访问
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引入命名空间
using StudentMisModel;
using System.Data;
using System.Data.SqlClient; namespace StudentMisDAL
{
public class ClassesDAL
{
public int AddClasses(ClassesMod classes)
{
//建立连接数据库的字符串
string connString = "server=.;database=StudentMISDB;uid=sa;pwd=123456";
//创建连接对象
SqlConnection conn = new SqlConnection(connString);
//参数化的查询语句
string sql = "insert into Classes Values(@Name,@ByName,@ClassesNo)";
//执行查询命令
SqlCommand cmd = new SqlCommand(sql,conn);
//定义参数
SqlParameter[] parameters = new SqlParameter[]{
new SqlParameter("@Name",SqlDbType.NVarChar,),
new SqlParameter("@ByName",SqlDbType.NVarChar,),
new SqlParameter("@ClassesNo",SqlDbType.VarChar,)
};
//给参数赋值
parameters[].Value = classes.Name;
parameters[].Value = classes.ByName;
parameters[].Value = classes.ClassesNo;
//将参数添加到命令对象
cmd.Parameters.AddRange(parameters);
conn.Open();
//返回插入后影响的行数
int i = cmd.ExecuteNonQuery();
conn.Close();
//返回行数
return i;
}
}
}
7、在业务逻辑层(ClassesBLL)进行逻辑判断分析
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引入命名空间
using StudentMisDAL;
using StudentMisModel; namespace StudentMisBLL
{
public class ClassesBLL
{
public bool AddClassesInfor(ClassesMod classes)
{
//实例化ClassesDAL类(数据访问层)
ClassesDAL cd = new ClassesDAL();
//调用类中的方法并接受
int i = cd.AddClasses(classes);
//返回一个布尔值
return i > ;
}
}
}
8、再次回到表示层(FrmAddClassesUI)。将业务逻辑层中的方法和分析进行调用,并在表示层进行可视化
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;
//引入命名空间
using StudentMisModel;
using StudentMisBLL; namespace StudentMisUI
{
public partial class FrmAddClassesUI : Form
{
public FrmAddClassesUI()
{
InitializeComponent();
}
/// <summary>
/// 为‘添加班级’窗体中的‘添加按钮’添加点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
//实例化‘添加班机’实体类
ClassesMod classes = new ClassesMod();
//给实体类赋值
classes.ClassesNo = this.txtClassesNo.Text.Trim();
classes.ByName = this.txtByName.Text.Trim();
classes.Name = this.txtClassesName.Text.Trim();
//实例化ClassesBLL类(逻辑层)
ClassesBLL cb = new ClassesBLL();
bool bo = cb.AddClassesInfor(classes);
if (bo==true)
{
MessageBox.Show("添加成功!");
//添加成功后清空输入框
this.txtClassesNo.Text = "";
this.txtByName.Text = "";
this.txtClassesName.Text = "";
}
else
{
MessageBox.Show("添加失败!");
}
} }
}
9、实现点击“添加”按钮后让子窗体(FrmAddClassesUI)在父窗体(FrmMainUI)中进行显示。
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 StudentMisUI
{
public partial class FrmMainUI : Form
{
public FrmMainUI()
{
InitializeComponent();
}
/// <summary>
/// 为‘添加班级’菜单添加点击事件
/// 弹出‘添加班级’窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddClassesToolStripMenuItem_Click(object sender, EventArgs e)
{
//实例化‘添加班级’类
FrmAddClassesUI frmAL = new FrmAddClassesUI();
//指定其父窗体
frmAL.MdiParent = this;
//显示子窗体
frmAL.Show();
}
}
}
C# 三层架构之系统的登录验证与添加数据的实现的更多相关文章
- 基于Ajax与用户认证系统的登录验证
一.登录页面 from django.contrib import admin from django.urls import path from blog import views urlpatte ...
- 01- ajax, 登录验证,json数据,文件上传
1.ajax简介 1.向服务器发送请求的途径 # 向服务器发送请求的途径 1. 浏览器地址栏,默认get请求 2. form表单: get请求 post请求 3. a标签,默认get请求 4. Aja ...
- 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入
PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...
- Java 自定义注解在登录验证的应用
java注解 从 JDK 5开始,Java 增加了注解的新功能,注解其实是代码里面的特殊标记,这些标记可以在编译.类加载和运行时被读取,在不改变代码原有逻辑下,给源文件嵌入注解信息.再通过返回获取注解 ...
- 关于对javaUtils封装和三层架构的笔记
1.什么是三层架构: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business ...
- C# Dapper基本三层架构使用 (四、WinForm UI层)
UI层主要功能是显示数据和接受传输用户的数据,可以在为网站的系统运行提供交互式操作界面,表示层的应用方式比较常见,例如Windows窗体和Web页面. 在项目中增加WinForm应用程序,结构如下 添 ...
- winform学习日志(十九)----------真正三层架构之登录
摘要:一:三层构架的基础知识在项目开发的过程中,有时把整个项目分为三层架构,其中包括:表示层(UI).业务逻辑层(BLL)和数据访问层(DAL).三层的作用分别如下: 表示层:为用户提供交互操作界面, ...
- 新闻公布系统 (Asp.net 三层架构 )
2012年度课程设计---新闻公布系统(小结) ...
- c#利用三层架构做一个简单的登录窗体
就个人而言,三层架构有点难理解,不知道该如何下手,各层与各层之间怎么调用 最近一直在研究三层架构,经过网上学习与多方打听写一下自己的心得.有不足之处,可以评论和私聊探讨 言归正传: 三层架构(3-ti ...
随机推荐
- javaBean与Servlet学习
1.JavaBean JavaBean将java代码单独封装成了一个处理某种业务逻辑的类,可以降低HTML与Java代码的耦合度,并且简化JSP页面,提高Java程序代码的重用性及灵活性. JavaB ...
- 暑假学习计划:Day_1.JSP&Servlet&Tocat 环境搭建到基础的认识。
1.了解JSP和Servlet(百度了解即可). 2.了解B/S和C/S.分别是 浏览器/服务器 和 客户端/服务器. 其中 B/S 被称为瘦模式(主流模式). 3.了解并下载Tomcat服务器 ...
- FarmCraft[POI2014]
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ...
- UICollectionView基本使用详解(OC)
概述 UICollectionView是从iOS6开始引入使用的,目前应用非常广泛,很牛逼!老外的博客也是这么说的(传送门) ## 与UITableView的初步比较 UITableView应该是大家 ...
- nginx实现请求的负载均衡 + keepalived实现nginx的高可用
前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...
- 关于SQL语句条件值写中文查不到的问题
在使用jdbc链接MySQL执行SQL语句的时候,sql语句中的where条件,参数值带中文,则查询不到结果,而where条件,参数值都为数字或字母时可以正常查询, 原因是mysql的characte ...
- shader之半兰伯特漫反射
看很多人实现shader都用插件shader force,那我还学shader干X!!!??? 好了,废话不多说,学习shader去.... 漫反射在shader里算是最基础的知识了.入手shader ...
- python中类的属性(class attribute)的解释
python中的类叫 class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实 ...
- RMAN备份介质的移动与再恢复测试 [ catalog start with ‘dir’ ]
--RMAN备份介质的移动与再恢复测试 ---------------------------------------------------------2013/09/21 由于目前生产环境中没 ...
- 移动端表层div滑动,导致底层body滑动(touchmove的阻止)
body很长,可以滑动,body头部有一个模拟下拉的选择框,下拉选择有滚动轴 我给body一个overflow:hidden和高度是没有用的.手机网站上背景还是可以滑动,然后我给body一个touch ...