在学过三层之后,对三层进行细化,可以分成终于把七层敲完了,然后要很不负责认的发博客来了七层登录是整个七层学习的一大重点,可以说七层的完成机房就完成了一小半了,以下是每一层的代码。为了促进大家的学习不用全码。可以互相探讨非常欢迎~~
敲七层的过程中要先把引用的关系都连接好。
接口层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entity;
using System.Data;
namespace IDAL
{
public interface Ilogin
{
DataTable SelectUser(string username, string pwd);
D层
DAL层是对接口层的实现
using System.Data;
using Entity;
using System.Data.SqlClient;
using System.Configuration;//布局
using IDAL;
using System;
namespace DAL
{
public class UserInfoDAL : Ilogin
{
public DataTable SelectUser(string username, string pwd)
{
CommandType Text = 0;//枚举,SQL文本命令
SqlHelper sqlhelper = new SqlHelper();
SqlParameter[] sqlParams = {
new SqlParameter("@UserID", username ), //userID是数据库中表的内容,txtName是本项目中相应控件名称
//此处省略 };
//这是一个类,命名空间为System.Data.SqlClient。 防止SQL 注入
工厂层(
通过反射使B层与接口层连接
)
namespace Factory
{
public class Loginfac
{
string StrDB = ConfigurationManager.AppSettings["DB"];//接收来自配置文件的数据
public IDAL.Ilogin CreateUser()
{
string ClassName = StrDB + "." + "UserInfoDAL";//DAL层的类名
return (IDAL.Ilogin)Assembly.Load(StrDB).CreateInstance(ClassName);//反射加工厂的应用
B层
namespace BLL
{
public class LoginBLL
{
public bool CreateUser(string username, string pwd)
{
Factory.Loginfac fact = new Factory.Loginfac();//实例化工厂
IDAL.Ilogin idal = fact.CreateUser();//调用工厂方法创建接口
DataTable table = idal.SelectUser(username, pwd);//接受D层的返回值
bool flag;//此处省略,判断过程
facade层
namespace Facade
{
public class LoginFacade
{
public bool SelectUser(string username,string pwd)
{
bool flag;
LoginBLL loginBLL = new LoginBLL();
flag = loginBLL.CreateUser(username,pwd);
return flag;
UI层
using System;
using System.Windows.Forms;
using Entity
namespace UI
{
public partial class frmLogin : Form
{
public frmLogin()
{
InitializeComponent();
}
private void btnOK_Click(object sender, EventArgs e)
{
//判断输入不能为空
//省略
try
{
Boolean flag = false;
Facade.LoginFacade flogin = new Facade.LoginFacade();//实例化外观
flag = flogin.SelectUser(txtUserName.Text, txtPWD.Text);//调用外观的方法,返回给user
if (flag != false)
{
//显示成功 省略
}
else
{
//失败提示
}
}
}
private void btnNO_Click(object sender, EventArgs e)
{
System.Environment.Exit(0); //退出
}
entity 最先建立起来的。(省略,大部分都一样)
namespace Entity
{
public class LoginEntity
{
private string userid;
private string pwd;
private string level;
private string username;
private string state;
public string State
{
get
{
return state;
}
set
{
state = value;
}
}
//略
SQLHelper层
namespace DAL
{
public class SqlHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SqlHelper() //构造函数,实例化的时候应用
{
string connStr = System.Configuration.ConfigurationManager.AppSettings["ConnStr"];
//string connStr = "server=.; database=charge_sys;uid = sa ; pwd=123456";
//string connStr = ConfigurationManager.AppSettings["ConnStr"]; //利用配置文件
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
/// <summary>
/// 执行不带参数的增删改SQL语句或存储过程
/// </summary>
/// <param name="cmdText">增删改SQL语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>int</returns>
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
try
{
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
return res;
}
/// <summary>
/// 执行带参数的增删改SQL语句或存储过程
/// </summary>
/// <param name="cmdText">增删改SQL语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>int</returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 执行不带参数的 查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdText, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// <summary>
/// 执行带参数的查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程</param>
/// <param name="paras">参数集合</param>
/// <param name="ct">命令类型</param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
}
完整的SQLhelper可以直接使用
总结:
在整个的过程中,体会调用的关系,熟悉逻辑很快就会完成了再引用工厂的过程中会出现一些问题,所以配置文件,反射还是要多理解一些的。