C#機房重構之註冊窗體

提高班14期郭倩_Ulrica發表於2018-08-24

前言

在敲程式碼之前畫出自己想要的流程圖,從一下幾點來描述一下我的註冊。
我是以資料庫表來建立類庫的,也可以以功能,以增刪改查等。

注意

1.資料庫中有兩個表涉及到註冊,分別是學生表和user表。
註冊學生同時,也要將資訊放到user表。因為我們是在user表中判斷登陸許可權的。

2學生表中的許可權可以直接設定為一般使用者,不需要選擇。

3註冊時並沒有給學生輸入密碼。這個在註冊到user表中可以給學生的密碼設定一個初始密碼666666。
學生窗體中有修改密碼窗體,可以將初始密碼改成自己想要的。
資料庫圖
4註冊窗體中可以放一個按鈕,作為充值金額。

5註冊前,要查詢註冊的賬號是否存在,如果存在,則彈框。
如果不存在,依次將資料存到student表和user表。
最後判斷存檔是否成功。

這裡寫圖片描述

程式碼

Entity

public class StuInfo         //學生表
    {
        public string UserID { set; get; }
        public string studentName { set; get; }
        public string Sex { set; get; }
        public string Department { set; get; }
        public string Grade { set; get; }
        public string Class { set; get; }
        public decimal Cash { set; get; }
        public string Type { set; get; }
        public string Explain { set; get; }
        public string Ischeck { set; get; }
    }
public class userinfo         //--------user表
    {
        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

//學生表
        DataTable selectStu(Entity.StuInfo StuInfo);//查詢ID是否存在
        int addStu(Entity.StuInfo stu);//新增學生
//user表
        DataTable selectUserBLL(Entity.userinfo userinfo);//查詢ID是否存在
        //-------------------------------------------------------------
        int addUser(Entity.userinfo userinfo);//新增使用者到user表

DAL

//學生表
    public class StuDAL : IDAL.StuIDAL //實現學生註冊的介面
    {
        #region//查詢學生表裡是否存在ID號-----------------------------------------------------------------

        public DataTable selectStu(Entity.StuInfo StuInfo)
        {

            SQLHelper sqlHelper = new SQLHelper();   //例項化SQLHelper

            //查詢語句

            SqlParameter[] sqlParams = { new SqlParameter("@UserID",StuInfo.UserID ) }; //需要引用sqlclient;引數

            string sql = @"SELECT *FROM [Student] WHERE UserID=@UserID";

            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text); //ExecuteQuery查詢

            return table;
        }
        #endregion

        #region//向學生表裡新增資訊--------------------------------------------------------------


        public int addStu(Entity.StuInfo stu)
        {
            SQLHelper sqlHelper = new SQLHelper();

            //   向表中插入資訊
            string sql = "INSERT INTO Student(UserID,studentName,Sex,Department,Grade,Class,Cash,Type,Explain,Ischeck)values(@UserID,@studentName,@Sex,@Department,@Grade,@Class,@Cash,@Type,@Explain,@Ischeck)";

            SqlParameter[] sqlParams = new SqlParameter[]
            {
                new SqlParameter ("@UserID",stu.UserID ),
                new SqlParameter ("@studentName",stu.studentName),
                new SqlParameter ("@Sex",stu.Sex ),
                new SqlParameter ("@Department",stu.Department ),
                new SqlParameter ("@Grade",stu.Grade ),
                new SqlParameter ("@Class",stu.Class),
                new SqlParameter ("@Cash",stu.Cash ),
                new SqlParameter ("@Type",stu.Type ),
                new SqlParameter ("@Explain",stu.Explain ),
                new SqlParameter ("@Ischeck",stu.Ischeck ),
            };

            int result = sqlHelper.ExecuteNonQuery(sql, sqlParams, CommandType.Text);
            return result;
        }


        #endregion
#region//查詢user表裡是否存在ID號


        public DataTable selectUserBLL(Entity.userinfo userinfo)
        {
            SQLHelper sqlHelper = new SQLHelper();  //例項化sqlhelper

            //引用
            SqlParameter[] sqlParams = { new SqlParameter("@UserID", userinfo.UserID) };  //user表裡有沒有這個ID號

            string sql = @"SELECT *FROM [User_Info] WHERE UserID = @UserID";  //查表

            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);

            return table;

        }
        #endregion

        //---------------------------------------------------------

