必发365bifa0000简单三层写法 ,为何要要利用三层架构,简单三层架构实现简单的用户登陆注册删除

by admin on 2019年1月14日

后日我们来说说三层,首先大家来看一下百度健全对于三层架构的分解:三层架构(3-tier
architecture) 日常意义上的三层架构就是将一切工作使用细分为:界面层(User
Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data
access
layer)。区分层次的目的即为了“高内聚低耦合”的思维。在软件系列架构设计中,分层式结构是最广泛,也是最重点的一种结构。微软引荐的分层式结构相似分为三层,从下至上各自为:数据访问层、业务逻辑层(又或称为世界层)、表示层。

1.LIKE操作符

1.1**百分号(%)通配符**

SELECT
prod_id, prod_name FROM Products WHERE prod_name LIKE
‘Fish%

必发365bifa0000 1

此例子使用了追寻格局’Fish%’。在执行这条子句时,将寻找任意以Fish着手的词。%告诉DBMS接受Fish之后的肆意字符,不管它有微微字符。

证实:区分轻重缓急写
遵照DBMS的不等及其配置,搜索可以是分别轻重缓急写的。假设分别轻重缓急写,则’fish%’与Fish
bean bag toy就不般配。

通配符可在探寻格局中的任意地点应用,并且可以拔取三个通配符。下面的例子使用六个通配符,它们放在格局的两端
:
SELECT prod_id,
prod_name FROM Products WHERE prod_name LIKE ‘%bean bag%’ 
必发365bifa0000 2

亟待特别注意,除了能匹配一个或三个字符外,%仍是可以匹配0个字符。%代表搜索格局中加以地方的0个、1个或三个字符。

警告:请注意NULL
通配符%看起来像是可以匹配任何东西,但有个不等,这就是NULL。子句WHERE
prod_name LIKE ‘%’不会配合产品名称为NULL的行。

1.2下划线(_)通配符

SELECT
prod_id, prod_name FROM Products WHERE prod_name LIKE
__ inch teddy bear’

必发365bifa0000 3

下划线的用途与%均等,但它只匹配单个字符,而不是两个字符。

1.3方括号([])通配符

方括号([])通配符用来指定一个字符集,它必须配合指定地方(通配符的岗位)的一个字符。

表明:并不总是帮助集合
与前方描述的通配符不平等,并不是具备DBMS都匡助用来创建集合的[]。唯有微软的Access和SQL Server帮助集合。为确定你使用的DBMS是否协理集合,请参阅相应的文档。

SELECT
cust_contact
FROM Customers
WHERE cust_contact LIKE
‘[JM]%’
ORDER BY cust_contact;

此通配符可以用前缀字符^(脱字号)来否认。 

 

2.应用通配符的技艺

正如所见,SQL的通配符很有用。但这种效用是有代价的,即通配符搜索一般比前边议论的别样搜索要耗费更长的拍卖时间。这里给出一些用到通配符时要牢记的技能。

  • 无须过度使用通配符。假使其他操作符能达到平等的目标,应该利用其它操作符。
  • 在真正需要使用通配符时,也尽量不要把它们用在追寻形式的开首处。把通配符置于开头处,搜索起来是最慢的。
  • 细心留意通配符的地方。假若放错地点,可能不会回去想要的数额。

总之,通配符是一种极其紧要和卓有功效的查找工具,将来我们日常会用到它。

大家应用三层架构就是为着让总体程序可以更进一步容易维护,业务逻辑和彰显形式还有数据库操做都可以分离来写,这样开发人士也可以更好的分工。而且便于扩展,假若假如工作需要扩充活着要去除某个需求,也容易修改。

3.创制统计字段

3.1拼接字段

mysql语法:

