1. 程式人生 > >景月嬌 廊坊師範學院資訊科技提高班 十四期

景月嬌 廊坊師範學院資訊科技提高班 十四期

小激動

經過兩天的“刻苦鑽研”,終於在今天的9:30分登入成功了!!!其實好久都沒有正兒八經的敲程式碼了,剛開始的時候真是頭疼,但是還是硬著頭皮開始了重構(因為學習進度真的是慢的不要不要的了!)。

除了感謝自己能夠勇敢的往前走了,在登入成功的過程中還要感謝:我桌邵聰、對桌偉傑、還有趙雷童鞋。O(∩_∩)O哈哈~

還有就是每一次做這種小系統,都證明了一個問題:就是真的沒自己想的那麼難,只要去做就好了,做著做著就懂了,就算不懂,過後就懂了…

在這裡插入圖片描述

七層

  1. 顯示層(UI)

  2. 外觀層(Facade) 實現了外觀模式,作為UI和BLL的橋樑,解除了它們之間的耦合

  3. 邏輯層(BLL)

  4. 介面層(IDALL) 在這個層次上,定義了一個統一的介面,解除BLL層和DAL層之間的耦合

  5. 資料訪問層(DAL) 在此有拓展一個SQLHelper層,主要使封裝對資料庫呼叫的一些程式碼,這樣就提高了我們程式碼的靈活性!

  6. 工廠層(Factory) 實現了工廠模式+反射,使資料庫的修改更加簡便,通過修改配置檔案實現資料庫的修改

  7. 實體層(Entity) 主要是封裝一些功能性程式碼,定義一些實體型別和實體集合,用於各個層次傳遞引數

在這裡插入圖片描述

程式碼實現

1、建立Entity,實現業務實體。 
2、建立IDAL,實現介面。 
3、建立DAL,實現接口裡的方法。 
4、增加APP.config裡的配置資訊,為提供DAL的程式集。 
5、建立Factory,返回程式集的指定類的例項。 
6、建立BLL,呼叫Factory,得到程式集指定類的例項,完成資料操作方法。
7、建立Facade,呼叫BLL,得到BLL層的處理結果返回值。
8、建立UI,呼叫Facade裡的資料操作方法,實現登入。 

Entity層

namespace Entity
{
    public class UserInfo
    {
        //定義 使用者ID 欄位
        private int userid;
        public int UserID
        {
            get { return userid; }
            set { userid = value; }
        }

        //定義 使用者名稱 欄位
        private string username;
        public string UserName
        {
            get { return username; }
            set { username = 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 bool state;
        public bool State
        {
            get { return state; }
            set { state = value; }
        }
    }

IDAL層

namespace IDAL
{
    public interface LoginIDAL
    {
        DataTable selectUser(Entity.UserInfo UserInfo);
    }
}

DAL層

public class LoginDAL : IDAL.LoginIDAL
    {
        public DataTable selectUser(Entity.UserInfo UserInfo)
        {
            //例項化一個數據查詢物件
            SqlHelper sqlHelper = new SqlHelper();
            //選擇要查詢的資料
            SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.UserID), new SqlParameter("@PassWord", UserInfo.PassWord) };
            //插入語句
            string sql = @"SELECT * FROM [User_Info] WHERE [email protected] and [email protected]";
            //將引數放在語句中
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
            //得到返回值
            return table;
        }
    }

SQLHelper類

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="ct">命令的型別</param>
        /// <returns>返回受影響的行數</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="paras">要查詢的引數</param>
        /// <param name="ct">命令型別</param>
        /// <returns>返回受影響的行數</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;
        }

    }

配置檔案:

在這裡插入圖片描述 在APP.config這個檔案裡新增下面的程式碼;

<appSettings>
    <add key ="ConnStr" value="server=JYJ; database=Jifang;user ID = sa ; pwd=123"/>
    <!-- server是自己資料庫的名字或者用.代表本地;把database,uid,pwd修改為與自己資料庫對應的關係-->
    <add key ="DB" value="DAL" />
  </appSettings>

Factory層

public class LoginFactory
    {
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];//接收來自配置檔案的資料        

        public IDAL.LoginIDAL CreateUser()
        {
            //DAL層的類名
            string ClassName = StrDB + "." + "LoginDAL";
            //反射加工廠的應用
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }

BLL層

public class LoginBLL
    {
        public bool UserBLL(Entity.UserInfo UserInfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory();//例項化工廠
            IDAL.LoginIDAL idal = fact.CreateUser();//呼叫工廠方法
            DataTable table = idal.selectUser(UserInfo);//接收D層的返回值
            bool flag;
            if (table.Rows.Count == 0) //返回的DataTable型別,如果它的行數等於0,說明沒有符合該賬號密碼的使用者
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;


        }
    }

Facade層

public class LoginFacade
    {
        public Boolean SelectUser(Entity.UserInfo user)
        {
            bool flag;
            BLL.LoginBLL userBLL = new BLL.LoginBLL();//例項化一個B層
            flag = userBLL.UserBLL(user);//接收B層傳來的True或者False
            return flag;
        }
    }

UI層

 private void btnOK_Click(object sender, EventArgs e)
        {
            //判斷輸入不為空
            if (txtUserID.Text.Trim()=="")
            {
                MessageBox.Show("沒有輸入使用者名稱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            if (txtPassWord.Text=="")
            {
                MessageBox.Show("沒有輸入密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            try
            {
                //例項化一個外觀
                Facade.LoginFacade Facade = new Facade.LoginFacade();
                //例項化一個使用者
                Entity.UserInfo user = new Entity.UserInfo();
                //接收控制元件傳來的使用者名稱資訊
                user.UserID = Convert.ToInt32(txtUserID.Text.Trim());
                //接收控制元件傳來的密碼資訊
                user.PassWord = txtPassWord.Text;

                Boolean flag = false;//定義要給bool的變數
                Facade.LoginFacade FLogin = new Facade.LoginFacade();//例項化外觀

                flag = FLogin.SelectUser(user);//呼叫外觀的方法,返回給user

                if (flag!=false)
                {
                    MessageBox.Show("登陸成功!");
                    //this.Hide();//隱藏當前窗體
                    //this.DialogResult = System.Windows.Forms.DialogResult.OK;
                    //FrmMain a = new FrmMain();//例項化一個窗體
                    //a.Show();//顯示例項化窗體
                }
                else
                {
                    MessageBox.Show("密碼或者使用者名稱錯誤");
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

後記

這些程式碼都是站在巨人的肩膀上敲出來的,但是敲出來並不一定能夠執行呦,會出現很多錯誤,在敲登入時的一些注意事項和錯誤解決方案,看我的下一篇部落格吧!