C#機房重構之註冊窗體
前言
在敲程式碼之前畫出自己想要的流程圖,從一下幾點來描述一下我的註冊。
我是以資料庫表來建立類庫的,也可以以功能,以增刪改查等。
注意
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;
}
}
這個一看就是照著葫蘆畫瓢,沒有邏輯思維。所以在敲程式碼之前,一定要先捋順了腦子。
後記
分享到這,另:附屬一個一鍵清空的方法。一鍵清空
相關文章
- C#機房重構-如何一鍵清空C#
- 機房重構總結
- C#機房重構-實時檢視上機餘額(狀態模式)C#模式
- SSM 重構註冊登陸介面SSM
- C# 如何重複呼叫父窗體中的子窗體C#
- 機房收費系統總結——窗體程式碼框架框架
- 【VB.Net機房重構】--簡述配置檔案
- C#:註冊元件 (cmd)C#元件
- 微服務架構之「 服務註冊 」微服務架構
- HostBastic法國OVH機房月付1.39歐元高防VPS註冊教程AST
- .NET Core中介軟體的註冊和管道的構建(1)---- 註冊和構建原理
- 【VB.Net機房重構】儲存過程的使用儲存過程
- C# 註冊Windows服務C#Windows
- 軟體重構之思考
- c# form窗體C#ORM
- 【個人機房重構】——建立資料庫三部曲資料庫
- 【C#之控制檯與窗體應用程式】C#
- C# WinForm 父窗體 子窗體 傳值C#ORM
- vue之元件註冊Vue元件
- C#窗體--滑鼠事件C#事件
- c# mdi多窗體C#
- 讓gin,echo等golang框架支援結構體註冊Golang框架結構體
- C# 免註冊呼叫大漠外掛C#
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊原始碼
- C#實現窗體全屏C#
- c# 窗體自適應C#
- 菜鳥破解之軟體自己顯示註冊碼
- 【SpringBoot】服務對註冊中心的註冊時機Spring Boot
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現 (四)之自我保護機制原始碼
- C#實現無法破解的軟體註冊碼演算法C#演算法
- .NET Core中介軟體的註冊和管道的構建(2)---- 用UseMiddleware擴充套件方法註冊中介軟體類套件
- Vue元件之全域性註冊Vue元件
- SpringCloud之服務註冊SpringGCCloud
- c# form窗體modifiers屬性C#ORM
- 【一步一步瞭解你——泛型的應用(機房重構)】泛型
- c# winform實現dll載入時註冊C#ORM
- C# 註冊並使用sqlite 自定義函式C#SQLite函式
- 使用C#開啟新視窗關閉舊視窗的方法;winform中防止重複開啟多個相同子窗體C#ORM