SELECT
Concat
(vend_name, ‘ (‘, vend_country, ‘)’ AS
vend_title FROM Vendors
ORDER BY
vend_name;

必发365bifa0000 4

concat()紧如果去除多余的空格。

SELECT语句我与在此从前使用的同一,只然则那里的推测字段之后跟了文本AS
vend_title。它提醒SQL成立一个涵盖指定统计结果的名为vend_title的盘算字段。从输出可以见到,结果与原先的一模一样,但近期列名为vend_title,任何客户端应用都可以按名称引用这一个列,就像它是一个实在的表列一样。
说明:**AS**平常可选
在广大DBMS中,AS关键字是可选的,然则最好利用它,这被视为一条最佳实践。
指示:别名的另外用途
别名还有另外用途。常见的用途包括在事实上的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩张它。
警告:别名
别名既可以是一个单词也得以是一个字符串。倘诺是后世,字符串应该括在引号中。尽管这种做法是官方的,但不提议如此去做。多单词的名字可读性高,然而会给客户端应用带来各样问题。因而,别名最常见的拔取是将三个单词的列名重命名为一个单词的名字。
说明:导出列
别名有时也称之为导出列(derived column),不管怎么叫,它们所表示的是一律的东西。

3.2举行算术总结

总括字段的另一常见用途是对寻找出的数额开展算术总括。

SELECT
order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM
OrderItems
WHERE
order_num = 20008;

必发365bifa0000 5

输出中显得的expanded_price列是一个总括字段,此总括为quantity*item_price。

必发365bifa0000 6

 

提示:怎么着测试统计
SELECT语句为测试、检验函数和测算提供了很好的法子。即使SELECT平时用于从表中检索数据,可是简单了FROM子句后哪怕简单地拜会和拍卖表明式,例如SELECT
3 * 2;将回到6,SELECT
Trim(‘ abc ‘);将重回abc,SELECT
Now();使用Now()函数重回当前些天子和岁月。现在你精通了,能够依据需要运用SELECT语句举行查看。

 

4.运用函数

4.1文本处理数据

全总假名变为大写:

SELECT
vend_name, UPPER(vend_name) AS vend_name_upcase
FROM
Vendors
ORDER BY
vend_name;

必发365bifa0000 7

 

可以见见,UPPER()将文件转换为大写,因而本例子中每个供应商都列出五遍,第一次为Vendors表中储存的值,第二次作为列vend_name_upcase转换为大写。

必发365bifa0000 8

4.2日子和岁月处理函数

其一在不同的数据库中远距离相比较大

MySQL和Maria(Maria)DB具有各样日期处理函数,但并未DATEPART()。MySQL和玛丽亚(Maria)(Maria)DB用户可接纳名为YEAR()的函数从日期中提取年份:
输入:
SELECT
order_num
FROM Orders
WHERE YEAR(order_date) = 2012;

4.3数值处理函数

必发365bifa0000 9

数值函数都是大抵的,自行看文档解决即可。

作者:今孝
出处:http://www.cnblogs.com/jinxiao-pu/p/6817187.html 
正文版权归作者和天涯论坛共有,欢迎转载,但未经作者同意必须保留此段声明,且在篇章页面显著地方给出原文连接。

以为好就点个推荐把!

下边我们就来用三层构造实现用户登录:

首先步大家创制一个化解方案,里面添加多少个类库,如下图所示:

必发365bifa0000 10

这多少个类库分别代表的是事情逻辑层BLL,数据访问层DAL,还有实体Entity,下一步就是添加你需要的显现层,我为了表示知道直接接纳了UI命名。必发365bifa0000 11

开创数据库我就不详细介绍了,只贴出代码就好了

1 CREATE TABLE [dbo].[Users]
2 (
3     [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
4     [Name] NVARCHAR(50) NOT NULL, 
5     [Pass] NVARCHAR(50) NOT NULL
6 )

 

方今大家先来起先写多少访问层,在多少访问层里,我们先是创立一个协理类SQLServerDALHelper,实现数量连接,代码如下:

必发365bifa0000 12必发365bifa0000 13

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Data.SqlClient;
 5 using System.Data;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10     public static class SQLServerDALHelper
11     {
12         //integrated security=true 的意思是集成验证,也就是说使用Windows验证的方式去连接到数据库服务器。
13         public static string Consql = @"Data Source=PC-201610212048;Initial Catalog=People_Data_System;Integrated Security=True";
14 
15         public static bool ExecuteNonQuery(string sql)
16         {
17             try
18             {
19                 using (SqlConnection conn = new SqlConnection(Consql))
20                 {
21                     conn.Open();//打开数据库
22 
23                    using( SqlCommand com = new SqlCommand(sql, conn)){
24                     return com.ExecuteNonQuery() > 0;
25                        //通过cmd对象对数据库进行操作,执行非查询
26                    }
27                 }
28             }
29             catch
30             {
31                 throw;
32             }
33         }
34 
35         public static Object ExecuteScalar(string sql)
36         {
37             try
38             {
39                 using (SqlConnection conn = new SqlConnection(Consql))
40                 {
41                     conn.Open();//打开数据库
42 
43                     using( SqlCommand com = new SqlCommand(sql, conn))
44                     {
45                         return com.ExecuteScalar();
46                     }
47                 }
48             }
49             catch
50             {
51                 throw;
52             }
53         }
54 
55         public static SqlDataReader GetDataReader(string sql)
56         {
57             try
58             {
59                 SqlConnection conn = new SqlConnection(Consql);
60 
61                 conn.Open();
62 
63                 using (SqlCommand com = new SqlCommand(sql, conn))
64                 {
65                     return com.ExecuteReader(CommandBehavior.CloseConnection);
66                 }
67             }
68             catch
69             {
70                 throw;
71             }
72         }
73     }
74 }

View Code

协理类写完之后就起来写数据库操做政工了,在此处说一下,帮助类微软特意有温馨包装的类,可以直接下载使用。数据访问代码如下:这里有大概的增删查方法

必发365bifa0000 14必发365bifa0000 15

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using Entery;
 5 using System.Data.SqlClient;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10      public class PeopleDAL
11     {
12          public bool Insert(People p)
13          {
14              return SQLServerDALHelper.ExecuteNonQuery(
15                  "insert into Users(Name,Pass) values('"
16                 + p.Name
17                 + "','"
18                 + p.Password
19                 + "')");
20          }
21          public bool Delete(People p) {
22              return SQLServerDALHelper.ExecuteNonQuery(
23                  "delete from Users"
24                 + " where Name = '"
25                 + p.Name
26                 + "'"
27                  );
28          }
29 
30          public bool Select(People p) {
31              return SQLServerDALHelper.ExecuteScalar(
32                  "select Pass from Users where Name = '"
33                  + p.Name
34                  + "'").ToString() == p.Password;                
35          }
36          /// <summary>
37          /// 返回数据集
38          /// </summary>
39          /// <returns></returns>
40          public List<People> SelectAll()
41          {
42              return ConvertReaderToTicketList(SQLServerDALHelper.GetDataReader(
43                     "select * from Users"
44                  )
45              );
46          }
47 
48          public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
49          {
50              List<People> ts = new List<People>();
51 
52              if (dr.HasRows)
53              {
54                  while (dr.Read())
55                  {
56                      ts.Add(new People(dr[0].ToString(), dr[1].ToString()));
57                  }
58              }
59 
60              return ts;
61          }
62     }
63 }

