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         }

15.new的作用,where的作用

  1. new 运算符:用于创建对象和调用构造函数。
  2. new 修饰符:用于向基类成员隐藏继承成员。
  3. new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

参考文章:

  1. new(C#
    参考)
  2. C# where用法

    16.this的作用

    this
    关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符。

用途:

  1. 限定被相似的名称隐藏的成员,例如

public Employee(string name, string alias)
            {
                // Use this to qualify the fields, name and alias:
                this.name = name;
                this.alias = alias;
            }
  1. 将对象作为参数传递到其他方法,例如

CalcTax(this); 
  1. 声明索引器,例如:

 public int this[int param]
            {
                get { return array[param]; }
                set { array[param] = value; }
            }

参考文章:
this(C#
参考)

ca88手机版 1ca88手机版 2为什么dataGridView会显示这个样子呢?为什么添加的中文用户名会出现??这个符号呢?大家有没有遇到过这种情况

②.区别之处

  • 在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是已实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
  • 首先,MVC和三层架构,是不一样的。
    三层架构中,DAL(数据访问层)、BLL(业务逻辑层)、WEB层各司其职,意在职责分离。
      MVC是
    Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。所以,
    .net的三层结构中,并没有action这个概念。
  • MVC模式是一种复合设计模式,一种解决方案;三层是种软件架构,通过接口实现编程
  • 三层模式是体系结构模式,MVC是设计模式
  • 三层模式又可归于部署模式,MVC可归于表示模式

参考文章:

  1. 7 天玩儿 转 ASP.NET MVC
  2. WebForms VS.
    MVC(翻译)
  3. mvc与三层结构终极区别
 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         }

1.Entity Framework简述

微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。

EF有三种使用场景,

  1. 从数据库生成Class
  2. 由实体类生成数据库表结构,
  3. 通过数据库可视化设计器设计数据库,同时生成实体类。
 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         }

17.MVC的各个部分用什么技术实现,和三层架构的关系

这个要详细讲的话得要一本书吧,我就说大概。ASP.NET
MVC包含了三部分,Model,View和Controller。Controller负责后台逻辑代码,View是纯净的HTML页面,Model是中间数据层。

ca88手机版 3ca88手机版 4

13.asp.net中 static的存活周期

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
当类首次被加载时static定义的变量被分配空间,程序结束后由系统释放.
如果在一个程序里过多的使用static定义的成员,确实很占内存,因为他的生命周期是整个程序,程序运行时无法被gc所回收,直到程序结束,释放内存.

参考文章:

1.静态类和静态类成员(C#
编程指南)

我们的数据访问层这就已经写完了,这里说到底也都只是套路而已,掌握了套路,所有的东西等于都掌握了。

14.try{}里有一个return语句,那么紧跟 在这个try后的finally{}里的代码会不会被执行,是在return前还是后

这题我tm面试的几间都有啊,公司得有多懒

答案:会执行,在return后执行

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

①.各自原理

前提当然是要搞懂这两者的联系了

三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式。
首先你要明白MVC分别代表的是什么意思.

  1. M 即Model(模型层),主要负责出来业务逻辑以及数据库的交互
  2. V 即View(视图层),主要用于显示数据和提交数据
  3. C 即Controller(控制器),主要是用作捕获请求并控制请求转发

三层:UI 界面层 BLL 业务逻辑层,DAL数据访问层,Model 实体层
MVC中的的M 不是三层中的Model(实体层),他其实包括三层中的
BLL,DAL,Model,这是非常要注意的,这也是他们之间的区别的关键所在

三层是基于业务逻辑来分的,而mvc是基于页面来分的

MVC是
Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话

View Code

简述

有三种方式:Code First、DBFirst、Model First

  1. CodeFirst 领域设计时先定义实体类,用实体类生成数据库
  2. DbFirst 从数据库生成实体类
  3. Model First 使用Visual
    Studio实体设计器,设计ER,同时生成Entity类和DB

帮助类写完之后就开始写数据库操做业务了,在这里说一下,帮助类微软专门有自己封装的类,可以直接下载使用。数据访问代码如下:这里有简易的增删查方法

11.interface是否可继承interface?abstract class 是否可实现interface

回答1:接口可以继承接口,而且可以继承多个接口,用“,”进行分割,接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构

回答2:抽象类是可以实现接口的,抽象类里可以有抽象方法,也可以有具体的实现方法,也就是说继承了接口后也是可以实现接口里定义的方法
参考文章:

  1. C#之接口
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 )

20.entityframework的开发模式

 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 }

EntityFramework 架构

