簡單的不能再簡單的.net三層實例,只適合剛接觸的菜鳥們看,大神就不要看了。 ...
學習asp.net兩周,通過學習發現,.net和php之間的區別還是蠻大的,比php要複雜一些,開始學習的有些吃力,後來跟著傳智播客里的老師學習,漸漸的學到了一些東西。
今天要記錄一下.net里的簡單的三層架構是如何實現的,希望通過一次次的博客記錄能加深自己對知識點的理解和記憶,當然,如果有幸能幫到某些和我一樣的同學,那也是非常榮幸和欣喜的,好了,閑言少敘,下麵開始記錄。
三層架構我自己也不是很熟,只是大概的知道其工作原理,以及構建流程,這裡貼出傳智博客的老師講解的一張原理圖,然後就略過了,畢竟本人太菜,不敢誤導別人。
如上圖所示,是一張三層結構工作原理圖,三層結構分為
UI(視圖層):人眼直接能看到的內容,如winform,website等;
Bll(業務邏輯層):處理與業務相關的邏輯;
Dal(數據訪問層):只負責接收業務邏輯層的調用,處理相關的資料庫CURD操作,只跟資料庫打交道,與UI層完全分離;
Common和Model:一些三層之外的文件,這些文件可以寫一些靜態類,實體類等東西,這裡面的內容三個類都可以調用;
關於三層結構的原理只做簡單說明,想要詳細瞭解的同學,請自行百度,閱讀技術大牛們的博客,下麵對該三層實現的步驟做詳盡的說明。
第一步:創建UI,BLL,和DAL
1.打開ide ,VS20XX,(我這裡用的是最新版的VS2017),點擊文件 ==》 新建 ==》項目,如下圖所示:
2.選擇其他項目類型下的VS'解決方案 ==》空白解決方案,命名,選擇保存路徑後點擊確定;
3.右擊解決方案 ==》點擊添加 ==》新建項目 ==》選擇 Windows窗體應用 ==》命名為UI(這裡我們以窗體作為顯示層,這裡也可以把website空網站作為顯示層,用起來都是一樣的);
4.右擊解決方案,添加新項目 ==》選擇新建 類庫(.net Framework),這裡不要選錯,因為選項里有三個類庫選項,我們應該選擇 後面 括弧裡帶 .net Framework 的類庫,選其他的會出錯,至於為什麼,我也不知道,見諒見諒哈。
5.同樣的方法,新建Bll,建好之後,應該有如圖所示的幾個東西,
第二步:所要完成的功能的說明:
在這裡我要完成的功能其實非常非常的簡單,就是查詢一張表,看裡面有多少條數據,然後返回數據的條數,大致是這樣的,我們有一個窗體窗體上有個按鍵,點擊這個按鍵(查看XXX表中的數據條數),彈出視窗,顯示:XXX表中有XX條數據。
這裡我要操作的是一個名為TbAreas的表,如圖所示:
第三步:三層實現流程介紹
1.確定sql語句
為了保證資料庫操作語句不出錯誤,我先在資料庫中新建查詢,看能不能查到我要的結果,我用的資料庫是sqlserver,資料庫管理軟體是微軟的 MSMS,查詢結果如圖所示:
如圖所示可以看到,用該語句查詢出的結果是表中有54條數據,下麵我看一下是否有誤:
由圖可知,無誤,故我們的語句確定為:sql = "select count(*) from TbAreas" ;
2.在數據訪問層編寫執行該sql語句的函數
首先給DAL里的Class1.cs重命名為:表名+Dal+.cs,這裡餓哦們命名為:TbAreasDal.cs;
需要我知道的是,三層里,每個表對應一個類,以後操作同一張表的所有函數都寫在同一個類中。
然後,開始編寫代碼了,在Dal里的TbAreasDal類中編寫如下方法:
代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dal
{
public class TbAreasDal
{
//在這裡編寫資料庫操作函數
public int GetRecordCount()
{
//sql語句
string sql = "select count(*) from TbAreas";
//調用SqlHelper里的方法執行查操作語句
return (int)SqlHelper.ExcuteScalar(sql,System.Data.CommandType.Text);
}
}
}
這個裡面的代碼就是這樣了,但是,很遺憾,這個代碼是錯誤的,貼上圖片給你看:
因為我的代碼里沒有SqlHelper這個類。SqlHelper這個類是需要自己封裝的一個資料庫操作類,這個類怎麼封裝不是我今天要記錄的內容,以後有時間會記錄一下的。這個類我已經封裝過,直接複製到Dal項目下,如下圖所示:
先給代碼:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 封裝SqlHelper類
{
public class SqlHelper
{
//定義一個連接字元串
//readonly修飾的變數,只能在初始化的時候賦值,以及構造函數中賦值
private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;
//1.執行增(insert)刪(delete)改(update)的方法 ExecuteNonQuery()
public static int ExecuteNonQurey(string sql,CommandType cmdType,params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql,con))
{
cmd.CommandType = cmdType;
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
//2.執行查詢,返回單個值的方法 ExecuteScalar
public static object ExecuteScalar(string sql, CommandType cmdType, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
cmd.CommandType = cmdType;
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteScalar();
}
}
}
//3.執行查詢,返回多行的方法ExecuteReader
public static SqlDataReader ExecuteReader(string sql, CommandType cmdType, params SqlParameter[] pms)
{
SqlConnection con = new SqlConnection(conStr);
using (SqlCommand cmd = new SqlCommand(sql,con))
{
cmd.CommandType = cmdType;
if(pms != null)
{
cmd.Parameters.AddRange(pms);
}
try
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
//System.Data.CommandBehavior.CloseConnection這個枚舉參數,表示將來使用完畢SqlDataReader後,在關閉reader的同時,在SqlDataReader內部會將關聯的Connection對象也關閉掉
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
catch
{
con.Close();
con.Dispose();
throw;
}
}
}
public static DataTable ExecuteDataTable(string sql,CommandType cmdType,params SqlParameter[] pms)
{
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql,conStr))
{
adapter.SelectCommand.CommandType = cmdType;
if (pms != null)
{
adapter.SelectCommand.Parameters.AddRange(pms);
}
adapter.Fill(dt);
}
return dt;
}
}
}
然後看看圖片:
細心的你一定一眼就看到了這裡有個bug啦,當前文中不存在這個ConfigurationManager類,所以啊,我要把這個東西搞進來先。那麼問題來了,在哪裡搞呢,自己寫一個嗎,不,不是的,這是個系統自帶的東西,我只需要引用進來就行了;
怎麼引用,往下看:
(1)右擊Dal下的引用,點擊 添加引用 ==》程式集 ==》 框架(如果最近引用過可以點擊最近)==》找到這個東西 System.Configuration, 打上溝,點擊確定,就可以了
(2)看一下引用後的結果吧:
現在可以看到,那個錯誤沒有了。
事實上,做到這一步,我們的這個SqlHelper還是不能正常使用的,為什麼,細心的你可能會發現,在SqlHelper里鏈接資料庫的字元串conStr後面的東西跟我們學的時候看到的語句不一樣啊,這裡既沒寫我要連那個伺服器,也沒寫要連那個資料庫,更沒寫是那個用戶登錄的,登錄密碼是啥?那咋辦呢,這是為啥呢?
下麵來講:因為資料庫的鏈接是一個很頻繁的操作,如果我們在每個資料庫連接的方法中都寫上一串下麵這個代碼:
string conStr = "Data Source = .;Initial Catalog = 資料庫名;User ID = sa;Password = XXXX";
那會是非常繁瑣的,而且如果有朝一日需要改動這個資料庫,那需要改的文件就太多了,因此啊,我們把這個東西放到了一個全局配置文件中,這個文件就是App.config,這個文件vs2017是預設就有的,以前版本的好像要自己新建。
下麵點擊打開App.config, 在裡面添加<connectionStrings><add XXXXXXXX/></connectionStrings>這樣的一串代碼:
代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<connectionStrings>
<add name="mssqlserver" connectionString="Data Source = acer-pc;Initial Catalog = FirstDB;User ID = sa; Password = 168168"/>
</connectionStrings>
</configuration>
添加好後,把name = "XXX"里的這個XXX名字寫到SqlHelper里的那個位置去就可以了
到這個地方這資料庫相關的東西就弄好了,下麵我們回到TbAreasDal.cs里來,
此時SqlHeiper這個類已經有了,但是還沒有引進來。
怎麼引,簡單,將游標定位到劃紅線的地方,使用快捷鍵 Ctrl + Alt +F10 ,會彈出提示語句,選中提示語句就可以了,這個快捷鍵還蠻好用,可以記一記。如圖所示:
下麵給出正確的TbAreasDal.cs代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 封裝SqlHelper類;
namespace Dal
{
public class TbAreasDal
{
//在這裡編寫資料庫操作函數
public int GetRecordCount()
{
//sql語句
string sql = "select count(*) from TbAreas";
//調用SqlHelper里的方法執行查操作語句
return (int)SqlHelper.ExecuteScalar(sql,System.Data.CommandType.Text);
}
}
}
到這裡Dal層就寫完了,下麵來看Blll層。
3.在業務層編寫業務邏輯代碼
首先給Bll里的類重命名為TbAreasBll.cs,然後編寫代碼:
代碼如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Bll
8 {
9 public class TbAreasBll
10 {
11 TbAreasDal dal = new TbAreasDal();
12 public int GetRecordCount()
13 {
14 return dal.GetRecordCount();
15 }
16 }
17 }
但是,此時這個代碼還有問題,如下圖所示
沒錯,這裡缺少Dal項目的引用啊,只有把他引進來,才能使用他啊。怎麼引,兩種辦法,一種、直接在上圖左邊的紅框上點一下,還有一種,右擊Bllx下的引用 ==》添加引用 ==》 項目 ==》勾上Dal,如圖所示:
就是這樣子了,引進來後就沒有錯誤了。咋的,不信啊,不信給你看圖啊:
到這裡,業務層也交代完了,接下來看UI層。
4.UI層——進行用戶操作,獲取反饋結果
首先給UI層的窗體重命名為AreasNum.cs,然後在上面添加一個按鈕。,如下圖所示:
這樣就可以了,接下來雙擊按鈕,進行相應的代碼編輯:代碼如下:
1 private void button1_Click(object sender, EventArgs e)
2 {
3 //實例化TbAreasBll類,這裡同樣要引用一下Bll這個命名空間,否則會報錯
4 TbAreasBll bll = new TbAreasBll();
5
6 //調用bll里的方法,獲取條數
7 int row = bll.GetRecordCount();
8
9 //顯示條數
10 MessageBox.Show("TbAreas表中有"+ row + "條記錄");
11
12 }
需要註意的是,這個代碼里同樣需要先引用Bll,不然同樣會出錯,程式運行的結果為:
這與我前面用sql語句在資料庫直接查詢的數據是一致的。
好了,這個最簡單的三層就記錄到這裡啦,雖然是如此的簡單,但還是寫了這麼長,沒辦法,誰叫我菜呢。
以上的內容是觀看傳智播客趙曉虎老師的視頻課所學,在此感謝傳智播客。對於以上所述內容,發現有重大謬誤的,歡迎口水留言,謝謝!
我的QQ:3074596466