景月嬌 廊坊師範學院資訊科技提高班 十四期
阿新 • • 發佈:2018-12-13
小激動
經過兩天的“刻苦鑽研”,終於在今天的9:30分登入成功了!!!其實好久都沒有正兒八經的敲程式碼了,剛開始的時候真是頭疼,但是還是硬著頭皮開始了重構(因為學習進度真的是慢的不要不要的了!)。
除了感謝自己能夠勇敢的往前走了,在登入成功的過程中還要感謝:我桌邵聰、對桌偉傑、還有趙雷童鞋。O(∩_∩)O哈哈~
還有就是每一次做這種小系統,都證明了一個問題:就是真的沒自己想的那麼難,只要去做就好了,做著做著就懂了,就算不懂,過後就懂了…
七層
-
顯示層(UI)
-
外觀層(Facade) 實現了外觀模式,作為UI和BLL的橋樑,解除了它們之間的耦合
-
邏輯層(BLL)
-
介面層(IDALL) 在這個層次上,定義了一個統一的介面,解除BLL層和DAL層之間的耦合
-
資料訪問層(DAL) 在此有拓展一個SQLHelper層,主要使封裝對資料庫呼叫的一些程式碼,這樣就提高了我們程式碼的靈活性!
-
工廠層(Factory) 實現了工廠模式+反射,使資料庫的修改更加簡便,通過修改配置檔案實現資料庫的修改
-
實體層(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;
}
}
後記
這些程式碼都是站在巨人的肩膀上敲出來的,但是敲出來並不一定能夠執行呦,會出現很多錯誤,在敲登入時的一些注意事項和錯誤解決方案,看我的下一篇部落格吧!