View Code

俺们的数额访问层这就早已写完了,这里究竟也都只是套路而已,精晓了套路,所有的事物等于都控制了。

接下去咱们先写实体类,实体类映射的是数码库表,所以实体类里面的习性一定要对应数据库中的表。

必发365bifa0000 16必发365bifa0000 17

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Entery
 7 {
 8     public class People
 9     {
10         private string name;
11         private string password;
12 
13         public string Name
14         {
15             get { return name; }
16             set { name = value; }
17         }
18 
19         public string Password
20         {
21             get { return password; }
22             set { password = value; }
23         }
24 
25         public People()
26         { 
27         
28         }
29         public People( string name,string password)
30         {
31             this.name = name;
32             this.password = password;
33         }
34     }
35 }

View Code

此处我添加了一个构造函数,对于可能需要贯彻的效果来说,重载构造函数就多了一种实现形式,所以随便有用没用,先写上加以。

接下去就是事情逻辑层了,这一个层就需要引用DAL层和Entityc层了,

必发365bifa0000 18必发365bifa0000 19

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using DAL;
 6 using Entery;
 7 
 8 namespace BLL
 9 {
10     /// <summary>
11     /// 这是BLL 业务逻辑层,此层被表现层(UI)调用,同时它自己调用DAL
12     /// </summary>
13     public class PeopleBLL
14     {
15         PeopleDAL dal = new PeopleDAL();
16 
17         public bool Add(People p){
18             //添加一个用户
19             return dal.Insert(p);
20         }
21 
22         public bool Del(People p) {
23             //删除一个用户
24             return dal.Delete(p);
25         }
26 
27         public bool Sel(People p) {
28             //查询用户
29             return dal.Select(p);
30         }
31 
32         public List<People> ShowAll()
33         {
34             return dal.SelectAll();
35         }
36     }
37 }

