三层实例(内涵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基础一 |