一、C#三層架構數據庫
C#三層架構急表示層(UI,User Interface),業務邏輯層(BLL BusinessLogicLayer),數據訪問層(DAL Data Access Layer)。三層的劃分是物理上的劃分。表示層(UI),這個最容易理解,就是用戶看到的主界面。數據訪問層(DAL),也不難理解,主要是負責數據的增刪改查。業務邏輯層(BLL),算是表示層和數據訪問層的橋樑吧。區分層次的目的即爲了「高內聚,低耦合」的思想。express
2.數據庫基本操做架構
2.1 建立數據庫ide
CREATE DATABASE database_name ON PRIMARY ( NAME= , FILENAME= ‘ ’ SIZE=, MAXSIZE=, FILEGROWTH= )
2.2 建立數據表函數
create table table_name (
學號 int primary key identity ,
名稱 char(6) not null,
專業方向 varchar(10) not null,
系部代碼 char(2) not null,
備註 varchar(50) )
2.3 數據添加測試
INSERT [into] table_name (column_list) VALUES(data_values)
2.4 數據修改(更新)this
UPDATE table_name SET column_name=值 where[search_conditions]
2.5 刪除數據spa
DELETE table_name WHERE [search_conditions]
2.6查找數據表code
1、輸出表中的全部列 SELECT*FROM table_name 2、輸出表中部分列 SELECT A,B,C FROM table_name
3、選擇表中的若干記錄 SELECT DISTINCT 列名 FROM table_name 4、限制返回行數 SELECT TOP n FROM table_name 5. 完整的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(33) 更改列的數據類型: 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.數據庫中的三範式
一、第一範式(1NF)
在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。所謂第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。若是出現重複的屬性,就可能須要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。在第一範式(1NF)中表的每一行只包含一個實例的信息。例如,對於圖3-2 中的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表中只出現一次。簡而言之,第一範式就是無重複的列。
二、第二範式(2NF)
第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或行必須能夠被惟一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的惟一標識。如圖3-2 員工信息表中加上了員工編號(emp_id)列,由於每一個員工的員工編號是惟一的,所以每一個員工能夠被惟一區分。這個惟一屬性列被稱爲主關鍵字或主鍵、主碼。
第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。
三、第三範式(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()[0]); //取消訂閱事件 Console.WriteLine("\n取消訂閱事件\n"); el.UnSubscribe(es); //引起事件 Console.WriteLine("輸入一個字符,再按enter健"); s = Console.ReadLine(); es.RaiseEvent(s.ToCharArray()[0]); } }