View Code

大家在写完事情逻辑层之后将要考虑表现层的题材了,为了将增删改查都在一个页面上表现出来,WinForm这样设计

必发365bifa0000 20所需控件,lable textbox
button dataGridView。

明日就是考虑实现的时候了。首先写注册,

必发365bifa0000 21必发365bifa0000 22

 1      private void button2_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11 
12                 //调用bll的添加业务
13                 string message = bll.Add(p) ? "添加成功" : "添加失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20             }
21         }

View Code

率先注册一个admin
密码也为admin,用来测试登陆和删除,然后实现dataGridView展现所有数据。

必发365bifa0000 23必发365bifa0000 24

 1 这里先自定义一个shows()方法,然后在Form_Load里调用shows()方法 
 2 private void shows()
 3         {
 4             try
 5             {
 6                 dataGridView1.DataSource = bll.ShowAll();
 7             }
 8             catch {
 9                 MessageBox.Show("链接数据库出错");
10             }
11         }

View Code

当今登记一个用户然后看看呈现的意义。

必发365bifa0000 25必发365bifa0000 26缘何dataGridView会彰显这一个样子吧?为何添加的中文用户名会出现??那多少个标记呢?我们有没有遭遇过这种意况

第一先表明第一个问题,大家的Name展现的着实ID编号,这个就是我们的实体类缺失Id那么些特性,不过在查询的时候查询的缺少所有的属性,那样子就涌出了这些体现没有对齐的场所,怎么化解吧,五个格局,第一修改查询条件,只询问Name和Pass,第二大家添加实体ID,我们就用第二种艺术吧。

修改实体代码如下

 1 public string Id
 2         {
 3             get;
 4             set;
 5         }
 6 public People( string id,string name,string password)
 7         {
 8             this.id = id;
 9             this.name = name;
10             this.password = password;
11         }

只这样修改依然特此外,因为我们在询问艺术上还有错误,接着在修改一下DAL层

 1   public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
 2          {
 3              List<People> ts = new List<People>();
 4 
 5              if (dr.HasRows)
 6              {
 7                  while (dr.Read())
 8                  {
 9                      ts.Add(new People(dr[0].ToString(), dr[1].ToString(),dr[2].ToString()));
10                  }
11              }
12 
13              return ts;
14          }

那般第一个冒出的题材就解决了,下来我们的话第二个问题,这些题目是因为数量格式问题,我们string格式对应的是Varchar()不过大家用的是Nvarchar(),所以大家应当在插入数据那块添加一个N,修改代码如下:

1  public bool Insert(People p)
2          {
3              return SQLServerDALHelper.ExecuteNonQuery(
4                  "insert into Users(Name,Pass) values(N'"
5                 + p.Name
6                 + "',N'"
7                 + p.Password
8                 + "')");
9          }

现在安插数据格式问题也化解了。必发365bifa0000 27

紧接着我们开首要贯彻登陆问题了。代码如下:

必发365bifa0000 28必发365bifa0000 29

 1  private void button1_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11                 
12                 //调用bll的添加业务
13                 string message = bll.Sel(p) ? "登陆成功" : "登陆失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20                 //如果出错,可能是数据转换出错或者数据库里已经存在相同的票号
21                // MessageBox.Show("输入数据形式错误,或主键重复");
22             }
23         }

View Code

登陆代码实现之后就是去除数据的落实了,

必发365bifa0000 30必发365bifa0000 31

 1 private void button3_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10 
11                 //调用bll的添加业务
12                 string message = bll.Del(p) ? "删除成功" : "删除失败";
13 
14                 MessageBox.Show(message);
15             }
16             catch
17             {
18                 throw;
19             }
20         }

View Code

现今我们所急需的增删查问题都早就落实了,不过还有题目,什么问题吗,大家在运转程序的时候会发先dataGridView显示数据在实施增删之后都不举行刷新,所以在实践这多少个操做的时候事情实践了而是多少却不能刷新到dataGridView控件中,我们理应用什么办法化解呢?我们不是写了一个shows()方法用来彰显数据吧,大家只要在急需多少刷新的地方调用这个主意就行了,实现很简短,我就不具体改了,我们下来自己要落实的改一下就好了。前几天的内容早已写完了,希望我们帮助,文中有荒唐希望我们可以指出来,让自家读书改进。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图