三層實例(內涵Sql CRUD)
今天的實例教程里面主要說明下面幾個問題:
- 點擊按鈕顯示表中記錄條數
- 點擊按鈕顯示表中所有數據
- 女同學年齡-1歲
- 刪除年齡小於18歲的人
- 三層實現對TblStudent表的增刪查改
點擊按鈕顯示表中記錄條數,還是思考下需要什么樣的SQL語句。
這個SQL語句比較的簡單,我們開始寫數據訪問層。建一個訪問學生表的類。
一、獲取數據條數-數據訪問層代碼
業務邏輯層直接獲取數據訪問層中的方法就可以了。在bll層建個類。
二、獲取數據條數-業務邏輯層代碼
三、獲取數據條數-界面層代碼
這個三層寫起來是不是比較的簡單呢?是的,我們發現三層邏輯越復雜寫起來就越麻煩。
下面寫:點擊按鈕顯示表中所有數據
我們先寫好winform界面:
四、寫好winfrom界面
然后想想執行這個操作需要用到SQL語句,這個SQL語句也比較的簡單。
數據訪問層寫個執行SQL語句的方法就行了,然后返回一個集合。推薦使用list集合。
還是操作Dal中的那個類
五、與TblStudent表映射的實體類
六、顯示到DGV上的數據訪問層
數據訪問層寫好就該寫業務邏輯層了。
六、顯示到DGV上的業務邏輯層的兩種方法
七、顯示到DGV上的界面層代碼
八、常見錯誤一
顯示到界面演示
實際上,上面那么寫IEnumerable。也是為了多態。效率上講是一樣的。
九、顯示類名的方法
十、修改表中列名的方法
實力類的屬性用來綁定成列名。
十一、數據綁定只認屬性,不認字段
接下來我們做把所有女同學的年齡都減一歲。
還是想一下sql語句是什么?
還是操作學生表,還是先寫數據訪問層的代碼。
十二、所有女同學年齡都減1歲數據訪問層代碼
十三、所有女同學年齡減1歲業務邏輯層代碼
最后直接在界面層調一下就可以了。
十四、所有女同學年齡減1歲界面層代碼
所有女同學的年齡減一歲演示
再寫個刪除所有年齡小於18歲的人
跟上面那個幾乎是一樣的。
確定完sql語句之后,還是先寫數據訪問層。
十五、刪除年齡小於18歲的學生信息dal代碼
十六、刪除年齡小於18歲的學生信息bll代碼
十七、刪除年齡小於18歲的學生信息UI代碼
下面演示一下,重點看下如果年齡為空的時候,是否被刪。
刪除所有年齡小於18歲的學生信息
從演示的結果我們看到,年齡為空值的時候,是沒辦法刪除的。
下面我們要做的是,用三層實現對TblStudent表的增刪查改
先畫好界面:
十八、畫好界面
接下來我們寫dal的插入語句。
十九、對TblStudent表的增dal代碼
下面寫bll層的代碼
就是這打醬油的。
二十、對TblStudent表的增bll代碼
接下來在UI層進行調用
二十一、對TblStudent表的增UI代碼
我們這里做的判斷比較的特殊,當數據表中有允許不為空的時候。在UI層的判斷,也是要判斷下用戶輸入的值是不是可以為空。為空的話在UI層就要用正則校驗一下。不能等到了dal層,讓數據庫進行判斷。
改下啟動程序,然后演示下插入一條數據:
向學生表中插入一條記錄
仔細看我文章的朋友可能會發現,我在頭次寫代碼的時候,UI層少寫了一個Phone。
最后看下輸入文本的清空:
二十二、清空文本框
下面我們做個查詢數據:
剛才我們做過這個功能,我們直接調下就可以了。
二十二、調插入數據UI代碼
下面我們寫當我點擊一行的時候,刪除一行。
二十三、根據主鍵Id刪除dal代碼
二十四、根據主鍵Id刪除bll代碼
二十五、根據主鍵Id刪除UI代碼
要想隨意點中就選中一行的話,得單獨寫一下。
二十六、點中任意部位選中一行
刪除完成以后,重新加載:
二十七、刪除之后重新加載
刪除選中記錄演示
二十八、解釋一條代碼
如果要想選中多行同時刪除,需要把我們剛才設置的dataGridView的屬性改下。需要用遍歷下SelectedRows[0]這個集合。
下面我們做下更新:
當修改的時候,先要讀取這行的數據。
然后再修改。
二十九、畫好界面,讓更新的內容顯示到之前的文本框
三十、讓dataGridView設置成只讀的形式
下面我們就該在dal層寫一條,update語句。寫dal代碼了。
三十一、更新dal代碼
三十二、更新bll代碼
三十三、更新UI代碼
更新UI代碼
下面我們留個作業,做個話術腳本。
需求:有一個T_Scripts表
如圖所示:
三十四、話術腳本
有父子id關系,就像我們之前做的省市一樣。有一級節點
首先要求當窗體一加載的時候,將這些節點加載到treeview上面。
當點擊公司簡介時,在旁邊的窗體上顯示對應的信息。
三十五、話術腳本演示圖
這個跟我們之前做的資源管理器特別的像,點擊某個父類別增加子類別。點擊某個父類別鼠標右鍵遞歸刪除,還有做個更新的功能。
再做個話術搜索功能。
演示下在treeview上怎么有復選框?
三十六、在treeview上怎么有復選框
三十七、tabindex屬性
下面我們說下上到題目中的話術搜索的內容,這個功能是跟界面層緊密相關的。所以我們寫在界面層。
三十八、畫好界面
待會我在文本框輸入文字,一點搜索,讓節點中帶0的背景色變化同時父節點展開。
三十九、搜索節點並展開代碼
新增內容:
新增、TreeNodeCollection用F12看下
新增:TreeNodeCollection調的接口
新增:證明調的是接口
新增: 泛型集合里面有泛型接口
新新增: GetEnumerator()
新新增: foreach總結
搜索節點並展開演示
三層架構的好處
解耦
分工合作,開發人員可以專注於某一層
可移植性
支持分布式系統開發(基於網絡)
擴展性強。 MSSQL、Oracle之間切換
三層:
UI層
BLL層(業務邏輯層,得到UI層的數據,返回UI層要的東西。不能出現MessageBox、TextBox等。)
DAL層(DataTable等都應該在DAL中而不應返回DataTable,返回都是模型類(實體類))
三層總結
三層:UI(界面,User Interface)、BLL、DAL。Model是在三層之間進行數據傳遞的。UI層調用BLL、BLL調用DAL,數據用Model傳遞,UI不能直接調用DAL。Model不是一個層。
DAL層只有SQL語句和數據處理,其他層一般不應該出現SQL語句以及和ADO.net相關的類簡單的BLL只是調用DAL,但是BLL不是打醬油的:數據校驗應該放到BLL;BLL也會組合DAL成新的操作,比如ChangePassword。
DAL層中只要和數據庫操作,BLL中才有具體的邏輯
三層和所有代碼寫在一起的區別就像分工明確的麥當勞和收錢、做飯一起的賣煎餅的區別。
三層一般會比不分層慢,但是為了分工明確,這樣的少量的性能下降是可以的,很多時候效率不是唯一追求的因素。
案例:用三層架構重寫登錄、改密碼、話術管理。登錄可以返回一個枚舉,表示成功、用戶名不存在、密碼不對。
DAL與BLL中為什么不用static方法static類?
為了以后的多態!工廠模式等情況下。
Global.CurrentId是UI層的。
更新前要先Get數據,然后再修改。
接下來咱們看下三層中的多條件搜索問題
1.拼sql,寫在DAL中。
2.使用存儲過程
插入代碼位置:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 11 namespace WindowsFormsApplication1 12 { 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void button1_Click(object sender, EventArgs e) 21 { 22 //1.在UI層構建一個集合,這里沒列出Condition。 23 //PropertyName-查詢哪兒一列,Value-這列的值,Opt-這列的符號 24 List<Condition> list = new List<Condition>(); 25 Condition cName = new Condition() { PropertyName = "Name", Value = textBox1.Text.Trim(), Opt = Operation.Like }; 26 27 Condition cAge = new Condition() { PropertyName = "Age", Value = textBox2.Text.Trim(), Opt = Operation.Equal }; 28 29 Condition cPhone = new Condition() { PropertyName = "Phone", Value = textBox3.Text.Trim(), Opt = Operation.Like }; 30 list.Add(cName); 31 list.Add(cAge); 32 list.Add(cPhone); 33 34 SearchBll(list); 35 } 36 37 private void SearchBll(List<Condition> list) 38 { 39 SeatchDal(list); 40 } 41 42 //2.在dal層,循環遍歷集合,拼sql語句。 43 private void SeatchDal(List<Condition> list) 44 { 45 StringBuilder sbSql = new StringBuilder("select * from biao "); 46 List<string> listSql = new List<string>(); 47 List<SqlParameter> listPam = new List<SqlParameter>(); 48 foreach (Condition item in list) 49 { 50 StringBuilder sbCondition = new StringBuilder(); 51 #region 1 52 switch (item.PropertyName) 53 { 54 case "Name": 55 sbCondition.Append(" userName "); 56 break; 57 case "Age": 58 sbCondition.Append(" userAge "); 59 break; 60 case "Phone": 61 sbCondition.Append(" userPhone "); 62 break; 63 } 64 #endregion 65 66 #region 2 67 switch (item.Opt) 68 { 69 case Operation.Equal: 70 sbCondition.Append(" = "); 71 break; 72 case Operation.NotEqual: 73 sbCondition.Append(" <> "); 74 break; 75 case Operation.GreaterThan: 76 sbCondition.Append(" > "); 77 break; 78 case Operation.LessThan: 79 sbCondition.Append(" < "); 80 break; 81 case Operation.Like: 82 sbCondition.Append(" like "); 83 item.Value = "%" + item.Value + "%"; 84 break; 85 default: 86 break; 87 } 88 #endregion 89 90 sbCondition.Append("@" + item.PropertyName); 91 92 listSql.Add(sbCondition.ToString()); 93 listPam.Add(new SqlParameter("@" + item.PropertyName, item.Value)); 94 95 } 96 97 if (listSql.Count > 0) 98 { 99 string full = string.Join(" and ", listSql.ToArray()); 100 sbSql.Append(" where " + full); 101 } 102 MessageBox.Show(sbSql.ToString()); 103 104 foreach (SqlParameter p1 in listPam) 105 { 106 MessageBox.Show(p1.Value.ToString()); 107 } 108 } 109 } 110 }
關於sql中查詢的時候是否區分大小寫的問題
四十、關於sql語句不區分大小寫
四十一、通過設置實現區分大小寫
四十二、sql排序規則
四十三、為什么默認不區分大小寫
作者近期文章列表:
C#基礎教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#基礎教程,無任何商業目的。 希望與更多的代碼愛好者交流心得,也請高手多多指點!!!) |
|
三層 | 三層(一) |
三層相關案例(及常見的錯誤) | |
SQL數據庫 ADO.net | 數據庫的應用圖解一 |
數據庫的應用詳解二 | |
ADO.NET(內涵效率問題) | |
面向過程,面向對象中高級 | 面向過程,面向對象的深入理解一 |
面向過程,面向對象的深入理解二 | |
面向對象的深入理解三 | |
winform基礎 | Winform基礎 |
winform中常用的控件 | |
面向過程 | 三種循環的比較 |
C#中的方法(上) | |
我們常見的數組 | |
面向對象 | 思想的轉變 |
C#中超級好用的類 | |
C#中析構函數和命名空間的妙用 | |
C#中超級好用的字符串 | |
C#中如何快速處理字符串 | |
值類型和引用類型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File類 | |
多態 | |
C#中其它一些問題的小節 | |
GDI+ | 這些年我收集的GDI+代碼 |
這些年我收集的GDI+代碼2 | |
HTML概述以及CSS | 你不能忽視的HTML語言 |
你不能忽視的HTML語言2精編篇 | |
你不能忽視的HTML語言3 | |
CSS基本相關內容--中秋特別奉獻 | |
CSS基本相關內容2 | |
JavaScript基礎 | JavaScript基礎一 |