1、C#三层架构
C#三层架构急表示层(UI,User Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data Access Layer)。三层的划分是物理上的划分。表示层(UI),这个最容易理解,就是用户看到的主界面。数据访问层(DAL),也不难理解,主要是负责数据的增删改查。业务逻辑层(BLL),算是表示层和数据访问层的桥梁吧。区分层次的目的即为了“高内聚,低耦合”的思想。
2.数据库基本操作
2.1 创建数据库
CREATE DATABASE database_name ON PRIMARY (
NAME= ,
FILENAME= ‘ ’
SIZE=,
MAXSIZE=,
FILEGROWTH= )
2.2 创建数据表
create table table_name (
学号 int primary key identity ,
名称 char() not null,
专业方向 varchar() not null,
系部代码 char() not null,
备注 varchar() )
2.3 数据添加
INSERT [into] table_name (column_list) VALUES(data_values)
2.4 数据修改(更新)
UPDATE table_name SET column_name=值 where[search_conditions]
2.5 删除数据
DELETE table_name WHERE [search_conditions]
2.6查找数据表
、输出表中的所有列 SELECT*FROM table_name
、输出表中部分列 SELECT A,B,C FROM table_name
、选择表中的若干记录 SELECT DISTINCT 列名 FROM table_name
、限制返回行数 SELECT TOP n FROM table_name
. 完整的select 语句的基本语法格式 虽然select 语句的完整语法较复杂,但是其主要的语法格式可归纳如下:
SELECT select_list [into new_table_name] FROM table_list
[WHERE search_conditions]
[GROUP BY group_by_expression] [HAVING search_condition]
[ORDER BY order_expression [asc|desc] ]
2.7 修改表结构
修改表结构 重命名表: exec sp_rename 'old_table_name','new_table_name‘
重命名列: exec sp_rename 'table_name.old_name','new_name','column‘
添加新列: alter table [table_name] add [new_column] varchar()
更改列的数据类型: alter table [table_name] alter column [column_name] [data_type]
删除列: alter table [table_name] drop column [column_name]
删除表: drop table table_name
删除表的所有数据: Truncate table [table_name]
创建主键约束: alter table [table_name]
add constraint pk
primary key clustered (列名)
创建外建约束 alter table [table_name]
add constraint wz
foreign key (列名)
references 表名(列名
3.数据库中的三范式
1、第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
2、第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
3、第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
4. C#中的委托
4.1 委托的申明
public delegate void MyDelegate(string str); //str参数为方法名,
4.2 委托的使用
MyDelegate d1 = new MyDelegate(C.M1); //如果M1非静态则需要使用 MyDelegate d1 = new MyDelegate(new C().M1);
d1("参数1"); // 参数1表示C.M1的函数使用的参数
public static void M1(string str) //静态属于类而不属于对象,
{
Console.WriteLine("From:C.M1: ", str);
}
注意:委托申明时(void 和 string类型,委托的申明与需要委托的函数有关)
4.3 委托的特性
MyDelegate d5 = d1 + d2; //组合特性
MyDelegate d6 = d5 - d3; //删除特性
5. 事件
5.1 定义事件类
public class TestEventArgs : EventArgs //集成事件EventArgs
{
public readonly char KeyToRaiseEvent;
public TestEventArgs(char keyToRaiseEvent)
{
KeyToRaiseEvent = keyToRaiseEvent;
}
}
5.2 声明事件委托和事件对象
public delegate void TestEventHandler(object sender, TestEventArgs e); //定义delegate
public event TestEventHandler TestEvent; //用event 关键字声明事件对象
5.3 事件触发方法
protected void OnTestEvent(TestEventArgs e) //为什么是虚函数
{
if (TestEvent != null)
TestEven t(this, e);
}
5.4 事件引用方法
public void RaiseEvent(char keyToRaiseEvent)
{
TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
OnTestEvent(e);
}
5.5 监听事件类
public class TestEventListener
{
//定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
{
Console.WriteLine("发送者:{0},所按得健为:{1}", sender, e.KeyToRaiseEvent);
}
//订阅事件
public void Subscribe(TestEventSource evenSource)
{
evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
}
//取消订阅事件
public void UnSubscribe(TestEventSource evenSource)
{
evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
}
}
5.6 测试事件类
public class Test
{
public static void Main()
{
//创建事件源对象
TestEventSource es = new TestEventSource();
//创建监听对象
TestEventListener el = new TestEventListener();
//订阅事件
Console.WriteLine("订阅事件\n");
el.Subscribe(es);
//引发事件
Console.WriteLine("输入一个字符,再按enter键");
string s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[]);
//取消订阅事件
Console.WriteLine("\n取消订阅事件\n");
el.UnSubscribe(es); //引发事件
Console.WriteLine("输入一个字符,再按enter健");
s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[]);
}
}