C#七層登入詳細講解,如何成功的實現程式的執行
阿新 • • 發佈:2021-01-28
技術標籤:C#
環境:
SQL Server 2019:
以下是我用到的資料庫命名
資料庫 | CRCS |
---|---|
資料庫表 | UserInfo |
資料庫表設計如下
Visual Stuio 2019
同一框架為 .NET Framework 4.8
建立一個winform窗體 以及其他類庫
輸出型別 | 程式集名稱 | 引用層次 |
---|---|---|
windows應用程式 | UI | Facade層、 Entity層 |
類庫 | IDAL | Entity層 |
類庫 | Factory | IDAL層 |
類庫 | Facade | BLL層 、Entity層 |
類庫 | Entity | |
類庫 | DAL | IDAL層、Entity層 |
類庫 | BLL | Entity層、Factory層、IDAL層 |
winform窗體如下
所需控制元件
Botton
窗體以及控制元件命名
使用者名稱文字框 | txtUserName |
---|---|
密碼文字框 | txtPassWord |
按鍵 | butOK |
UI層程式碼
using System;
using System.Windows.Forms;
namespace UI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 按鈕點選事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void butOK_Click(object sender, EventArgs e)
{
//判斷文字框是否為空
if (txtUserName.Text.Trim() == "")
{
MessageBox. Show("請輸入你的使用者名稱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else if (txtPassWord.Text == "")
{
MessageBox.Show("請輸入你的密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
//例項化物件 裝飾層物件|實體層物件
Facade.LoginFacade zhuangshi = new Facade.LoginFacade();
Entity.UserInfo yonghu = new Entity.UserInfo();
//實體層物件接受文字框的值 yonghu 是Entity層包裝起來的物件{userid,password,level,username}
yonghu.UserName = txtUserName.Text;
yonghu.PassWord = txtPassWord.Text;
//定義布林值開始進行後續操作
Boolean flag = false;
Facade.LoginFacade denglu = new Facade.LoginFacade();//例項化一個登入物件
//跳到Facade層,把yonghu 這個物件當做值傳入
flag = denglu.SelectUser(yonghu);
//用布林值判斷是否登入成功
bool Flase = false;
if (flag != Flase)
{
MessageBox.Show("登入成功");
this.Hide();
this.DialogResult = System.Windows.Forms.DialogResult.OK;
Form a = new Form();
a.Show();
}
else
{
MessageBox.Show("使用者名稱或密碼不正確");
}
}
}
}
}
UI層配置檔案
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
</startup>
<appSettings>
<add key="DB" value="DAL"/>
<add key="conStr" value="server=資料庫服務名;Database=資料庫名;uid=sa;pwd=123456"/>//這裡用的是驗證登入
</appSettings>
</configuration>
IDAL層
using Entity;
using System.Data;
namespace IDAL
{
//介面層
public interface LoginIDAL
{
//由DAL層的LoginDal類實現介面
DataTable SelectUser(UserInfo yonghu);
}
}
Factory
using System.Reflection;
namespace Factory
{
//在BLL層中例項化
public class LoginFactory
{
//配置檔案在UI層
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
//在BLL層中呼叫生成一個DAL的LoginDal類
public IDAL.LoginIDAL CreateUser()
{
string ClassName = StrDB + "." + "LoginDal";
return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
}
}
}
Facade 層
using System;
namespace Facade
{
/// <summary>
/// 在UI層中生成的物件
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public class LoginFacade
{
//從UI層過來,將Entity層中生成的物件 yonghu 值是 {userid,password,level,username} 傳入
public Boolean SelectUser(Entity.UserInfo yonghu)
{
bool flag;
BLL.LoginBll userbll = new BLL.LoginBll();//例項化BLL物件
flag = userbll.UserBll(yonghu);//跳到BLL層,呼叫用BLL層的方法UserBLL,得到一個布林值
return flag;//返回布林值給UI層
}
}
}
Entity層
namespace Entity
{
public class UserInfo
{
//定義 使用者ID
private int userid;
public int UserId
{
get { return userid; }
set { userid = 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 string username;
public string UserName
{
get { return username; }
set { username = value; }
}
}
}
BLL層
using System.Data;
namespace BLL
{
//在Facade中生成的例項
public class LoginBll
{
//由Facade層呼叫的方法, 值是 Entity層 生成的物件 yognhu 值是 {userid,password,level,username} 傳入
public bool UserBll(Entity.UserInfo yonghu)
{
//跳到Factory層去例項化一個工廠
Factory.LoginFactory fact = new Factory.LoginFactory();
//呼叫工廠方法生成的DAL.LoginDal類實現介面 JieKou(介面)
IDAL.LoginIDAL JieKou = fact.CreateUser();
//跳到DAL層的LoginDal類中,返回一個表賦值給table
//為什麼會跳到DAL層,因為DAL層的LoginDal類實現了介面
DataTable table = JieKou.SelectUser(yonghu);
bool flag;
if (table.Rows.Count == 0)//返回資料表型別,如果行數=0,說明沒有符合該賬號密碼的使用者
{
flag = false;
}
else
{
flag = true;
}
return flag;//返回布林值給Facade層
}
}
}
DAL層
LoginDal類
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
//在Factory層中產生
public class LoginDal : IDAL.LoginIDAL
{
//在BLL層進行呼叫
public DataTable SelectUser(Entity.UserInfo yonghu)
{
SqlHelper sqlHelper = new SqlHelper();//例項化DAL層中的SqlHelper類
//對映,具體參考MSDN這個類的介紹
SqlParameter[] sqlparams =
{
new SqlParameter(@"UserName",yonghu.UserName),
new SqlParameter(@"PassWord",yonghu.PassWord)
};
//真正在資料庫中進行操作的語句,匹配資料庫表,參考sql server語句使用方法
string sql = @"SELECT * FROM UserInfo WHERE [email protected] AND [email protected]";
//跳到DAL層中的SqlHelper類的方法ExecuteQuery 含有3個引數
DataTable dt = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);
return dt;//返回給BLL層資料表
}
}
}
DAL層
SqlHelper類
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
//資料訪問層,資料操作類
public class SqlHelper
{
//定義資料庫連線操作,指定在資料庫上操作的型別
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;//流的方式讀取資料庫內容
/// <summary>
/// 建立連線語句
/// </summary>
public SqlHelper()
{
string connStr = ConfigurationManager.AppSettings["conStr"];
conn = new SqlConnection(connStr);
}
/// <summary>
/// 判斷資料庫是否已經連線
/// </summary>
/// <returns></returns>
private SqlConnection GetConn()
{
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
///<summary>
///執行不帶引數的資料庫操作或者儲存過程
/// 增刪改查操作
/// 返回受影響的行數
///</summary>
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
cmd = new SqlCommand(cmdText, GetConn());//命令語句
cmd.CommandType = ct;//?
res = cmd.ExecuteNonQuery();
if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
}
return res;
}
//執行帶引數的資料庫操作或者儲存過程
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;
}
//執行不帶引數的SqL查詢語句或者儲存過程
public DataTable ExecuteQuery(string cmdText, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
//執行帶引數的SQL查詢語句或儲存過程
//有DAL層的LoginDal類中進行呼叫
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();//建立一個新表
cmd = new SqlCommand(cmdText, GetConn());//資料庫命令操作,實際上就是進行資料庫語句
cmd.CommandType = ct;//commandType 代表要執行的型別 commandTyop.Text 是以SQl語句進行查詢 在LoginDal類中傳入的
//sql語句或儲存過程的引數 各個引數到dataset的對映
//向 SqlParameterCollection 的末尾新增一個值陣列。
cmd.Parameters.AddRange(paras);
//sdr = cmd.ExecuteReader()解釋 生成一個只讀的物件
//CommandBehavior.CloseConnection 作用:返回物件前,資料庫不能被關閉
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);//填充表 //感覺好像sdr是一張表,然後貼到了dt表上
}
/*以上過程下來以後,新表dt中只有userid和password兩列的值*/
return dt;//返回給DAL層LoginDal類一個數據表
}
}
}
可能出現的問題 & 解決方案
一、部分類的使用要用到系統的名稱空間
例如:
System.Data; |
---|
System.Reflection; |
using System.Data.SqlClient; |
using System.Configuration; |
需要新增引用
二、建立層的時候一定要注意,除了UI層其他層都是建立的類庫
三、資料庫的連線和操作方法