程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 三層登錄實戰C#版

三層登錄實戰C#版

編輯:C#入門知識

三層登錄實戰C#版


剛開始接觸三層的時候沒頭緒,雖然知道它們之間的引用關系,可是還是感覺很混亂,所以上網看了看博客,決定先從畫圖入手。從包圖——>類圖——>時序圖(邏輯)——>代碼,一步步的重新做!


一、包圖

\


為什麼要有實體層?沒有實體層可以嗎?為什麼不叫四層,而叫三層呢?


實體層的作用是便於層與層之間數據的傳遞,每個實體對象與數據庫裡的表示一一對應的。對於大量的數據來說,就可以直接通過實體對象用Get(),Set()方法將字段提取出來,這比臨時在創建變量要省事。就相當於利用面向對象的思想,將大量的數據進行封裝後在進行傳遞。


例如:

AddUser(UserID,UserName,UserPassword)

用了實體層,將這些字段封裝到UserInfo類中,可以寫為AddUser(UserInfo),這樣就省事多了。


並不是一定要有實體層,如果只有少量數據, 例如機房收費系統中,查詢某個卡號對應的學生,可以通過CardID作為參數來進行傳遞,也就沒有必要用實體層進行傳遞了。


實體層是為了數據傳遞提供方便,只是一個類,並無實際作用,可有可無,所以不可以和UI,DAL,BLL一樣作為層來說。


二、類圖


1、實體層 UserInfo類


\



2、D層:DbUtil類和UserDAO類



\



3、B層:LoginManager類


\


4、U層:FrmLogin類


\


三、時序圖


\



四、代碼



1、Entity層:UserInfo類


定義字段,獲取字段的Get()與Set()方法,與數據庫中的Users表是對應的,方便數據的傳遞

namespace LoginModel
{
    //數據庫表的映射
        public class UserInfo
        {
            private string username;
            public string UserName
            {
                get { return username; }
                set { username = value; }
            }

            private string password;
            public string PassWord
            {
                get { return password; }
                set { password = value; }
            }

            public UserInfo(string username, string password)
            {
                this.username = username;
                this.password = password;
            }
        }
    
}



2、D層:


(1)DbUtil類:


namespace LoginDAL
{
    /// 
    /// 創建連接數據庫字符串
    /// 
    class DbUtil
    {
       public static string ConnString = @"server=bill\BILLSQL;dataBase=Users;user id=sa;password=123456";
    }
}



(2)UserDAO類:


主要用於提供數據庫的基本訪問,供BLL調用。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace LoginDAL
{ 
    public class UserDAO
    {
        //查詢用戶
         public LoginModel.UserInfo SelectUser(string username, string password)
        {

            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//創建SQL數據庫打開連接
      
            {

                SqlCommand cmd = conn.CreateCommand(); //創建並返回一個與 SqlConnection 關聯的 SqlCommand 對象

                cmd.CommandText = @"select username,password from user_Info where username=@username and password=@password";//獲取數據源執行的查詢語句

                cmd.CommandType = CommandType.Text;//設置一個值用來解釋CommandText屬性

                //將指定的SqlParameter添加到SqlParameterCollection中
                cmd.Parameters.Add(new SqlParameter("@username", username));
                cmd.Parameters.Add(new SqlParameter("@password", password));
                
                
                conn.Open();//打開數據庫連接


                SqlDataReader reader = cmd.ExecuteReader();//將 CommandText 發送到 Connection 並生成一個 SqlDataReader

                LoginModel.UserInfo user = null;
               
               //使 SqlDataReader 前進到下一條記錄
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new LoginModel.UserInfo();
                    }
                   
                   user.UserName = reader.GetString(0);
                   user.PassWord = reader.GetString(1);

                }
                return user;
            }
        }
    }
}



3、B層:LoginManager類


處理業務邏輯,主要包括判斷用戶名與密碼的是否為空,以及從D層中獲取的數據傳遞給實體層。


namespace LoginBLL
{
    public class LoginManager
    {
         public LoginModel.UserInfo UserLogin(string username, string password)
        {
             //throw new NotImplementedException();
             
             LoginDAL.UserDAO uDAO = new LoginDAL.UserDAO();


             //用戶名不能為空
            if (username == null)
            {
                throw new Exception("請輸入用戶名");

            }

             //密碼不能為空
            if (password == null)
            {
                throw new Exception("請輸入密碼");

            }

            LoginModel.UserInfo user = uDAO.SelectUser(username, password);
            if (user != null)
            {
                
                return user;
                
            }
            else
            {
                throw new Exception("登錄失敗");
            }
        }
    }
   
}



4、U層:FrmLogin類


主要是界面命令以及操作,接收B層傳來的數據。


namespace LoginUI
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string username = txtUserName.Text.Trim() ;
            string password = txtPassWord.Text;

            try
            {
                LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();
                LoginModel.UserInfo user = mgr.UserLogin(username, password); 
                MessageBox.Show("登錄用戶:" + user.UserName);
            }

            catch (Exception err)

            {
                MessageBox.Show(err.Message.ToString());
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)//卸載窗體
        {
            Close();
        }

    }
}



五、收獲

雖然理論理解了理論,但是有的代碼還是不太理解,尤其是傳遞數據的那塊,調試的時候發現是這樣的:在界面輸入用戶名和密碼——>B層——>D層——>實體層——>D層——>B層——>界面顯示登錄成功!
用戶輸入用戶名和密碼後,執行B層代碼判斷用戶名和密碼是否為空,實例化LoginManager類,調用它的UserLogin方法;跳到B層,實例化UserDAO類,並調用它的SelectUser方法;調到D層,創建連接數據庫對象,……到實體層這又亂了,正在看這篇博客的大神們,你們幫幫忙吧!



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved