七层登录上机
【摘要】
文章目录
【前言】 【正文】 UI层IBLL层BLL层IDAL层DAL层SqlHelperFactory层七层登录的包图
【前言】
经过人事系统的编写,对于七层登录有了...
【前言】
经过人事系统的编写,对于七层登录有了更多的了解,下面就简单记录一下。
【正文】
UI层
private void btnOK_Click(object sender, EventArgs e)
{
//判断账号和密码是否为空
if (txtCardNo.Text == "" || txtPassword.Text == "")
{
MessageBox.Show("账号或密码不能为空!", "温馨提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
try
{
//实例化一个用户
Entity.UserInfo user = new Entity.UserInfo();
//实例的用户接受信息
user.UserId = txtCardNo.Text.Trim();
user.PassWord = txtPassword.Text.Trim();
//调用工厂方法来实例化B层的接口
IBLL.LoginIBLL loginibll = AbstractFactory.Factory.CreateConcreteClass(Encapsulation.BLL, Encapsulation.LoginBLL);
//调用B层接口中的方法
loginibll.SelectUser(user.UserId,user.PassWord);
//将登录信息添加到正在上机表
//实例化
Entity.OnLineInfo onlineInfo = new Entity.OnLineInfo();
onlineInfo.UserId = txtCardNo.Text.Trim();
onlineInfo.PassWord = txtPassword.Text.Trim();
//调用B层
IBLL.IOnLineBLL onlineIBLL = AbstractFactory.Factory.CreateConcreteClass(Encapsulation.BLL, Encapsulation.OnLineBLL);
onlineIBLL.InsertOnLine(onlineInfo.UserId,onlineInfo.PassWord);
frmMain frmmain = new frmMain();
frmmain.Text = onlineInfo.UserId;
frmmain.Show();
this.Hide();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); //抓取B层中的判断异常进行提示
txtCardNo.Text = "";
txtPassword.Text = "";//清空文本框重新输入
this.Show();
}
}
}
IBLL层
/// <summary>
///根据账号和密码来查询用户表
///登录功能
/// </summary>
/// <param name="userId"></param>
/// <param name="passWord"></param>
/// <returns></returns>
List<dynamic> SelectUser(string userId, string passWord);
/// <summary>
/// 插入正在上机表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
List<dynamic> InsertOnLine(string userId, string passWord);
BLL层
/// <summary>
/// 根据账号和密码来查询用户表
/// 登录功能
/// </summary>
/// <param name="userId"></param>
/// <param name="passWord"></param>
/// <returns></returns>
public List<dynamic> SelectUser(string userId, string passWord)
{
//实例化一个实体类
Entity.UserInfo user = new Entity.UserInfo();
//传参数
user.UserId = userId;
user.PassWord = passWord;
//调用工厂方法创建接口
IDAL.LoginIDAL loginidal = AbstractFactory.Factory.CreateConcreteClass(Encapsulation.DAL, Encapsulation.LoginDAL);
//接受D层的返回值
List<dynamic> list = loginidal.SelectUser(userId, passWord);
if (list.Count > 0)//返回数据表类型,如果行数=0;说明没有符合该账号密码的用户
{
if (list[0].State == Encapsulation.Zaizhi)
{
return list;
}
else
{
throw new Exception("此用户已经离职或者退休");
}
}
else
{
throw new Exception("账号或密码不正确,请重新输入");
}
}
//将登录账号存储进入正在上机表
public List<dynamic> InsertOnLine(string userId, string passWord)
{
//实例化
Entity.OnLineInfo online = new Entity.OnLineInfo();
//传参数
online.UserId = userId;
online.PassWord = passWord;
//调用工厂方法创建接口
IDAL.IOnLineDAL onlineIDAL = AbstractFactory.Factory.CreateConcreteClass(Encapsulation.DAL, Encapsulation.OnLineDAL);
List<dynamic> list = onlineIDAL.InsertOnLine(userId, passWord);
if (list.Count > 0)//返回数据表类型
{
throw new Exception("插入正在上机表失败");
}
else
{
return list;
}
}
IDAL层
//接口函数,判断要登录的用户名和密码是否在数据表中存在
List<dynamic> SelectUser(string userId, string passWord);
/// <summary>
/// 将登录账号存储进入正在上机表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
List<dynamic> InsertOnLine(string userId, string passWord);
DAL层
/// <summary>
/// 根据账号和密码来查询用户表
/// 登录功能
/// </summary>
/// <param name="userId"></param>
/// <param name="passWord"></param>
/// <returns></returns>
public List<dynamic> SelectUser(string userId, string passWord)
{
//实例化操作类,进行数据查询,并获取返回值
SqlHelper sqlHelper = new SqlHelper();
//执行数据库的查询
string sql = "SELECT * FROM T_User WHERE userId=@userId AND PassWord=@passWord";//构造语句,匹配数据库表
SqlParameter[] sqlParameter =
{
new SqlParameter("@userId",userId),
new SqlParameter ("@passWord",passWord)
};
DataTable dt = SqlHelper.GetDataTable(sql, sqlParameter);
List<dynamic> list = new List<dynamic>();
foreach (DataRow row in dt.Rows) //遍历读取dt里面的数据,并添加到list集合中
{
list.Add(new UserInfo()
{
UserId = Convert.ToString(row["userId"]),
UserName = Convert.ToString(row["userName"]),
PassWord = Convert.ToString(row["passWord"]),
State = Convert.ToString(row["state"])
});
}
//返回表到到BLL层
return list;
}
/// <summary>
/// 添加登录账号到正在上机表
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public List<dynamic> InsertOnLine(string userId, string passWord)
{
OnLineInfo onlineInfo = new OnLineInfo();//实例化正在上机的实体类
//执行数据库的查询
string sql = "insert into T_OnLine(userId,passWord)values (@userId,@passWord)";//构造语句,匹配数据库表
SqlParameter[] sqlParameter =
{
new SqlParameter("@userId",userId),
new SqlParameter("@passWord",passWord)
};
DataTable dt = SqlHelper.GetDataTable(sql, sqlParameter);
List<dynamic> list = new List<dynamic>();
foreach (DataRow row in dt.Rows) //遍历读取dt里面的数据,并添加到list集合中
{
list.Add(new OnLineInfo()
{
UserId = Convert.ToString(row["userId"]),
UserName = Convert.ToString(row["userName"]),
PassWord = Convert.ToString(row["passWord"])
});
}
//返回表到到BLL层
return list;
}
SqlHelper
/// <summary>
/// 数据操作类
/// </summary>
public class SqlHelper
{
private static readonly string connStr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
//1.ExecuteNonQuery(); ://执行命令的方法,insert update delete
//它的返回值类型为int型。多用于执行增加,删除,修改数据,返回受影响的行数。当select操作时,返回-1。
//ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,
//其方法返回值意义:对于 Update, Insert, Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,
//params是关键字:是可变参数的意思,目的是省略手动构造数组的过程,直接指定对象编译器会帮助我们构造数组,并将对象加入数组中传递过来
public static int ExcuteNonQuery(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象
{
SqlCommand cmd = new SqlCommand(sql, conn); //创建Command链接
cmd.Parameters.AddRange(paras);//添加参数
conn.Open();//打开连接
int n = cmd.ExecuteNonQuery();//执行命令兵返回受影响的行数
cmd.Parameters.Clear();
return n;
}
}
//ExecuteScaler(); 获取首行首列的方法
//它的返回值类型多位int类型。它返回的多为执行select查询。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。
//ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,
//ExecuteScalar()方法的返回值的数据类型是Object类型。
//如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,
//如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,
public static Object ExecuteScalar(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象
{
SqlCommand cmd = new SqlCommand(sql, conn);//创建Command连接对象
cmd.Parameters.AddRange(paras);//添加参数
conn.Open();
object o = cmd.ExecuteScalar();//执行命令,获取查询结构中的首行首列的值
cmd.Parameters.Clear();
return o;
}
}
//获取结果集
public static DataTable GetDataTable(string sql, params SqlParameter[] paras)
{
using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);//创建适配器对象
DataTable dt = new DataTable(); //构造数据表用于接收查询结果
adapter.SelectCommand.Parameters.AddRange(paras);//添加参数
adapter.Fill(dt);//执行结果,fill方法内部自动打开链接,不需要conn.Open();
adapter.SelectCommand.Parameters.Clear();//清空集合
return dt;//返回结果集
}
}
}
Factory层
/// <summary>
/// 抽象工厂
/// </summary>
/// <param name="layer"></param>
/// <param name="T_table"></param>
/// <returns></returns>
public static dynamic CreateConcreteClass(string layer, string T_table)
{
//读取配置文件section配置节中的内容。
string StrUB = ConfigurationManager.AppSettings[layer];
string className = StrUB + '.' + ConfigurationManager.AppSettings[T_table];
//实例化具体的类,并传出
return (dynamic)Assembly.Load(StrUB).CreateInstance(className);
}
七层登录的包图
文章来源: blog.csdn.net,作者:张艳伟_Laura,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Laura__zhang/article/details/119903989
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)