ca88手机版 5

  • EDM (实体数据模型):EDM包括三个模型,概念模型、 映射和存储模型。
  • 概念模型 ︰
    概念模型包含模型类和它们之间的关系。独立于数据库表的设计。
  • 存储模型 ︰ 存储模型是数据库设计模型,包括表、 视图、
    存储的过程和他们的关系和键。
  • 映射 ︰ 映射包含有关如何将概念模型映射到存储模型的信息。
  • LINQ to Entities ︰ LINQ to Entities
    是一种用于编写针对对象模型的查询的查询语言。它返回在概念模型中定义的实体。
  • Entity SQL: Entity SQL
    是另一种炉类似于L2E的言语,但相给L2E要复杂的多,所以开发人员不得不单独学习它。
  • Object
    Services(对象服务):是数据库的访问入口,负责数据具体化,从客户端实体数据到数据库记录以及从数据库记录和实体数据的转换。
  • Entity Client Data Provider:主要职责是将L2E或Entity
    Sql转换成数据库可以识别的Sql查询语句,它使用Ado.net通信向数据库发送数据可获取数据。
  • ADO.Net Data Provider:使用标准的Ado.net与数据库通信

ca88手机版 6ca88手机版 7

1.概述

  • 当我们讨论系统时,它一般包含用户输入逻辑、业务处理逻辑以及UI显示逻辑等,MVC是一种架构模式,它能够让我们开发出各个模块之间松耦合的应用程序。MVC最主要的目的是“关注点分离”,它能够分离开UI显示、业务逻辑以及用户输入等。根据MVC的规定,一个系统应该被划分为Model、View以及Controller三个部分
  1. Model:它被当做一个可以处理业务规则、逻辑以及数据的智能体,同时它独立于MVC中其它两个部分(C和V)(不访问Controller和View,译者注)
  2. Controller:它负责接收用户请求、分配请求给处理者,它可以访问Model和View。
  3. View:它被当做一个哑巴,专门呈现最终的数据给用户。它可以是一个excel表单,也可以是一个包含许多记录的web页面甚至是一个纯文本。它可以访问Model。

现在我们先来开始写数据访问层,在数据访问层里,我们首先建立一个帮助类SQLServerDALHelper,实现数据连接,代码如下:

查询方式

  1. LINQ to Entities:

//Querying with LINQ to Entities 

using (var context = newSchoolDBEntities())

{

var L2EQuery = context.Students.where(s => s.StudentName == "Bill");



var student = L2EQuery.FirstOrDefault<Student>();



}

LINQ Query syntax:

using (var context = new SchoolDBEntities())

{

var L2EQuery = from st in context.Students

where st.StudentName == "Bill"select st;



var student = L2EQuery.FirstOrDefault<Student>();

}
  1. Entity SQL

//Querying with Object Services and Entity SQL

string sqlString = "SELECT VALUE st FROM SchoolDBEntities.Students " +

"AS st WHERE st.StudentName == 'Bill'";



var objctx = (ctx as IObjectContextAdapter).ObjectContext;



ObjectQuery<Student> student = objctx.CreateQuery<Student>(sqlString);

Student newStudent = student.First<Student>();

//使用EntityDataReader

using (var con = newEntityConnection("name=SchoolDBEntities"))

{

con.Open();

EntityCommand cmd = con.CreateCommand();

cmd.CommandText = "SELECT VALUE st FROM SchoolDBEntities.Students as st where st.StudentName='Bill'";

Dictionary<int, string> dict = newDictionary<int, string>();

using (EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection))

{

while (rdr.Read())

{

int a = rdr.GetInt32(0);

var b = rdr.GetString(1);

dict.Add(a, b);

}

}

}
  1. Native SQL

using (var ctx = newSchoolDBEntities())

{

var studentName = ctx.Students.SqlQuery("Select studentid, studentname, standardId from Student where studentname='Bill'").FirstOrDefault<Student>();

}
 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 }

引言

今天继续的是去那几家面试公司的一些面试题目,适合刚出来或者两三年经验的,大牛可以适量吐槽下,找工作的可以补补基础。

这系列文章请查看这里:

  1. 最近找工作面的面试题目汇总(一)
  2. 最近找工作面的面试题目汇总(二)

ca88手机版 8ca88手机版 9

2.MVC与三层架构的区别

ca88手机版 10ca88手机版 11

18.MVC框架中可以实现AOP效果的接口是?

关于AOP,它面向的是一个切面,能够把公共的功能抽出来,独立开发,然后将公共部分实现,在开发人员不知情的情况下,添加进去。而在MVC前台框架中,MVC中Controller中的Filter可以将公共的代码抽离出来。

View Code

19.Entity Framework是什么

修改实体代码如下

ORM 是什么?

ORM
是将数据存储从域对象自动映射到关系型数据库的工具。ORM主要包括3个部分:域对象、关系数据库对象、映射关系。ORM使类提供自动化CRUD,使开发人员从数据库API和SQL中解放出来。

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

12.private、protected、public、internal

