1. 程式人生 > 其它 >C#七層登入詳細講解,如何成功的實現程式的執行

C#七層登入詳細講解,如何成功的實現程式的執行

技術標籤:C#

環境:

SQL Server 2019:
以下是我用到的資料庫命名

資料庫CRCS
資料庫表UserInfo

資料庫表設計如下
在這裡插入圖片描述
Visual Stuio 2019
同一框架為 .NET Framework 4.8
建立一個winform窗體 以及其他類庫

輸出型別程式集名稱引用層次
windows應用程式UIFacade層、 Entity層
類庫IDALEntity層
類庫FactoryIDAL層
類庫FacadeBLL層 、Entity層
類庫Entity
類庫DALIDAL層、Entity層
類庫BLLEntity層、Factory層、IDAL層

winform窗體如下
所需控制元件

TextBox
Botton
窗體以及控制元件命名
在這裡插入圖片描述

使用者名稱文字框txtUserName
密碼文字框txtPassWord
按鍵butOK

UI層程式碼

using System;
using System.Windows.Forms;

namespace UI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 按鈕點選事件
        /// </summary>
/// <param name="sender"></param> /// <param name="e"></param> private void butOK_Click(object sender, EventArgs e) { //判斷文字框是否為空 if (txtUserName.Text.Trim() == "") { MessageBox.
Show("請輸入你的使用者名稱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (txtPassWord.Text == "") { MessageBox.Show("請輸入你的密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { //例項化物件 裝飾層物件|實體層物件 Facade.LoginFacade zhuangshi = new Facade.LoginFacade(); Entity.UserInfo yonghu = new Entity.UserInfo(); //實體層物件接受文字框的值 yonghu 是Entity層包裝起來的物件{userid,password,level,username} yonghu.UserName = txtUserName.Text; yonghu.PassWord = txtPassWord.Text; //定義布林值開始進行後續操作 Boolean flag = false; Facade.LoginFacade denglu = new Facade.LoginFacade();//例項化一個登入物件 //跳到Facade層,把yonghu 這個物件當做值傳入 flag = denglu.SelectUser(yonghu); //用布林值判斷是否登入成功 bool Flase = false; if (flag != Flase) { MessageBox.Show("登入成功"); this.Hide(); this.DialogResult = System.Windows.Forms.DialogResult.OK; Form a = new Form(); a.Show(); } else { MessageBox.Show("使用者名稱或密碼不正確"); } } } } }

UI層配置檔案

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<startup>
	</startup>
	<appSettings>
		<add key="DB" value="DAL"/>
		<add key="conStr" value="server=資料庫服務名;Database=資料庫名;uid=sa;pwd=123456"/>//這裡用的是驗證登入
	</appSettings>
</configuration>

IDAL層

using Entity;
using System.Data;

namespace IDAL
{
    //介面層
    public interface LoginIDAL
    {
        //由DAL層的LoginDal類實現介面  
        DataTable SelectUser(UserInfo yonghu);
    }
}

Factory

using System.Reflection;

namespace Factory
{
    //在BLL層中例項化
    public class LoginFactory
    {
       //配置檔案在UI層
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"]; 

        //在BLL層中呼叫生成一個DAL的LoginDal類
        public IDAL.LoginIDAL CreateUser()          
        {
            string ClassName = StrDB + "." + "LoginDal";
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }
}

Facade 層

using System;

namespace Facade
{
    /// <summary>
    /// 在UI層中生成的物件
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    public class LoginFacade
    {
        //從UI層過來,將Entity層中生成的物件 yonghu 值是 {userid,password,level,username} 傳入
        public Boolean SelectUser(Entity.UserInfo yonghu)
        {
            bool flag;

            BLL.LoginBll userbll = new BLL.LoginBll();//例項化BLL物件

            flag = userbll.UserBll(yonghu);//跳到BLL層,呼叫用BLL層的方法UserBLL,得到一個布林值

            return flag;//返回布林值給UI層
        }
    }
}

Entity層

namespace Entity
{
    public class UserInfo
    {
        //定義 使用者ID
        private int userid;
        public int UserId
        {
            get { return userid; }
            set { userid = value; }
        }
        //定義使用者密碼
        private string password;
        public string PassWord
        {
            get { return password; }
            set { password = value; }
        }
        //定義使用者型別欄位
        private string level;
        public string Level
        {
            get { return level; }
            set { level = value; }
        }
        //定義使用者名稱字
        private string username;
        public string UserName
        {
            get { return username; }
            set { username = value; }
        }
    }
}

BLL層

using System.Data;


namespace BLL
{
    //在Facade中生成的例項
    public class LoginBll
    {
        //由Facade層呼叫的方法, 值是 Entity層 生成的物件 yognhu 值是 {userid,password,level,username} 傳入
        public bool UserBll(Entity.UserInfo yonghu)
        {
            //跳到Factory層去例項化一個工廠  
            Factory.LoginFactory fact = new Factory.LoginFactory();

            //呼叫工廠方法生成的DAL.LoginDal類實現介面   JieKou(介面) 
            IDAL.LoginIDAL JieKou = fact.CreateUser();

            //跳到DAL層的LoginDal類中,返回一個表賦值給table  
            //為什麼會跳到DAL層,因為DAL層的LoginDal類實現了介面
            DataTable table = JieKou.SelectUser(yonghu);

            bool flag;
            if (table.Rows.Count == 0)//返回資料表型別,如果行數=0,說明沒有符合該賬號密碼的使用者
            {
                flag = false;
            }
            else
            {
                flag = true;

            }
            return flag;//返回布林值給Facade層
        }
    }
}

DAL層

LoginDal類

using System.Data;
using System.Data.SqlClient;

namespace DAL
{
    //在Factory層中產生
    public class LoginDal : IDAL.LoginIDAL
    { 
        //在BLL層進行呼叫
        public DataTable SelectUser(Entity.UserInfo yonghu)
        {

            SqlHelper sqlHelper = new SqlHelper();//例項化DAL層中的SqlHelper類

            //對映,具體參考MSDN這個類的介紹
            SqlParameter[] sqlparams = 
            { 
                new SqlParameter(@"UserName",yonghu.UserName),
                new SqlParameter(@"PassWord",yonghu.PassWord)
            };

            //真正在資料庫中進行操作的語句,匹配資料庫表,參考sql server語句使用方法
            string sql = @"SELECT * FROM UserInfo WHERE [email protected] AND [email protected]";

            //跳到DAL層中的SqlHelper類的方法ExecuteQuery 含有3個引數
            DataTable dt = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);

            return dt;//返回給BLL層資料表
        }
    }
}

DAL層

SqlHelper類

using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace DAL
{
    //資料訪問層,資料操作類
    public class SqlHelper
    {
        //定義資料庫連線操作,指定在資料庫上操作的型別
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;//流的方式讀取資料庫內容

        /// <summary>
        /// 建立連線語句
        /// </summary>
        public SqlHelper()
        {
            string connStr = ConfigurationManager.AppSettings["conStr"];
            conn = new SqlConnection(connStr);
        }

        /// <summary>
        /// 判斷資料庫是否已經連線
        /// </summary>
        /// <returns></returns>
        private SqlConnection GetConn()
        {
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;
        }

        ///<summary>
        ///執行不帶引數的資料庫操作或者儲存過程
        /// 增刪改查操作
        /// 返回受影響的行數
        ///</summary>
        public int ExecuteNonQuery(string cmdText, CommandType ct)
        {
            int res;
            cmd = new SqlCommand(cmdText, GetConn());//命令語句

            cmd.CommandType = ct;//?

            res = cmd.ExecuteNonQuery();
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }
            return res;
        }

        //執行帶引數的資料庫操作或者儲存過程
        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;
        }

        //執行不帶引數的SqL查詢語句或者儲存過程
        public DataTable ExecuteQuery(string cmdText, CommandType ct)
        {
            DataTable dt = new DataTable();

            cmd = new SqlCommand(cmdText, GetConn());

            cmd.CommandType = ct;

            using (sdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }

        //執行帶引數的SQL查詢語句或儲存過程
        //有DAL層的LoginDal類中進行呼叫
        
        public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
        {

            DataTable dt = new DataTable();//建立一個新表

            cmd = new SqlCommand(cmdText, GetConn());//資料庫命令操作,實際上就是進行資料庫語句

            cmd.CommandType = ct;//commandType 代表要執行的型別  commandTyop.Text 是以SQl語句進行查詢 在LoginDal類中傳入的

            //sql語句或儲存過程的引數 各個引數到dataset的對映
            //向 SqlParameterCollection 的末尾新增一個值陣列。
            cmd.Parameters.AddRange(paras);

            //sdr = cmd.ExecuteReader()解釋 生成一個只讀的物件  
            //CommandBehavior.CloseConnection 作用:返回物件前,資料庫不能被關閉
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);//填充表 //感覺好像sdr是一張表,然後貼到了dt表上
            }
            /*以上過程下來以後,新表dt中只有userid和password兩列的值*/

            return dt;//返回給DAL層LoginDal類一個數據表
        }
    }
}

可能出現的問題 & 解決方案

一、部分類的使用要用到系統的名稱空間
例如:

System.Data;
System.Reflection;
using System.Data.SqlClient;
using System.Configuration;

需要新增引用

二、建立層的時候一定要注意,除了UI層其他層都是建立的類庫

三、資料庫的連線和操作方法

資料來源

https://blog.csdn.net/qq_30631063/article/details/91592006