#region//向user表裡新增學生資訊

        public int addUser(Entity.userinfo userinfo)
        {
            SQLHelper sqlHelper = new SQLHelper();  //例項化SQLhelper

            string sql = "INSERT INTO User_Info(UserID,PWD,UserName,Level,State)VALUES(@UserID,@PWD,@UserName,@Level,@State)"; //插入語句

            SqlParameter[] sqlParams = new SqlParameter[]    //新增資訊,賦值
            {
                new SqlParameter ("@UserID",userinfo .UserID ),
                new SqlParameter ("@PWD",userinfo .PWD ),
                new SqlParameter ("@UserName",userinfo.UserName ),
                new SqlParameter ("@Level",userinfo .Level ),
                new SqlParameter ("@State",userinfo.state ),
            };

            int result = sqlHelper.ExecuteNonQuery(sql, sqlParams, CommandType.Text);      //插入
            return result;
        }

Factory

//學生
        public IDAL.StuIDAL Student()
        {

            string ClassName = StrDB + "." + "StuDAL";    //DAL層的類名

            return (IDAL.StuIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);  //反射+工廠的應用
        }
        #endregion
//user
        public IDAL.UserIDAL User()
        {
            //DAL層的類名
            string ClassName = StrDB +"." + "UserDAL";
            //反射加工廠的應用
            return (IDAL.UserIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
        #endregion

BLL

//學生表:
        #region//查詢學生是否存在
        public DataTable selectStuBLL(Entity.StuInfo StuInfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory(); //例項化工廠

            IDAL.StuIDAL idal = fact.Student();                     //呼叫工廠方法建立介面

            DataTable table = idal.selectStu(StuInfo);              //接受D層返回值

            return table;
        }
        #endregion


        #region//新增學生到學生表

        public Boolean addStu(Entity.StuInfo StuInfo)
        {

            Factory.LoginFactory fact = new Factory.LoginFactory();//例項化工廠

            IDAL.StuIDAL idal = fact.Student();//呼叫工廠方法建立介面

            int result = idal.addStu(StuInfo);//接受D層返回值

            bool flag;

            if (result == 0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;
        }
//user表
        #region//查詢使用者是否存在

        public DataTable selectUserBLL(Entity.userinfo userinfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory(); //例項化工廠

            IDAL.UserIDAL idal = fact.User(); //呼叫工廠方法建立介面

            DataTable table = idal.selectUserBLL(userinfo);  //接收D層返回值

            return table;
        }

        #endregion

        #region//新增學生到user表

        public Boolean addUser(Entity.userinfo userinfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory();

            IDAL.UserIDAL idal = fact.User();

            int result = idal.addUser(userinfo);
            bool userflag;
            if (result ==0)
            {
                userflag = false;   
            }
            else
            {
                userflag = true;
            }
            return userflag;

        }
        #endregion

        #endregion

Facade

//學生表
     public class StuFacade
    {
        #region//查詢
        public DataTable selectStu(Entity.StuInfo StuInfo)
        {
            DataTable flag;
            StuBLL stuBLL = new StuBLL();
            flag = stuBLL.selectStuBLL(StuInfo);
            return flag;
        }
        #endregion


        #region//新增到學生表

        public Boolean addStu(Entity.StuInfo StuInfo)
        {
            bool flag;
            StuBLL stuBLL = new StuBLL();
            flag = stuBLL.addStu(StuInfo);
            return flag;
        }

        #endregion
//user表
//查詢是否存在

        public DataTable selectaddUser(Entity.userinfo userinfo)
        {
            DataTable userflag;
            UserBLL userBLL = new UserBLL();
            userflag = userBLL.selectUserBLL(userinfo);
            return userflag;

        }
//新增資訊到user表

        public Boolean addUser(Entity.userinfo userinfo)
        {
            bool userflag;
            UserBLL userBLL = new UserBLL();
            userflag = userBLL.addUser(userinfo);
            return userflag;
        }

UI

//註冊
        private void buttonok_Click(object sender, EventArgs e)
        {

            //判空--------程式碼省略

            if (txtUserID.Text == "")
            {
                MessageBox.Show("請輸入賬號","提示",MessageBoxButtons .OK ,MessageBoxIcon.Warning );
                txtUserID.Focus();
            }

            else if (txtExplain.Text == "") ---------資料庫中備註是可為null的
            {
                txtExplain.Text = "無";
            }

            else
            {
                //判存學生表與user表是否存在ID,沒有則將註冊資訊插入到表中

                try
                {

                    Facade.StuFacade Facade = new Facade.StuFacade();//例項化學生外觀

                    Entity.StuInfo stu = new Entity.StuInfo();      //例項化使用者

                    stu.UserID = txtUserID.Text.Trim();


                    DataTable flag = Facade.selectStu(stu);

                    //--------------------------------user

                    Facade.UserFacade facade = new Facade.UserFacade();//例項化user外觀

                    Entity.userinfo UserInfo = new Entity.userinfo(); //-----------例項化user實體

                    UserInfo.UserID = txtUserID.Text.Trim();
                    DataTable userflag = facade.selectaddUser(UserInfo);


                    if (flag.Rows.Count != 0||userflag .Rows.Count !=0)
                    {
                        MessageBox.Show("使用者已存在", "溫馨提示");
                        txtUserID.Focus();
                    }
                    else
                    {

                  //將資訊新增到學生表中

                        stu.UserID = txtUserID.Text.Trim();
                        stu.studentName = txtstudentName.Text.Trim();
                        stu.Sex = cmbSex.Text.Trim();
                        stu.Department = txtDepartment.Text.Trim();
                        stu.Grade = txtGrade.Text.Trim();
                        stu.Class = txtClass.Text.Trim();
                        stu.Cash = Convert.ToDecimal (txtCash.Text.Trim());
                        stu.Type = "一般使用者";
                        stu.Explain = txtExplain.Text.Trim();
                        stu.Ischeck = "未結賬";

                //將資訊新增到user表

                        UserInfo.UserID = txtUserID.Text.Trim();
                        UserInfo.PWD = "666666";
                        UserInfo.UserName = txtstudentName.Text.Trim();
                        UserInfo.Level = "一般使用者";
                        UserInfo.state = "正在使用";

                //檢視是否插入成功

                        bool addflag = Facade.addStu(stu);
                        bool userflag1 = facade.addUser(UserInfo);

                        if (addflag == false||userflag1 ==false)
                        {
                            MessageBox.Show("註冊失敗");
                        }
                        else
                        {
                            MessageBox.Show("註冊成功!");
                            Clear clear = new Clear(this);
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
                #endregion

        }

設定combo:

    private void frmRegister_Load(object sender, EventArgs e)
    {
       cmbSex.Items.Add("男");
       cmbSex.Items.Add("女");
    }

錯誤集錦

1將截斷字串或二進位制資料

這裡寫圖片描述

解析:這個是因為資料庫裡面的欄位設定與輸入的內容衝突。
sex這個combo選擇是“男”“女”,我將資料型別設定的char(1)。但是一個漢字佔兩個位元組,所以資料庫的儲存不夠,就報錯了。
解決:改為char(2)就可以了。
這裡寫圖片描述


2.型別當作變數來使用
解決:將sqlParameter[0]改為sqlParams[0]就可以了。這裡的sqlParams是變數,而sqlParameter是型別。
這裡寫圖片描述


3.欄位初始值無法引用非靜態欄位

這裡寫圖片描述

這三句程式碼是寫在方法裡的,但是這裡直接是在類裡。少了一行程式碼。

public DataTable selectStuBLL(Entity.StuInfo StuInfo)

原始碼應該為:

public class StuBLL
    {
        //查詢學生是否存在
        public DataTable selectStuBLL(Entity.StuInfo StuInfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory(); //例項化工廠

            IDAL.StuIDAL idal = fact.Student();                     //呼叫工廠方法建立介面

            DataTable table = idal.selectStu(StuInfo);              //接受D層返回值

            return table;
        }
    }

這個一看就是照著葫蘆畫瓢,沒有邏輯思維。所以在敲程式碼之前,一定要先捋順了腦子。

後記

分享到這,另:附屬一個一鍵清空的方法。一鍵清空

相關文章