修饰访问符这个算是挺基础的了,不过也不能忘记哦

  1. public:同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
  2. private:只有同一类或结构中的代码可以访问该类型或成员。
  3. protected:只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。
  4. internal:同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
  5. protected
    internal
    :由其声明的程序集或另一个程序集派生的类中任何代码都可访问的类型或成员。
    从另一个程序集进行访问必须在类声明中发生,该类声明派生自其中声明受保护的内部元素的类,并且必须通过派生的类类型的实例发生。

参考文章:
1.访问修饰符(C#
编程指南)

View Code

实现AOP效果的接口(只列举常用)

Asp.Net MVC提供了以下几种默认的Filter:

Filter Type 实现接口 执行时间 Default Implementation
Authorization filter IAuthorizationFilter 在所有Filter和Action执行之前执行 AuthorizeAttribute
Action filter IActionFilter 分别在Action执行之前和之后执行。 ActionFilterAttribute
Result filter IResultFilter 分别在Action Result执行之后和之前 ResultFilterAttribute
Exception filter IExceptionFilter 只有在filter,或者 action method, 或者 action result 抛出一个异常时候执行 HandleErrorAttribute

参考文章:

  1. MVC过滤器
    实现AOP(入门)
  2. ASP.NET MVC3 类面向切面AOP
    的Filter操作

 

DBContext

DbContext是EntityFramework很重要的部分,连接域模型与数据库的桥梁,是与数据库通信的主要类。
ca88手机版 12

DbContext主要负责以下活动:

  • EntitySet::DbContext包含了所有映射到表的entities
  • Querying:将Linq-To-Entities转译为Sql并发送到数据库
  • Change Tracking:从数据库获取entities后保留并跟踪实体数据变化
  • Persisting Data:根据entity状态执行Insert、update、delete命令
  • Caching:DbContext的默认第一级缓存,在上下文中的生命周期中存储entity
  • Manage
    Relationship:DbContext在DbFirst模式中使用CSDL、MSL、SSDL管理对象关系,Code
    first中使用fluent api 管理关系
  • Object Materialization:DbContext将物理表转成entity实例对象

参考文章:

  1. Entity Framework
    基础

接着我们开始要实现登陆问题了。代码如下:

View Code

今天我们来说说三层,首先我们来看一下百度百科对于三层架构的解释:三层架构(3-tier
architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User
Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data
access
layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

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          }

现在我们所需要的增删查问题都已经实现了,但是还有问题,什么问题呢,我们在运行程序的时候会发先dataGridView显示数据在执行增删之后都不进行刷新,所以在执行这两个操做的时候业务执行了可是数据却无法刷新到dataGridView控件中,我们应该用什么办法解决呢?我们不是写了一个shows()方法用来显示数据吗,我们只要在需要数据刷新的地方调用这个方法就行了,实现很简单,我就不具体改了,大家下来自己要实现的改一下就好了。今天的内容已经写完了,希望大家支持,文中有错误希望大家能够指出来,让我学习改正。

接下来就是业务逻辑层了,这个层就需要引用DAL层和Entityc层了,

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

现在注册一个用户然后看看显示的效果。

ca88手机版 13ca88手机版 14

 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          }

 

 

ca88手机版 15所需控件,lable textbox
button dataGridView。

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

 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

现在插入数据格式问题也解决了。ca88手机版 16

 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

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

ca88手机版 17ca88手机版 18

 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

 

View Code

下面我们就来用三层结构实现用户登录:

ca88手机版 19

这里我添加了一个构造函数,对于可能需要实现的功能来说,重载构造函数就多了一种实现方法,所以不管有用没用,先写上再说。

ca88手机版 20ca88手机版 21

我们使用三层架构就是为了让整个程序能够更加易于维护,业务逻辑和表现方式还有数据库操做都能够分开来写,这样开发人员也能够更好的分工。而且易于扩展,如果要是业务需求增加活着要删除某个需求,也容易修改。

只这样修改还是不行的,因为我们在查询方法上还有错误,接着在修改一下DAL层

ca88手机版 22ca88手机版 23

 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         }

第一步我们创建一个解决方案,里面添加三个类库,如下图所示:

这样第一个出现的问题就解决了,下来我们来说第二个问题,这个问题是因为数据格式问题,我们string格式对应的是Varchar()但是我们用的是Nvarchar(),所以我们应该在插入数据这块添加一个N,修改代码如下:

我们在写完业务逻辑层之后就要考虑表现层的问题了,为了将增删改查都在一个页面上表现出来,WinForm这样设计

这三个类库分别代表的是业务逻辑层BLL,数据访问层DAL,还有实体Entity,下一步就是添加你需要的表现层,我为了表示清楚直接使用了UI命名。ca88手机版 24

首先先解释第一个问题,我们的Name显示的确实ID编号,这个就是我们的实体类缺失Id这个属性,但是在查询的时候查询的缺失所有的属性,这样子就出现了这个显示没有对齐的现象,怎么解决呢,两个方法,第一修改查询条件,只查询Name和Pass,第二我们添加实体ID,我们就用第二种方法吧。

相关文章