C#七層登陸及程式碼展示
前言
一步一個腳印~
本篇文章僅為七層學習參考,熟悉七層走向,不涉及重構登陸。(缺失判斷邏輯)
七層登陸
what
注意指向問題。
錯誤圖:
正確圖:
這個包圖很清晰的表示七層在三層的基礎上增加了facade,factory,IDAL層,Enitity。其實這裡的enitity就代表著實體層,在三層裡我們已經用過了,就是將User類封裝起來。也就是這裡所說的實體層。那麼我們今天要學習的也就又少了一個。增加的其他三層作用是什麼呢?
從圖上我們可以很清晰的知道這三層也是為了減少耦合的。
- facade(外觀層):較少U層和B層的耦合
- Factory(抽象工廠):實現了工廠模式+反射,使資料庫的修改更加簡便,通過修改配置檔案實現資料庫的修改
- IDAL(介面層):定義了一個統一的介面,減少了B層和D層的耦合
- Enitity(實體層):封裝一些功能性程式碼,定義一些實體型別和實體集合用於各個層次傳遞引數
程式碼順序
注意:先後問題。如果先寫U層,它會涉及到呼叫,所以在沒寫B層之前,U層是無法完成的。寫程式碼順序應從箭頭指向的反方向來寫。
1. Enitity(實體層)
2. IDAL(介面層)
3. DAL(資料訪問層)
→app配置
4. Factory(工廠層)
5. BLL(業務邏輯層)
6. Facade(外觀曾)
7. UI(介面層)
程式碼展示
Enitity(實體層)
public class userinfo
{
public string UserID { get; set; }
public string PWD { get; set; }
public string UserName { get; set; }
public string Level { get; set; }
public string state { get; set; }
}
IDAL(介面層)
using System.Data;//引用
namespace IDAL
{
public interface LoginIDAL
{
DataTable selectUser(Entity.userinfo user);
}
}
DAL(資料訪問層)
配置資料庫:
程式碼如下:
<appSettings>
<add key ="connStr" value ="server=LOVQG\SQLEXPRESS;database=Login_sys;uid=sa;pwd= 123"/>
<add key ="DB" value ="DAL"/>
</appSettings>
DAL類:
using System.Data; //引用
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class LoginDAL:IDAL.LoginIDAL
{
public DataTable selectUser(Entity.userinfo user)
{
SQLHelper sqlHelper = new SQLHelper();
//引數
SqlParameter[] sqlparams = { new SqlParameter("@UserID", user.UserID), new SqlParameter("@PassWord", user.PWD) };
string sql = @"SELECT * FROM [User_Info] WHERE UserID =@UserID AND PWD = @PassWord";
DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text); //(sql, CommandType.Text, sqlparams);
return table;
}
}
}
SQLHelper類:
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
//----------------------
public SQLHelper()
{
//連線
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="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;
}
}
}
Factory(工廠層)
using System.Reflection;//引用反射
using System.Configuration;
namespace Factory
{
public class LoginFactory
{
//新增引用集
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
public IDAL.LoginIDAL CreateUser()
{
//反射+工廠的應用----------新增引用using System.Reflection;
string ClassName = StrDB + "." + "LoginDAL";//DAL的類名 StrDB+
return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
}
}
}
BLL(業務邏輯層)
using System.Data;
namespace BLL
{
public class LoginBLL
{
public DataTable UserBLL(Entity.userinfo user)
{
Factory.LoginFactory fact = new Factory.LoginFactory();//例項化工廠
IDAL.LoginIDAL idal = fact.CreateUser();//呼叫工廠方法建立介面
DataTable table = idal.selectUser(user);//接受D層的返回值
return table;
}
}
}
Facade(外觀層)
public class LoginFacade
{
public DataTable SelectUser(Entity.userinfo user)
{
DataTable flag;
BLL.LoginBLL UserBLL = new BLL.LoginBLL();
flag = UserBLL.UserBLL(user);//返回值
return flag;
}
}
UI(介面層)→未判斷許可權~
private void buttonOK_Click(object sender, EventArgs e)
{
//判空
if (txtUserID.Text.Trim() == "") //1.判斷使用者名稱和密碼是否為空,一行程式碼解決
{
MessageBox.Show("使用者名稱不能為空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (txtPassWord.Text == "")
{
MessageBox.Show("密碼不能為空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtPassWord.Focus();
}
else
{
Entity.userinfo user = new Entity.userinfo(); //例項化使用者
user.UserID = txtUserID.Text.Trim(); //接收資訊
user.PWD = txtPassWord.Text; //
Facade.LoginFacade FLogin = new Facade.LoginFacade(); //3.例項化外觀將引數傳遞給外觀層
DataTable flag = FLogin.SelectUser(user); //4.呼叫外觀的方法,返回給user
#region//判斷登陸
if (flag.Rows.Count != 0) //-------為什麼不用布林值,bool無法返回rowx
{
MessageBox.Show("小主,您可以進來了", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Hide();
this.DialogResult = System.Windows.Forms.DialogResult.OK;
Form a = new Form();
a.Show();
}
else
{
MessageBox.Show("使用者名稱或密碼錯誤");
txtUserID.Text = "";
txtPassWord.Text = "";
txtUserID.Focus();//獲得焦點
}
#endregion
}
}
登陸效果
錯誤集錦
後記
完成這個登陸還真是不容易啊。感謝大神們的幫助與指點~
相關文章
- 三層登陸程式碼及錯誤集錦
- 單點登陸原理及程式碼(CAS)
- SSH安全登陸原理:密碼登陸與公鑰登陸密碼
- tornado登陸豆瓣程式碼例項
- c# 模擬網站登陸C#網站
- 《匿名》第七課----登陸介面設計
- vpn登陸指令碼指令碼
- 三層登入——C#版C#
- ssh免密碼登陸密碼
- oracle登陸限制指令碼Oracle指令碼
- QQ登陸不上 QQ登陸錯誤0x00000001程式碼怎麼辦
- 登陸註冊頁面html程式碼(仿知乎)HTML
- jquery登陸表單簡單驗證程式碼jQuery
- 通過論壇實現登陸的程式碼
- 【三層登入之C#版】C#
- curl模擬請求、登陸以及帶驗證碼登陸
- 判斷手機還是電腦登陸程式碼
- 配置SSH免密碼登陸密碼
- oracle登陸設定指令碼Oracle指令碼
- PHP萬能密碼登陸PHP密碼
- vue+elementUI完成註冊及登陸VueUI
- jquery 彈出登陸框,簡單易懂!修改密碼效果程式碼jQuery密碼
- discuz教程QQ登陸提示錯誤程式碼:2000
- 研讀程式碼遇到的困惑---關於登陸問題
- securt crt 自動登陸指令碼指令碼
- MySQL命令列登陸,遠端登陸MySQLMySql命令列
- 虛擬化(七):vmware horizon view 安裝及效果展示View
- oracle 登陸Oracle
- 共享登陸
- 一個登陸程式碼求大神看看哪裡有異常
- C#條碼生成及列印例項程式碼C#
- shiro登陸流程原始碼詳解原始碼
- Jupyter Notebook修改登陸密碼密碼
- CentOS7 配置免密碼登陸CentOS密碼
- windows登陸密碼破解方法之一Windows密碼
- Linux使用者密碼後不能登陸(回到原登陸狀態)問題Linux密碼
- MySQL服務開啟關閉及登陸- 2MySql
- 淺談微信小程式登陸與Oauth微信小程式OAuth