.net 面試寶典超多常見面試題

.NET面試寶典javascript

目錄css

1、 1階段:HTML&c#基礎4html

1. 簡述 private protected public internal 修飾符的訪問權限。 4前端

2. ADO.NET中的五個主要對象 4java

3. 列舉ASP.NET 頁面之間傳遞值的幾種方式。 5jquery

4. 面向對象的三個特性? 5程序員

5. C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。 5web

6. override與重載的區別 6面試

7. 屬性和public字段的區別是什麼?調用set方法爲一個屬性設值,而後用get方法讀取出來的值必定是set進去的值嗎? 6ajax

8. 三層架構 6

9. 什麼是裝箱(boxing)和拆箱(unboxing) 7

10. CTSCLSCLR分別做何解釋? 7

11. .NET中類(class)與結構(struct)的異同? 7

12. 堆和棧的區別? 7

13. 能用foreach遍歷訪問的對象的要求? 7

14. GC是什麼? 爲何要有GC? 8

15. 值類型和引用類型的區別? 8

16. C#中的接口和類有什麼異同? 8

17. abstract classinterface有什麼區別? 9

18. 是否能夠繼承String類? 9

19. using關鍵字有什麼用?什麼是IDisposable 9

20. string str = null  string str = 「」說明其中的區別? 9

21. 什麼是code-Behind技術? 10

22. StringBuilder  String 的區別? 10

23. 不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎? 10

24. 是否能夠從一個static方法內部發出對非static方法的調用? 10

25. 說出一些經常使用的類、接口,請各舉5個? 11

26. 編寫一個單例(Singleton)類? 11

27. .NetASP.NetC#VisualStudio之間的關係是什麼? 11

28. 如下兩種異常處理方式有什麼區別?try {} catch(){throw;}  try{}catch(Exception ex){Throw ex;} 12

29. 用接口或父類做爲輸入的參數有什麼好處?返回值若是是接口是爲了什麼? 12

30. C#JS的閉包? 12

31. Sleep()wait()有什麼區別? 12

32. c#usingnew這兩個關鍵字有什麼意義,請寫出你所知道的意義? 13

33. string str=nullstring str="" 有什麼區別? 13

34. 不用中間變量交換兩個變量? 13

35. 一個數組:1,1,2,3,5,8,13,21...+m,求第30位數是多少? 14

36. 冒泡排序 15

37. 求如下表達式的值,寫出您想到的一種或幾種實現方法:1-2+3-4+……+m 16

2、 2階段:WEB前端基礎16

38. JavaScript中的「======」區別? 16

39. JavaScript中的「undefinednull」區別? 17

40. 簡述javascript的做用域和閉包? 17

41. web標準以及w3c的理解和認識? 17

42. Htmlxhtml有什麼區別? 17

43. 嚴格模式和混雜模式的區分,以及如何觸發這2種模式? 17

44. 行內元素有哪些?塊級元素有哪些?CSS盒模型? 18

45. css引入的方式有哪些?link@import的區別? 18

46. CSS選擇符有哪些?優先級算法如何計算?內聯和Important哪一個優先級高? 18

47. 前端頁面有哪三層構成,分別是什麼,做用是什麼? 18

48. 頁面的哪些瀏覽器你測試過,分別內核是什麼? 19

49. img標籤上的titlealt屬性區別是什麼? 19

50. 你如何對網站的文件和資源進行優化? 19

51. 什麼是語義化的HTML 19

52. 清除浮動的幾種方式,各自的優缺點? 19

53. javascripttypeof返回哪些數據類型? 20

54. 例舉3種強制類型轉換和2種隱式類型轉換? 20

55. split() join() 的區別? 20

56. 數組方法pop() push() unshift() shift() 20

57. 閉包是什麼,有什麼特性,對頁面有什麼影響? 20

58. 解釋jsonp的原理,以及爲何不是真正的ajax 20

59. javascript的本地對象,內置對象和宿主對象? 21

60. document load document ready的區別? 21

61. javascript的同源策略? 21

62. 編寫一個數組去重的方法 21

63. jQuery中有哪幾種類型的選擇器? 22

64. 請使用jQuery將頁面上的全部元素邊框設置爲2px寬的虛線? 22

65. CDN上的jQuery文件不可用時,該怎麼辦? 22

66. 怎樣用jQuery編碼和解碼URL 23

67. 如何用jQuery禁用瀏覽器的前進後退按鈕? 23

68. 你爲何要使用jquery 23

69. jquery對象和dom對象是怎樣轉換的? 23

70. 你是如何使用jquery中的ajax的? 24

71. 你以爲jquery中的ajax好用嗎,爲何? 24

72. jquery$.get()提交和$.post()提交有區別嗎? 24

73. jquery中你是如何去操做樣式的? 24

74. 你使用過jquery中的動畫嗎,是怎樣用的? 24

75. jQuery是如何處理緩存的? 25

76. $.getScript()方法  $.getJson() 方法有什麼區別? 25

77. 你使用過哪些數據格式,它們各有什麼特色? 25

78. jQuery 能作什麼? 25

79. ajaxdata主要有幾種方式? 26

80. 你知道jQuery中的事件冒泡嗎,它是怎麼執行的,如何來中止冒泡事件? 26

3、 3階段:ASP.NET基礎26

81. 請解釋ASPNET中的web頁面與其隱藏類之間的關係? 26

82. 在什麼狀況下會用到虛方法?它與接口有什麼不一樣? 26

83. DataReaderDataSet的異同? 26

84. Server.TransferResponse.Redirect的區別是什麼? 27

85. 什麼是sql注入?如何避免sql注入? 27

86. 數據庫三範式是什麼? 27

87. postget的區別? 27

88. Session,ViewState,Application,cookie的區別? 28

89. 寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增加的ID做爲主鍵,注意:ID可能不是連續的。 28

90. 橫表、縱錶轉換 28

91. 刪除姓名、年齡重複的記錄 30

92. 31

93. 活期存款中,「儲戶」經過「存取款單」和「儲蓄所」發生聯繫。假定儲戶包括:帳號,姓名,電話,地址,存款額;「儲蓄所」包括:儲蓄所編號,名稱,電話,地址(假定一個儲戶能夠在不一樣得儲蓄所存取款) 33

94. 本題用到下面三個關係表: 34

95. 40

4、 4階段:ASP.NET高級53

96. Application Cookie Session 三種會話有什麼不一樣? 53

97. Session有什麼重大BUG,微軟提出了什麼方法加以解決? 53

98. Asp.net中的錯誤機制? 53

99. 介紹幾個使用過的開源的項目? 54

100. 如何提升頁面的顯示速度?假如一個頁面的加載時間是10.89s,你會用什麼樣的方式進行優化? 54

101. 在程序編碼的時候,你會對SQL注入漏洞的防範採起什麼樣的措施? 54

102. 你會採用什麼樣的策略和方法來實現系統緩存? 54

103. 網站想要實現文件防盜鏈的功能,說說你的解決方案? 55

104. 進程和線程的區別? 55

105. Ajax操做怎麼處理session過時? 55

106. 簡要談一下你對微軟.Net架構下remotingwebservice兩項技術的理解及實際中的應用? 55

107. 序列化有何做用? 55

108. .Net中會存在內存泄漏嗎?請簡單描述。 56

109. 請編程遍歷WinForm頁面上全部TextBox控件並給它賦值爲string.Empty 56

110. 觸發器的做用? 56

111. 索引的做用?和它的優勢缺點是什麼? 57

112. 說一下SQLServer中索引的兩種類型? 57

113. 什麼是事務?什麼是鎖? 57

114. 什麼叫視圖?遊標是什麼? 58

115. 什麼是SQL注入式攻擊? 58

116. 如何防範SQL注入式攻擊? 59

117. 事務是什麼? 60

118. Ajax原理? 61

5、 5階段:ASP.NET企業級技術61

119. 談談你對MVC和三層架構的理解? 61

120. MVC中如何保持Sessions 62

121. MVC中如何作輸入驗證? 62

122. 已經有了ASPX,爲何還要Razor?哪一個更好? 62

123. MVC有多少種不一樣類型的結果類型,請詳細描述? 62

124. 列舉你用過的javascript框架,並簡述它們的優缺點? 63

125. 什麼是反射? 63

126. XML  HTML 的主要區別? 63

127. MVC(模型、視圖、控制器)架構的控制流程 64

128. MVC同時適用於Windows應用和Web應用嗎? 64

129. 使用MVC有哪些好處? 64

130. 「HTML.TextBox」  「HTML.TextBoxFor」有什麼不一樣? 64

131. MVC的路由選擇是什麼? 64

132. 在哪裏寫路由映射表? 64

133. 咱們能夠映射多個URL到同一個動做嗎? 64

134. 使用hyperlink生成連接,如何從一個視圖連接到另外一個視圖? 64

135. 如何限制一個動做的類型爲GETPOST? 65

136. MVC中如何保持Sessions? 65

137. tempdata, viewdata,  viewbag之間有什麼不一樣? 65

138. MVC的局部視圖是什麼? 65

139. ASP.NET MVC是如何運行的? 65

140. 什麼是ASP.NET MVC 65

 

 

.NET面試寶典

1、 1階段:HTML&c#基礎

  1. 簡述 private、 protected、 public、 internal 修飾符的訪問權限。

private : 私有成員, 在類的內部才能夠訪問。

protected : 保護成員,該類內部和繼承類中能夠訪問。

public : 公共成員,徹底公開,沒有訪問限制。

internal: 當前程序集內能夠訪問。

 

  1. ADO.NET中的五個主要對象

Connection:主要是開啓程序和數據庫之間的鏈接。沒有利用鏈接對象將數據庫打開,是沒法從數據庫中取得數據的。CloseDispose的區別,Close之後還能夠OpenDispose之後則不能再用。

Command:主要能夠用來對數據庫發出一些指令,例如能夠對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過鏈接到數據源。

DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工做,它能夠透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。

DataSet:這個對象能夠視爲一個暫存區(Cache),能夠把從數據庫中所查詢到的數據保留起來,甚至能夠將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不僅是能夠儲存多個Table 而已,還能夠透過DataAdapter對象取得一些例如主鍵等的數據表結構,並能夠記錄數據表間的關聯。DataSet 對象能夠說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,自己不具有和數據源溝通的能力;也就是說咱們是將DataAdapter對象當作DataSet 對象以及數據源間傳輸數據的橋樑。DataSet包含若干DataTableDataTableTable包含若干DataRow

DataReader:當咱們只須要循序的讀取數據而不須要其它操做時,能夠使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(經過遊標)讀取當前行的數據,並且這些數據是隻讀的,並不容許做其它的操做。由於DataReader 在讀取數據的時候限制了每次只讀取一筆,並且只能只讀,因此使用起來不但節省資源並且效率很好。使用DataReader 對象除了效率較好以外,由於不用把數據所有傳回,故能夠下降網絡的負載。

ADO.NET 使用Connection 對象來鏈接數據庫,使用Command DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader DataAdapter ,而後再使用取得的DataReader DataAdapter 對象操做數據結果。

 

  1. 列舉ASP.NET 頁面之間傳遞值的幾種方式。

1.使用QueryString, ....?id=1; response. Redirect()....

2.使用Session變量

3.使用Server.Transfer

4.Cookie傳值

 

  1. 面向對象的三個特性?

繼承性:就是讓一個類型的對象擁有另外一個類型的對象的屬性的方法。繼承後,子類擁有父類的屬性和方法。

封裝性:就是將數據和代碼捆綁在一塊兒,防止外界干擾。

多態性:就是一個事物擁有不一樣形式的能力。

 

  1. C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。

委託能夠把一個方法做爲參數代入另外一個方法。

委託能夠理解爲指向一個函數的指針。

委託和事件沒有可比性,由於委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。由於對於事件來說,外部只能註冊本身+=、註銷本身-=」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,所以若是用Delegate就無法進行上面的控制,所以誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能addremove本身,不能賦值。事件只能+=-=,不能= 。加分的補充回答:事件內部就是一個private的委託和addremove兩個方法

 

  1. override與重載的區別

重載是方法的名稱相同參數或參數類型不一樣,進行多次重載以適應不一樣的須要。

Override是進行基類中函數的重寫爲了適應須要。

 

  1. 屬性和public字段的區別是什麼?調用set方法爲一個屬性設值,而後用get方法讀取出來的值必定是set進去的值嗎?

屬性能夠對設值、取值的過程進行非法值控制,好比年齡禁止設值負數,而字段則不能進行這樣的設置。雖然通常狀況下get讀取的值就是set設置的值,可是可讓get讀取的值不是set設置的值的,極端的例子:Public Age{get{return 100;}set{}}

 

  1. 三層架構

一般意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL

區分層次的目的即爲了「高內聚,低耦合」的思想。

表現層(UI):通俗講就是展示給用戶的界面,即用戶在使用一個系統的時候的所見所得。

業務邏輯層(BLL):針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。

數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。

三層結構是N層結構的一種,通常來講,層次之間是向下依賴的,下層代碼未肯定其接口(契約)前,上層代碼是沒法開發的,下層代碼接口(契約)的變化將使上層的代碼一塊兒變化。

優勢: 分工明確,條理清晰,易於調試,並且具備可擴展性。

缺點: 增長成本。

 

  1. 什麼是裝箱(boxing)和拆箱(unboxing)?

裝箱:從值類型接口轉換到引用類型。

拆箱:從引用類型轉換到值類型。

object obj = null;//引用類型

obj = 1;//裝箱,boxing。把值類型包裝爲引用類型。

int i1 = (int)obj;//拆箱。Unboxing

 

  1. CTS、CLS、CLR分別做何解釋

CTSCommon Type System 通用類型系統。Int32Int16→intString→stringBoolean→bool。每種語言都定義了本身的類型,.Net經過CTS提供了公共的類型,而後翻譯生成對應的.Net類型。

CLSCommon Language Specification 通用語言規範。不一樣語言語法的不一樣。每種語言都有本身的語法,.Net經過CLS提供了公共的語法,而後不一樣語言翻譯生成對應的.Net語法。

CLRCommon Language Runtime 公共語言運行時,就是GCJIT等這些。有不一樣的CLR,好比服務器CLRLinux CLRMono)、Silverlight CLR(CoreCLR)。至關於一個發動機,負責執行IL

 

  1. .NET中類(class)與結構(struct)的異同

Class能夠被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。

Struct屬於值類型,是分配在內存的棧上的。結構體是複製傳遞的。

 

  1. 堆和棧的區別?

棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。

堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

 

  1. 能用foreach遍歷訪問的對象的要求

須要實現IEnumerable接口或聲明GetEnumerator方法的類型。

 

  1. GC是什麼? 爲何要有GC?

C/C++中由程序員進行對象的回收像學校食堂中由學生收盤子,.Net中由GC進行垃圾回收像餐館中店員去回收。

GC垃圾收集器Garbage Collection)。程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。GC只能處理託管內存資源的釋放,對於非託管資源則不能使用GC進行回收,必須由程序員手工回收,一個例子就是FileStream或者SqlConnection須要程序員調用Dispose進行資源的回收。

要請求垃圾收集,能夠調用下面的方法:GC.Collect()通常不須要手動調用GC.Collect()。當一個對象沒有任何變量指向(再也不能使用)的時候就能夠被回收了。

 

基礎知識:當沒有任何變量指向一個對象的時候對象就能夠被回收掉了,但不必定會當即被回收。

 

  1. 值類型和引用類型的區別?

1.將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。引用類型變量的賦值只複製對對象的引用,而不復制對象自己。

2.值類型不可能派生出新的類型:全部的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也能夠實現接口。

3.值類型不可能包含 null 值:然而,可空類型功能容許將 null 賦給值類型。

4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。

 

  1. C#中的接口和類有什麼異同

不一樣點

不能直接實例化接口。

接口不包含方法的實現。

接口能夠多繼承,類只能單繼承。

類定義可在不一樣的源文件之間進行拆分。

相同點

接口、類和結構均可以從多個接口繼承。

接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。

接口和類均可以包含事件、索引器、方法和屬性。

 

基礎知識:接口只能定義方法(只能定義行爲,不能定義實現也就是字段),由於事件、索引器、屬性本質上都是方法,因此接口中也能夠定義事件、索引器、屬性。

 

  1. abstract class和interface有什麼區別

相同點: 

都不能被直接實例化,均可以經過繼承實現其抽象方法。 

不一樣點: 

接口支持多繼承;抽象類不能實現多繼承。 

接口只能定義行爲;抽象類既能夠定義行爲,還可能提供實現。 

接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;

抽象類能夠定義字段、屬性、包含有實現的方法。  

接口能夠做用於值類型(Struct)和引用類型(Class);抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。

 

  1. 是否能夠繼承String類

String類是sealed類故不能夠繼承。

 

  1. using關鍵字有什麼用?什麼是IDisposable?

using能夠聲明namespace的引入,還能夠實現非託管資源的釋放,實現了IDisposiable的類在using中建立,using結束後會自動調用該對象的Dispose方法,釋放資源。加分的補充回答:using其實等價於try……finally,用起來更方便。

 

  1. string str = null 與 string str = 「」說明其中的區別

string str = null 是不給他分配內存空間,string str = 「」 給它分配長度爲空字符串的內存空間。 string str = null沒有string對象,string str = 「」有一個字符串對象。

 

  1. 什麼是code-Behind技術

就是代碼隱藏(代碼後置),在ASP.NET中經過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的建立。好比分工,美工和編程的能夠個幹各的,不用再像之前asp那樣都代碼和html代碼混在一塊兒,難以維護。code-Behind是基於部分類技術實現的,在個人項目的三層代碼生成器中用到了部分類。

 

  1. StringBuilder 和 String 的區別?

String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。因此在大量字符串拼接或頻繁對某一字符串進行操做時最好使用 StringBuilder,不要使用 String

若是要操做一個不斷增加的字符串,儘可能不用String改用StringBuilder類。兩個類的工做原理不一樣:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符串添加到另外一個字符串上的工做沒錯,可是在.NET框架下,這個操做實在是划不來。由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了很多時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,可以在已有對象的原地進行字符串的修改,簡單並且直接。固然,通常狀況下覺察不到這兩者效率的差別,但若是你要對某個字符串進行大量的添加操做,那麼StringBuilder類所耗費的時間和String類簡直不是一個數量級的。

 

  1. 不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎?

String是不可變的在這段代碼中,s原先指向一個String對象,內容是 "abc",而後咱們將s指向"123",那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"123",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。

 

  1. 是否能夠從一個static方法內部發出對非static方法的調用?

不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部不能發出對非static方法的調用。

 

  1. 說出一些經常使用的類、接口,請各舉5個

要讓人家感受你對.Net開發很熟,因此,不能僅僅只列誰都能想到的那些東西,要多列你在作項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。

經常使用的類:StreamReaderWebClientDictionary<K,V>StringBuilderSqlConnectionFileStreamFileRegexList<T>

經常使用的接口:IDisposableIEnumerableIDbConnectionIComparableICollectionIListIDictionary

 

  1. 編寫一個單例(Singleton)類

把構造函數設置爲private,設置一個publicstatic的對象實例

public class FileManager

{

    private FileManager(){}

    public readonly static FileManager Instance = new FileManager();

}

 

  1. .Net、ASP.Net、C#、VisualStudio之間的關係是什麼?

.Net通常指的是.Net Framework,提供了基礎的.Net類,這些類能夠被任何一種.Net編程語言調用,.Net Framework還提供了CLRJITGC等基礎功能。

ASP.Net.Net中用來進行Web開發的一種技術,ASP.Net的頁面部分寫在aspx 文件中,邏輯代碼一般經過Code-behind的方式用C#VB.Net等支持.Net的語言編寫。

C#是使用最普遍的支持.Net的編程語言。除了C#還有VB.NetIronPython等。

VisualStudio是微軟提供的用來進行.Net開發的集成開發環境(IDE),使用VisualStudio能夠簡化不少工做,不用程序員直接調用csc.exe等命令行進行程序的編譯,並且VisualStudio提供了代碼自動完成、代碼高亮等功能方便開發。除了VisualStudio,還有SharpDevelopMonoDevelop等免費、開源的IDEVisualStudio Express版這個免費版本。

 

  1. 如下兩種異常處理方式有什麼區別?try {} catch(){throw;}  try{}catch(Exception ex){Throw ex;}

前者catch無參數,能夠捕獲全部異常,只有throw關鍵字,表示拋出當前catch語句捕獲的異常。

後者catch有參數,能夠捕獲全部以Exception類派生的異常,throw 變量名;拋出的是Exception異常或Exception派生的類型

 

  1. 用接口或父類做爲輸入的參數有什麼好處?返回值若是是接口是爲了什麼?

接口或父類做爲參數,全部繼承了此接口或父類的類均可以使用,即你給此方法傳參數的時候,能夠把繼承了這個接口或父類的類的實例傳給這個方法。能夠一次性傳入多種字段、方法等而不用定義多個形參。

接口做爲返回值,返回的是實現接口的對象。

 

  1. C#和JS的閉包

閉包的概念是內層的函數能夠引用包含在它外層的函數的變量,即便外層函數的執行已經終止。但該變量提供的值並不是變量建立時的值,而是在父函數範圍內的最終值。

C#閉包可理解爲跨做用域訪問函數內變量,那麼如何避免閉包陷阱呢?C#中廣泛的作法是,將匿名函數引用的變量用一個臨時變量保存下來,而後在匿名函數中使用臨時變量。JS閉包,在js中的個人理解就是函數嵌套函數,當內部函數在定義它的做用域的外部被引用時,就建立了該內部函數的閉包 ,若是內部函數引用了位於外部函數的變量,當外部函數調用完畢後,這些變量在內存不會被釋放,由於閉包須要它們。

 

  1. Sleep()和wait()有什麼區別?

1. sleep是線程類Thread 的方法,它是使當前線程暫時睡眠,能夠放在任何位置。

而wait,它是使當前線程暫時放棄對象的使用權進行等待,必須放在同步方法或同步塊裏。

2.Sleep使用的時候,線程並不會放棄對象的使用權,即不會釋放對象鎖,因此在同步方法或同步塊中使用sleep,一個線程訪問時,其餘的線程也是沒法訪問的。

而wait是會釋放對象鎖的,就是當前線程放棄對象的使用權,讓其餘的線程能夠訪問。

3.線程執行wait方法時,須要其餘線程調用Monitor.Pulse()或者Monitor.PulseAll()進行喚醒或者說是通知等待的隊列。

而sleep只是暫時休眠必定時間,時間到了以後,自動恢復運行,不需另外的線程喚醒

 

  1. c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?

using 引入名稱空間或者使用非託管資源,使用完對象後自動執行實現了IDisposable接口的類的Dispose方法

 

new 新建實例或者隱藏父類方法

 

  1. string str=null與string str="" 有什麼區別

string str=null 把這個引用指向了一個null,沒有地址沒有值的地方,即沒分配內存空間

string str="" 把這個引用指向了一個地址,地址裏面存的是空的字符,即佔用了內存空間

 

  1. 不用中間變量交換兩個變量?

int i = 500;

int j = int.MaxValue - 10;

//int i = 10;

//int j = 20;

 

Console.WriteLine("i={0},j={1}", i, j);

 

i = i + j;//i=30

j = i - j;//j=10;

i = i - j;//i=20;

 

Console.WriteLine("i={0},j={1}",i,j);

另一個解決方案:位運算。

int   a=5;

int   b=6;

a=a^b;   

b=b^a;   //b^a至關於   b^a^b   也就是   b^a^b的值就是a,   下邊相同   

a=a^b;

 

  1. 一個數組:1,1,2,3,5,8,13,21...+m,求第30位數是多少?

寫遞歸要肯定兩個:遞歸的終止條件;遞歸表達式。

解答:總結遞歸規律:F(n)=F(n-2)+F(n-1) Fibonacci數列

        static int F(int n)

        {

            if (n == 1)

            {

                return 1;

            }

            if (n == 2)

            {

                return 1;

            }

            return F(n - 2) + F(n - 1);

        }

非遞歸(bug嗎?),遞歸算法的缺點:測試大數據

           int n = Convert.ToInt32(Console.ReadLine());

           if(n<=0)

           {Console.WRiteLine("必須大於0");return;}

           if(n==1)  //時刻注意邊界值!!!

           {

                Console.WriteLine("1");

               return;

           }

            int[] data =new int[n];

            data[0] = 1;

            data[1] = 1;

            for(int i=2;i<n;i++)

            {

                data[i] = data[i-1]+data[i-2];

            }

            Console.WriteLine(data[n-1]);

上面程序的時間複雜度爲O(n),空間複雜度爲O(n)

 

參考:

算法複雜度:時間複雜度:算法運行須要消耗的時間的數量級、空間複雜度:算法運行須要消耗的內存的數量級。

消耗的時間或者內存隨着問題規模的擴大而成正比增長,就是O(n)

消耗的時間或者內存隨着問題規模的擴大而不變,就是O(1)

消耗的時間或者內存隨着問題規模的擴大而n*n增長,就是O(n*n)

 

算法複雜度只考慮最差狀況(從一個數組中找出第一個大於10的數,時間複雜度爲O(n)),而且算法複雜度忽略常量和低階。把數組數一遍和數兩遍的時間複雜度都是O(n)。把長度爲n的數組數n/2遍的時間複雜度仍是O(n*n)

 

  1. 冒泡排序

for (int j = 0; j < nums.Length - 1; j++)

            {

                for (int i = 0; i < nums.Length - 1 -j; i++)

                {

                    if (nums[i] > nums[i + 1])

                    {

                        int temp = nums[i];

                        nums[i] = nums[i + 1];

                        nums[i + 1] = temp;

                    }

                }

            }

 

  1. 求如下表達式的值,寫出您想到的一種或幾種實現方法:1-2+3-4+……+m

int Num = this.TextBox1.Text.ToString() ;

int Sum = 0 ;

for (int i = 0 ; i < Num + 1 ; i++)

{

if((i%2) == 1)

{

Sum += i ;

}

else

{

Sum = Sum - I ;

}

}

System.Console.WriteLine(Sum.ToString());

System.Console.ReadLine() ;

 

 

2、 2階段:WEB前端基礎

 

  1. JavaScript中的=、==、===區別

=:即賦值運算;

==:判斷兩個變量是否相同,僅限於值,若是值相同而類型不一樣,那麼JavaScript引擎會在內部作類型轉換;

===:判斷兩個變量是否相同,不管是值仍是類型,若是類型不一樣而值相同,也會返回false,而引擎不會在內部進行轉換。

 

  1. JavaScript中的undefined、null區別

通俗地講,undefined出現的緣由是JavaScript引擎不知道這是個什麼東西,而對於nullJavaScript引擎識別了它,可是沒有被分配內存空間。

undefined的類型就是undefined,而null的類型是object

 

  1. 簡述javascript的做用域和閉包

js變量的做用域是指:函數內定義的局部變量只在此函數內有效,而全局變量能夠全局有效。

閉包的做用就在於可以改變局部變量的做用域,將值保存下來,可是若是使用不當會形成沒法回收變量,引發性能問題,甚至崩潰。

 

  1. web標準以及w3c的理解和認識

標籤閉合,標籤小寫,不亂嵌套,提升搜索機器人搜索概率。使用外鏈cssjs腳本,結構行爲表現分離,內容能被更多普遍的設備所訪問,更少的代碼和組件,容易維護,改版方便,不須要變更頁面內容。

 

  1. Html和xhtml有什麼區別

html是一種基本的web網頁設計語言,xhtml是一個基於XML的置標語言。

最主要的不一樣:

XHTML元素必須正確的被嵌套,元素必須關閉,標籤必須小寫,必須有根元素。

 

  1. 嚴格模式和混雜模式的區分,以及如何觸發這2種模式

嚴格模式就是瀏覽器根據web標準去解析頁面,是一種要求嚴格的DTD,不容許使用任何表現層的語法

混雜模式是一種向後兼容的解析方法。

觸發標準模式或者說嚴格模式很簡單,就是Html前申明正確的DTD,出發混雜模式能夠在html文檔開始不聲明DTD,或者在DOCTYPE前加入XML聲明

 

  1. 行內元素有哪些?塊級元素有哪些CSS盒模型

行內元素: br span input a

塊級元素IV P H1 H2 FORM ul

CSS盒模型內容:padding border margin

 

  1. css引入的方式有哪些?link和@import的區別

引入方式3種:行內添加定義style屬性值,頁面頭部內內嵌調用和外鏈調用,

區別:

1.linkxhtml標籤,除了加載css外,還能夠定義RSS等其餘事務,@import只能加載CSS

2.link引用CSS時候,頁面載入的時候同時加載,@import須要頁面網頁徹底載入後加載

3.linkXHTML標籤,沒有兼容問題,@import是在CSS2.1提出的,低版本的瀏覽器不支持。

4.link支持使用javascript控制DOM去改變樣式,可是@import不支持。

 

  1. CSS選擇符有哪些?優先級算法如何計算?內聯和Important哪一個優先級高

CSS選擇符有類選擇符,屬性選擇符,ID選擇符,優先級算法是基於特殊性值進行計算的。分別以下:ID屬性 0.1.0.0

類屬性選擇器,屬性選擇器,僞類 0.0.1.0 元素選擇符,僞元素選擇符 0.0.0.1

通配選擇器對特殊性沒有任何貢獻值。

important優先級高

  1. 前端頁面有哪三層構成,分別是什麼,做用是什麼?

結構層:html 表示層:css 行爲層:js

 

  1. 頁面的哪些瀏覽器你測試過,分別內核是什麼?

IE: trident內核

Firefoxgecko內核

Safari:webkit內核

Opera:之前是presto內核,Opera現已改用Google ChromeBlink內核

Chrome:Blink(基於webkitGoogleOpera Software共同開發)

 

  1. img標籤上的title和alt屬性區別是什麼

alt是當圖片不能正常顯示的時候,用文字代替

title該屬性提供信息

 

  1. 你如何對網站的文件和資源進行優化?

文件合併

文件最小化/文件壓縮

使用CDN託管(CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。)

緩存的使用

 

  1. 什麼是語義化的HTML

直觀的認識標籤

對於搜索引擎的抓取有好處

 

  1. 清除浮動的幾種方式,各自的優缺點?

使用空標籤清除浮動 clear:both(理論上能清楚任何標籤增長無心義的標籤)

使用overflow:auto(空標籤元素清除浮動而不得不增長無心代碼的弊端使用zoom:1用於兼容IE

使用afert僞元素清除浮動(用於非IE瀏覽器)

 

  1. javascript的typeof返回哪些數據類型

Object number function boolean underfind

 

  1. 例舉3種強制類型轉換和2種隱式類型轉換

強制(parseInt,parseFloat,number

隱式(== – ===

 

  1. split() join() 的區別

前者是切割成數組的形式,後者是將數組轉換成字符串

 

  1. 數組方法pop() push() unshift() shift()

Push()尾部添加 pop()尾部刪除

Unshift()頭部添加 shift()頭部刪除

 

  1. 閉包是什麼,有什麼特性,對頁面有什麼影響?

閉包就是可以讀取其餘函數內部變量的函數。

詳情查看這篇博文:http://blog.csdn.net/gaoshanwudi/article/details/7355794

 

  1. 解釋jsonp的原理,以及爲何不是真正的ajax

動態建立script標籤,回調函數

Ajax是頁面無刷新請求數據操做

 

  1. javascript的本地對象,內置對象和宿主對象

本地對象爲array obj regexp等能夠new實例化

內置對象爲gload Math 等不能夠實例化的

宿主爲瀏覽器自帶的document,window

 

  1. document load 和document ready的區別

Document.onload 是在結構和樣式加載完才執行js

Document.ready原生種沒有這個方法,jquery中有 $().ready(function)

 

  1. javascript的同源策略

一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這裏的同一來源指的是主機名、協議和端口號的組合

 

  1. 編寫一個數組去重的方法

function oSort(arr)

{

var result ={};

var newArr=[];

for(var i=0;i<arr.length;i++)

{

if(!result[arr])

{

newArr.push(arr)

result[arr]=1

}

}

return newArr

}

 

  1. jQuery中有哪幾種類型的選擇器?

從我本身的角度來說,能夠有3種類型的選擇器,以下:

基本選擇器:直接根據idcss類名、元素名返回匹配的dom元素。

層次選擇器:也叫作路徑選擇器,能夠根據路徑層次來選擇相應的DOM元素。

過濾選擇器:在前面的基礎上過濾相關條件,獲得匹配的dom元素。

 

 

  1. 請使用jQuery將頁面上的全部元素邊框設置爲2px寬的虛線?

這正是jQuery選擇器上場的時候了,代碼以下:

<script language="javascript" type="text/javascript">

         $("*").css("border", "2px dotted red");

</script>

 

  1. CDN上的jQuery文件不可用時,該怎麼辦?

爲了節省帶寬和腳本引用的穩定性,咱們會使用CDN上的jQuery文件,例如googlejquery cdn服務。可是若是這些CDN上的jQuery服務不可用,咱們還能夠經過如下代碼來切換到本地服務器的jQuery版本:

<script type="text/javascript" language="Javascript" src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.4.1.min.js "></script>

<script type='text/javascript'>//<![CDATA[

if (typeof jQuery == 'undefined') {

document.write(unescape("%3Cscript src='/Script/jquery-1.4.1.min.js' type='text/javascript' %3E%3C/script%3E"));

}//]]>

</script>

 

  1. 怎樣用jQuery編碼和解碼URL?

在jQuery中,咱們能夠使用如下方法實現URL的編碼和解碼。

encodeURIComponent(url) and decodeURIComponent(url)

 

  1. 如何用jQuery禁用瀏覽器的前進後退按鈕?

實現代碼以下:

<script type="text/javascript" language="javascript">

 

$(document).ready(function() {

     window.history.forward(1);

     //OR

     window.history.forward(-1);

});

 

</script>

 

  1. 你爲何要使用jquery?

由於jQuery是輕量級的框架,大小不到30kb,它有強大的選擇器,出色的DOM操做的封裝,有可靠的事件處理機制(jQuery在處理事件綁定的時候至關的可靠),完善的ajax(它的ajax封裝的很是的好,不須要考慮複雜瀏覽器的兼容性和XMLHttpRequest對象的建立和使用的問題。) 出色的瀏覽器的兼容性。 並且支持鏈式操做,隱式迭代。行爲層和結構層的分離,還支持豐富的插件,jquery的文檔也很是的豐富。

 

  1. jquery對象和dom對象是怎樣轉換的?

jqueryDOM對象:jQuery 對象是一個數組對象,能夠經過[index]的豐富獲得相應的DOM對象還能夠經過get[index]去獲得相應的DOM對象。DOM對象轉jQuery對象:$(DOM對象)

 

  1. 你是如何使用jquery中的ajax的?

若是是一些常規的ajax程序的話,使用load(),$.get(),$.post(),就能夠搞定了,通常我會使用的是$.post() 方法。若是須要設定beforeSend(提交前回調函數),error(失敗後處理),success(成功後處理)complete(請求完成後處理)回調函數等,這個時候我會使用$.ajax()

 

  1. 你以爲jquery中的ajax好用嗎,爲何?

好用的。 由於jQuery提供了一些平常開發中的快捷操做,例 loadajaxgetpost等等,因此使用jQuery開發ajax將變得極其簡單,咱們就能夠集中精力在業務和用戶的體驗上,不須要去理會那些繁瑣的XMLHttpRequest對象了。

 

  1. jquery中$.get()提交和$.post()提交有區別嗎?

$.get() 方法使用GET方法來進行異步請求的。$.post() 方法使用POST方法來進行異步請求的。

get請求會將參數跟在URL後進行傳遞,而POST請求則是做爲HTTP消息的實體內容發送給Web服務器的,這種傳遞是對用戶不可見的。

get方式傳輸的數據大小不能超過2KB POST要大的多

GET 方式請求的數據會被瀏覽器緩存起來,所以有安全問題。

 

  1. jquery中你是如何去操做樣式的?

addClass() 來追加樣式 ,removeClass() 來刪除樣式,toggle() 來切換樣式

 

  1. 你使用過jquery中的動畫嗎,是怎樣用的?

使用過。

hide() show() 同時修改多個樣式屬性。像高度,寬度,不透明度。 fadeIn() fadeOut() fadeTo() 只改變不透明度

slideUp() slideDown() slideToggle() 只改變高度

animate() 屬於自定義動畫的方法

 

  1. jQuery是如何處理緩存的?

要處理緩存就是禁用緩存。

經過$.post() 方法來獲取數據,那麼默認就是禁用緩存的。

經過$.get()方法 來獲取數據,能夠經過設置時間戳來避免緩存。能夠在URL後面加上+(+new Date)$.get('ajax.xml?'+(+new Date),function () { //內容 }); 3 經過$.ajax 方法來獲取數據,只要設置cache:false便可。

 

  1. $.getScript()方法 和 $.getJson() 方法有什麼區別?

$.getScript() 方法能夠直接加載.js文件,而且不須要對javascript文件進行處理,javascript文件會自動執行。

$.getJson() 是用於加載JSON 文件的 ,用法和$.getScript()

 

  1. 你使用過哪些數據格式,它們各有什麼特色?

HTML格式 ,,JSON格式,javascript格式,XML格式

HTML片斷提供外部數據通常來講是最簡單的。

若是數據須要重用,並且其餘應用程序也可能一次受到影響,那麼在性能和文件大小方面具備優點的JSON一般是不錯的選擇。

而當遠程應用程序未知時,XML則可以爲良好的互操做性提供最可靠的保證。

 

  1. jQuery 能作什麼?

獲取頁面的元素 

修改頁面的外觀

改變頁面大的內容

響應用戶的頁面操做

爲頁面添加動態效果

無需刷新頁面,便可以從服務器獲取信息

簡化常見的javascript任務

 

  1. ajax中data主要有幾種方式?

三種,html拼接的,json數組,form表單經serialize()序列化的。

 

  1. 你知道jQuery中的事件冒泡嗎,它是怎麼執行的,如何來中止冒泡事件?

知道,事件冒泡是從裏面的往外面開始觸發。在jQuery中提供了stopPropagation()方法能夠中止冒泡。

 

3、 3階段:ASP.NET基礎

  1. 請解釋ASP。NET中的web頁面與其隱藏類之間的關係

一個ASP.NET頁面通常都對應一個隱藏類通常都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明以下

<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>

Codebehind="Tst1.aspx.cs" 代表經編譯此頁面時使用哪個代碼文件

Inherits="T1.Tst1" 表用運行時使用哪個隱藏類

aspx頁面會編譯生成一個類,這個類從隱藏類繼承。

 

  1. 在什麼狀況下會用到虛方法?它與接口有什麼不一樣?

子類從新定義父類的某一個方法時,必須把父類的方法定義爲virtual

在定義接口中不能有方法體,虛方法能夠。

實現時,子類能夠不從新定義虛方法,但若是一個類繼承接口,那必須實現這個接口。

 

  1. DataReader和DataSet的異同?

DataReader使用時始終佔用SqlConnection在線操做數據庫

每次只在內存中加載一條數據,因此佔用的內存是很小的是隻進的、只讀的

DataSet則是將數據一次性加載在內存中拋棄數據庫鏈接讀取完畢即放棄數據庫鏈接(非鏈接模式)

DataSet將數據所有加載在內存中.因此比較消耗內存可是確比DataReader要靈活能夠動態的添加行數據對數據庫進行回傳更新操做(動態操做讀入到內存的數據)

 

  1. Server.Transfer和Response.Redirect的區別是什麼?

Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;Response.Redirect則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。

Server.Transfer是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 這個過程當中瀏覽器和Web服務器之間通過了一次交互。

Response.Redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求。這個過程當中瀏覽器和Web服務器之間通過了兩次交互。

 

  1. 什麼是sql注入?如何避免sql注入?

用戶根據系統的程序構造非法的參數從而致使程序執行不是程序員指望的惡意SQL語句。使用參數化的SQL就能夠避免SQL注入。

  1. 數據庫三範式是什麼?

第一範式:字段不能有冗餘信息,全部字段都是必不可少的。

第二範式:知足第一範式而且表必須有主鍵。

第三範式:知足第二範式而且表引用其餘的表必須經過主鍵引用。

 

  1. post、get的區別

get的參數會顯示在瀏覽器地址欄中,而post的參數不會顯示在瀏覽器地址欄中;

使用post提交的頁面在點擊【刷新】按鈕的時候瀏覽器通常會提示是否從新提交,而get則不會;

用get的頁面能夠被搜索引擎抓取,而用post的則不能夠;

用post能夠提交的數據量很是大,而用get能夠提交的數據量則很是小(2k),受限於網頁地址的長度。

用post能夠進行文件的提交,而用get則不能夠。

 

  1. Session,ViewState,Application,cookie的區別

Session:用於保持狀態的基於 Web 服務器的方法。Session 容許經過將對象存儲在Web 服務器的內存中在整個用戶會話過程當中保持任何對象。主要用於保持代碼隱藏類中對象的狀態。爲每一個用戶建立的,用於存儲單個用戶,由於他是相對每一個用戶的.因此可能來取得在線人數等。

ViewState:主要用於保持 Web 頁上控件的狀態。當 Web 頁上的控件被綁定到代碼隱藏類中的對象。

Application 用於存儲全部用戶均可視的信息.因此它存儲的是要讓全部用戶共享的一些信息.如總訪問數等Cache,頁面緩存。

Cookie:一般咱們都把它放在客戶端,也能夠存儲在服務器端。主要用它存儲用戶的個性設制,登陸信息。

 

  1. 寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增加的ID做爲主鍵,注意:ID可能不是連續的。

解1: select top 10 * from A where id not in (select top 30 id from A)

演變步驟:

1select top 30 id from T_FilterWords--取前條

2select * from T_FilterWords

where id not in (select top 30 id from T_FilterWords)--id不等於前三十條的

--也就是把前條排除在外

3select top 10 * from T_FilterWords

where id not in (select top 30 id from T_FilterWords)

--取把前條排除在外的前條,也就是-40

解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

解答3:用ROW_NUMBER實現

 

  1. 橫表、縱錶轉換

縱表結構 TableA 

Name

Course

Grade

張三

語文

75

張三

數學

80

張三

英語

90

李四

語文

95

李四

數學

55

 橫表結構 TableB

Name

語文

數學

英語

張三

75

80

90

李四

95

55

0

先理解:

select Name

 (case Course when ‘語文‘ then Grade else 0 end) as 語文,

 (case Course when ‘數學‘ then Grade else 0 end) as 數學,

 (case Course when ‘英語‘ then Grade else 0 end) as 英語

from TableA

而後理解標準答案:

select Name

sum(case Course when ‘語文‘ then Grade else 0 end) as 語文,

sum(case Course when ‘數學‘ then Grade else 0 end) as 數學,

sum(case Course when ‘英語‘ then Grade else 0 end) as 英語

from TableA

group by Name

 

橫錶轉縱表的"SQL"示例

橫表結構: TEST_H2Z

      ID      姓名    語文        數學       英語      

      1       張三     80         90         70            

      2       李四     90         85         95          

      3       王五     88         75         90          

 

轉換後的表結構:  

      ID     姓名     科目     成績  

      1       張三     語文     80  

      2       張三     數學     90  

      3       張三     英語     70  

      4       李四     語文     90  

      5       李四     數學     80    

      6       李四     英語     99  

      7       王五     語文     85  

      8       王五     數學     96  

      9       王五     英語     88  

 

橫錶轉縱表SQL示例:
SELECT   姓名,'語文'   AS     科目,語文   AS   成績   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'數學'   AS     科目,數學   AS   成績   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'英語'   AS     科目,英語   AS   成績   FROM   TEST_H2Z
ORDER BY 姓名,科目 DESC;

 

  1. 刪除姓名、年齡重複的記錄

Id  name  age  salary

1   yzk    80  1000

2   yzk    80  2000

3   tom    20  20000

4   tom    20  20000

5   im     20  20000

 

//取得不重複的數據

select * from Persons

where Id in

(

SELECT     MAX(Id) AS Expr1

FROM         Persons

GROUP BY Name, Age

)

 

根據姓名、年齡分組,取出每組的Id最大值,而後將Id最大值以外的排除。

 

刪除重複的數據:

delete from Persons

where Id not in

(

SELECT     MAX(Id) AS Expr1

FROM         Persons

GROUP BY Name, Age

)

 

  1.  

表一:student_info

學號

姓名

性別

出生年月

家庭住址

備註

0001

張三

1981-8-9

北京

NULL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

表二:curriculum

課程編號

課程名稱

學分

0001

計算機基礎

2

0002

C語言

2

 

表三:grade

學號

課程編號

分數

0001

0001

80

0001

0002

90

題目:

條件查詢:

  1. 在GRADE表中查找80-90份的學生學號和分數

select 學號,分數 from grade where 分數 between 80 and 90

  1. 在GRADE 表中查找課程編號爲003學生的平均分

   select avg(分數) from grade where 課程編號='003'

  1. 在GRADE 表中查詢學習各門課程的人數

Select課程編號,count(學號) as 人數from grade group by 課程編號

  1. 查詢全部姓張的學生的學號和姓名

   select  姓名,學號 from student_info where 姓名 like '張%'

 

嵌套查詢:

一、 查詢和學號’0001’的這位同窗性別相同的全部同窗的姓名和出生年月

 select 姓名,出生年月 from student_info where 性別 in(select 性別 from student_info where sno='0001')

二、 查詢全部選修課程編號爲0002 和0003的學生的學號、姓名和性別

select 學號,姓名,性別 from student_info where 學號 in(select 學號 from grade where 課程編號='0002' and 學號 in(select 學號 from grade where 課程編號='0001'))

三、 查詢出學號爲0001的學生的分數比0002號學生最低分高的課程編號的課程編號和分數

select 課程編號, 分數 from grade where 學號='0001' and 分數>(select min(分數) from grade where 學號='0002')

 

多表查詢:

一、 查詢分數在80-90分的學生的學號、姓名、分數

select student_info.學號,student_info.姓名,grade.分數 from student_info,grade where grade.分數 between 80 and 90

二、 查詢學習了’C語言’課程的學生學號、姓名和分數

select student_info.學號,student_info.姓名,grade.成績from student_info,grade,curriculum where student_info.學號=grade.學號and grade.課程號=curriculum.課程號and curriculum.課程名='C語言'

三、 查詢全部學生的總成績,要求列出學號、姓名、總成績,沒有選課的學生總成績爲空。

select grade.學號,student_info.姓名,sum(grade.成績) as 總成績from student_info,grade where grade.學號=student_info.學號group by grade.學號,student_info.姓名

 

  1. 活期存款中,「儲戶」經過「存取款單」和「儲蓄所」發生聯繫。假定儲戶包括:帳號,姓名,電話,地址,存款額;「儲蓄所」包括:儲蓄所編號,名稱,電話,地址(假定一個儲戶能夠在不一樣得儲蓄所存取款)

1、寫出設計以上表格的語句(4分)

2、建立一個觸發器TR1完成下面內容:

當向「存取款單」表中插入數據時,若是存取標誌=1則應該更改儲戶表讓存款額加上存取金額,若是存取標誌=0則應該更改儲戶表讓存款額減去存取金額,若是餘額不足顯示餘額不足錯誤。

 

CREATE TABLE CREATE TRIGGER tr1 on qukuan after insert

AS 

BEGIN

 

declare @sid nvarchar(50)

declare @type int

declare @qian int

declare @yuer int

select @sid=sid,@type=[type],@m=m from inserted

select @yuer=yuer from cunkuan

if(@type=1)

begin 

update cunkuan set yuer=yuer+@qian

end

else

begin

 if(@yuer<@qian)

   begin

     print '餘額不足'

   end

 else

    begin

     update cunkuan set yuer=yuer-@qian

    end

end

 

 

END

GO

 

  1. 本題用到下面三個關係表:

CARD     借書卡:   (CNO 卡號,NAME  姓名,CLASS 班級)

BOOKS    圖書:     (BNO 書號,BNAME 書名,AUTHOR 做者,PRICE 單價,QUANTITY 庫存冊數 )

BORROW   借書記錄: (CNO 借書卡號,BNO 書號,RDATE 還書日期

備註:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。

要求實現以下處理:

寫出自定義函數,要求輸入借書卡號能獲得該卡號所借書金額的總和

 

CREATE FUNCTION getSUM

(

@CNO int

)

RETURNS int

AS

BEGIN

declare @sum int

select @sum=sum(price) from BOOKS where bno in (select bno from BORROW where cno=@CNO)

 

return @sum

END

GO

 

找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數。

select CNO,count(BNO) as 借書數量from BORROW group by CNO having count(BNO)>3

 

查詢借閱了"水滸"一書的讀者,輸出姓名及班級。

select name,class from card where cno in( select cno from borrow where bno in(

select bno from BOOKS where bname='水滸'))

 

查詢過時未還圖書,輸出借閱者(卡號)、書號及還書日期。

select CNO,BNO,RDATE from borrow where getdate()>RDATE

 

查詢書名包括"網絡"關鍵詞的圖書,輸出書號、書名、做者。

select bno,bname,author from books where bname like '網絡%'

 

查詢現有圖書中價格最高的圖書,輸出書名及做者。

select bname,author from books where price in(select max(price) from books  )

 

查詢當前借了"計算方法"但沒有借"計算方法習題集"的讀者,輸出其借書卡號,並按卡號降序排序輸出。

select cno from borrow where bno in (select bno from books where bname='計算方法') and cno not in ( select cno from borrow where bno in(select bno from books where bname='計算方法習題集')) order by cno desc

 

 

SELECT a.CNO

FROM BORROW a,BOOKS b

WHERE a.BNO=b.BNO AND b.BNAME=N'計算方法'

    AND NOT EXISTS(

        SELECT * FROM BORROW aa,BOOKS bb

        WHERE aa.BNO=bb.BNO

            AND bb.BNAME=N'計算方法習題集'

            AND aa.CNO=a.CNO)

ORDER BY a.CNO DESC

 

"C01"班同窗所借圖書的還期都延長一週。

update borrow set rdate=dateadd(day,7,rdate) from BORROW where cno in(select cno from card where class='一班')

 

BOOKS表中刪除當前無人借閱的圖書記錄。

DELETE A FROM BOOKS a

WHERE NOT EXISTS(

    SELECT * FROM BORROW

    WHERE BNO=a.BNO) 

 

若是常常按書名查詢圖書信息,請創建合適的索引。

CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)

 

BORROW表上創建一個觸發器,完成以下功能:若是讀者借閱的書名是"數據庫技術及應用",就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表)

CREATE TRIGGER TR_SAVE ON BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

INSERT BORROW_SAVE SELECT i.*

FROM INSERTED i,BOOKS b

WHERE i.BNO=b.BNO

AND b.BNAME=N'數據庫技術及應用'

 

創建一個視圖,顯示"01"班學生的借書信息(只要求顯示姓名和書名)。

CREATE VIEW V_VIEW

AS

select name,bname

from  books,card,borrow

where borrow.cno=card.cno and borrow.bno=books.bno and class='一班'

 

查詢當前同時借有"計算方法""組合數學"兩本書的讀者,輸出其借書卡號,並按卡號升序排序輸出。

select a.cno from borrow a,borrow b

where a.cno=b.cno and

 a.bno in(select bno from books where bname='計算方法') and 

b.bno in(select bno from books where bname='組合數學') 

order by a.cno desc

 

 

SELECT a.CNO

FROM BORROW a,BOOKS b

WHERE a.BNO=b.BNO

  AND b.BNAME IN('計算方法','組合數學')

GROUP BY a.CNO

HAVING COUNT(*)=2

ORDER BY a.CNO DESC

 

用事務實現以下功能:一個借書卡號借走某書號的書,則該書的庫存量減小1,當某書的庫存量不夠1本的時候,該卡號不能借該書

alter PROCEDURE pro_jieshu

 @cno int,

 @bno int,

 @date datetime

AS

BEGIN

 

begin tran

 

declare @quantity int

 

select @quantity=quantity from books where bno=@bno

  insert into borrow values(@cno,@bno,@date)

     update books set quantity=@quantity-1 where bno=@bno

if(@quantity>0)

  begin

   commit tran

  end

else

  begin

   print '已無庫存'

   rollback

  end

END

GO

 

用遊標實現將書號爲A001’的書本的價格提升10

declare @bno int

declare @bname nvarchar(50)

declare @author nvarchar(50)

declare @price int

declare @quantity int 

 

declare mycursor cursor for select * from books

 

open mycursor

 

fetch next from mycursor into @bno,@bname,@author,@price,@quantity

 

while(@@fetch_status=0)

  begin

      if(@bno=2) 

       begin

     update books set price=@price+10 where current of mycursor

       end

     fetch next from mycursor into @bno,@bname,@author,@price,@quantity

  end

 

close mycursor

 

deallocate mycursor

 

  1.  

Student(S#,Sname,Sage,Ssex) 學生表

Course(C#,Cname,T#) 課程表

SC(S#,C#,score) 成績表

Teacher(T#,Tname) 教師表

 

查詢001」課程比「002」課程成績高的全部學生的學號;

select a.S# from (select s#,score from SC where C#='001') a,(select s#,score

  from SC where C#='002') b

  where a.score>b.score and a.s#=b.s#;

 

查詢平均成績大於60分的同窗的學號和平均成績;

select S#,avg(score)

    from sc

group by S# having avg(score) >60;

 

 

查詢全部同窗的學號、姓名、選課數、總成績;

select Student.S#,Student.Sname,count(SC.C#),sum(score)

  from Student left Outer join SC on Student.S#=SC.S#

  group by Student.S#,Sname

 

查詢姓「李」的老師的個數;

select count(distinct(Tname))

  from Teacher

  where Tname like '李%';

 

查詢沒學過「葉平」老師課的同窗的學號、姓名;

select Student.S#,Student.Sname

    from Student  

where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平');

 

查詢學過001」而且也學過編號「002」課程的同窗的學號、姓名;

select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');

 

查詢學過「葉平」老師所教的全部課的同窗的學號、姓名;

select S#,Sname

  from Student

  where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='葉平'));

 

查詢課程編號002」的成績比課程編號「001」課程低的全部同窗的學號、姓名;

Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2

  from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;

查詢全部課程成績小於60分的同窗的學號、姓名;

select S#,Sname

  from Student

  where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

 

查詢沒有學全全部課的同窗的學號、姓名;

select Student.S#,Student.Sname

    from Student,SC

where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

 

查詢至少有一門課與學號爲1001」的同窗所學相同的同窗的學號和姓名;

select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';

 

查詢至少學過學號爲001」同窗全部一門課的其餘同窗學號和姓名;

select distinct SC.S#,Sname

    from Student,SC

where Student.S#=SC.S# and C# in (select C# from SC where S#='001');

 

SC」表中葉平老師教的課的成績都更改成此課程的平均成績;

update SC set score=(select avg(SC_2.score)

    from SC SC_2

where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');

 

查詢和1002」號的同窗學習的課程徹底相同的其餘同窗學號和姓名;

select S# from SC where C# in (select C# from SC where S#='1002')

    group by S# having count(*)=(select count(*) from SC where S#='1002');

 

刪除學習「葉平」老師課的SC表記錄;

Delete SC

    from course ,Teacher  

    where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';

SC表中插入一些記錄,這些記錄要求符合如下條件:沒有上過編號「003」課程的同窗學號、2、號課的平均成績;

Insert SC select S#,'002',(Select avg(score)

from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');

 

按平均成績從高到低顯示全部學生的「數據庫」、「企業管理」、「英語」三門的課程成績,按以下形式顯示: 學生ID,,數據庫,企業管理,英語,有效課程數,有效平均分

SELECT S# as 學生ID

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 數據庫 

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理 

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語 

        ,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績 

    FROM SC AS t

    GROUP BY S#

ORDER BY avg(t.score)

 

查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分

SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分 

    FROM SC L ,SC AS R

    WHERE L.C# = R.C# and 

        L.score = (SELECT MAX(IL.score)

                      FROM SC AS IL,Student AS IM

                      WHERE L.C# = IL.C# and IM.S#=IL.S#

                      GROUP BY IL.C#)

        AND 

        R.Score = (SELECT MIN(IR.score)

                      FROM SC AS IR

                      WHERE R.C# = IR.C#

                  GROUP BY IR.C#

                    );

 

按各科平均成績從低到高和及格率的百分數從高到低順序

SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績 

        ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數 

    FROM SC T,Course

    where t.C#=course.C#

    GROUP BY t.C#

ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC

 

查詢以下課程平均成績和及格率的百分數("1"顯示): 企業管理(001),馬克(002),OO&UML 003),數據庫(004

SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分 

        ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數 

        ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分 

        ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數 

        ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分 

        ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數 

        ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 數據庫平均分 

        ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 數據庫及格百分數 

  FROM SC

 

查詢不一樣老師所教不一樣課程平均分從高到低顯示

SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績 

    FROM SC AS T,Course AS C ,Teacher AS Z

    where T.C#=C.C# and C.T#=Z.T#

  GROUP BY C.C#

  ORDER BY AVG(Score) DESC

 

查詢以下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML 003),數據庫(004[學生ID],[學生姓名],企業管理,馬克思,UML,數據庫,平均成績

SELECT  DISTINCT top 3 

      SC.S# As 學生學號,

        Student.Sname AS 學生姓名 ,

      T1.score AS 企業管理,

      T2.score AS 馬克思,

      T3.score AS UML,

      T4.score AS 數據庫,

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分 

      FROM Student,SC  LEFT JOIN SC AS T1

                      ON SC.S# = T1.S# AND T1.C# = '001' 

            LEFT JOIN SC AS T2

                      ON SC.S# = T2.S# AND T2.C# = '002' 

            LEFT JOIN SC AS T3

                      ON SC.S# = T3.S# AND T3.C# = '003' 

            LEFT JOIN SC AS T4

                      ON SC.S# = T4.S# AND T4.C# = '004' 

      WHERE student.S#=SC.S# and 

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

      NOT IN 

      (SELECT 

            DISTINCT 

            TOP 15 WITH TIES

            ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

      FROM sc

            LEFT JOIN sc AS T1

                      ON sc.S# = T1.S# AND T1.C# = 'k1' 

            LEFT JOIN sc AS T2

                      ON sc.S# = T2.S# AND T2.C# = 'k2' 

            LEFT JOIN sc AS T3

                      ON sc.S# = T3.S# AND T3.C# = 'k3' 

            LEFT JOIN sc AS T4

                      ON sc.S# = T4.S# AND T4.C# = 'k4' 

      ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);

 

統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]

SELECT SC.C# as 課程ID, Cname as 課程名稱 

        ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] 

        ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] 

        ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] 

        ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] 

    FROM SC,Course

    where SC.C#=Course.C#

GROUP BY SC.C#,Cname;

 

查詢學平生均成績及其名次

SELECT 1+(SELECT COUNT( distinct 平均成績)

              FROM (SELECT S#,AVG(score) AS 平均成績 

                      FROM SC

                  GROUP BY S#

                  ) AS T1

            WHERE 平均成績 > T2.平均成績) as 名次,

      S# as 學生學號,平均成績 

    FROM (SELECT S#,AVG(score) 平均成績 

            FROM SC

        GROUP BY S#

        ) AS T2

ORDER BY 平均成績 desc;

 

查詢各科成績前三名的記錄:(不考慮成績並列狀況)

SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數 

      FROM SC t1

      WHERE score IN (SELECT TOP 3 score

              FROM SC

              WHERE t1.C#= C#

            ORDER BY score DESC 

              )

      ORDER BY t1.C#;

 

查詢每門課程被選修的學生數

select c#,count(S#) from sc group by C#;

 

查詢出只選修了一門課程的所有學生的學號和姓名

select SC.S#,Student.Sname,count(C#) AS 選課數 

  from SC ,Student

  where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;

 

查詢男生、女生人數

Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex='男';

Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex='女';

 

查詢姓「張」的學生名單

SELECT Sname FROM Student WHERE Sname like '張%';

 

查詢同名同性學生名單,並統計同名人數

select Sname,count(*) from Student group by Sname having  count(*)>1;

 

1981年出生的學生名單(注:Student表中Sage列的類型是datetime)

select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age

    from student

where  CONVERT(char(11),DATEPART(year,Sage))='1981';

 

查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列

Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;

 

查詢平均成績大於85的全部學生的學號、姓名和平均成績

select Sname,SC.S# ,avg(score)

    from Student,SC

where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;

 

查詢課程名稱爲「數據庫」,且分數低於60的學生姓名和分數

Select Sname,isnull(score,0)

    from Student,SC,Course

where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='數據庫'and score <60;

 

查詢全部學生的選課狀況;

SELECT SC.S#,SC.C#,Sname,Cname

    FROM SC,Student,Course

where SC.S#=Student.S# and SC.C#=Course.C# ;

 

查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;

SELECT  distinct student.S#,student.Sname,SC.C#,SC.score

    FROM student,Sc

WHERE SC.score>=70 AND SC.S#=student.S#;

 

查詢不及格的課程,並按課程號從大到小排列

select c# from sc where scor e <60 order by C# ;

 

查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名;

select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';

 

求選了課程的學生人數

select count(*) from sc;

 

查詢選修「葉平」老師所授課程的學生中,成績最高的學生姓名及其成績

select Student.Sname,score from Student,SC,Course C,Teacher

where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# );

 

查詢各個課程及相應的選修人數

select count(*) from sc group by C#;

 

查詢不一樣課程成績相同的學生的學號、課程號、學生成績

select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ;

 

查詢每門功成績最好的前兩名

SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數 

      FROM SC t1

      WHERE score IN (SELECT TOP 2 score

              FROM SC

              WHERE t1.C#= C#

            ORDER BY score DESC 

              )

      ORDER BY t1.C#;

 

統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列

select  C# as 課程號,count(*) as 人數 

    from  sc  

    group  by  C#

order  by  count(*) desc,c#

 

檢索至少選修兩門課程的學生學號

select  S#  

    from  sc  

    group  by  s#

having  count(*)  >  =  2

 

查詢所有學生都選修的課程的課程號和課程名

select  C#,Cname  

    from  Course  

    where  C#  in  (select  c#  from  sc group  by  c#)

 

查詢沒學過「葉平」老師講授的任一門課程的學生姓名

select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平');

 

查詢兩門以上不及格課程的同窗的學號及其平均成績

select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;

 

檢索004」課程分數小於60,按分數降序排列的同窗學號

select S# from SC where C#='004'and score <60 order by score desc;

 

刪除002」同窗的「001」課程的成績

delete from Sc where S#='001'and C#='001';

 

4、 4階段:ASP.NET高級

  1. Application 、Cookie和 Session 種會話有什麼不一樣?

Application是用來存取整個網站全局的信息,而Session是用來存取與具體某個訪問者關聯的信息。Cookie是保存在客戶端的,機密信息不能保存在Cookie中,只能放小數據;Session是保存在服務器端的,比較安全,能夠放大數據。

 

  1. Session有什麼重大BUG,微軟提出了什麼方法加以解決?

IIS中因爲有進程回收機制,系統繁忙的話Session會丟失,IIS重啓也會形成Session失。這樣用戶就要從新登陸或者從新添加購物車、驗證碼等放到Session中的信息。能夠用State ServerSQL Server數據庫的方式存儲Session不過這種方式比較慢,並且沒法捕獲SessionEND事件。可是這不是Bug,只能說是In-Proc方式存儲Session的缺陷,缺陷是和Bug不同的,In-Proc方式存儲Session會由服務器來決定何時釋SessionIn-Proc方式不知足要求的話徹底能夠用StateServer和數據庫的方式。

 

StateServer還能夠解決集羣Session共享的問題。

 

  1. Asp.net中的錯誤機制

1定製錯誤頁來將顯示一個友好的報錯頁面。

2)頁面中未捕獲同樣會觸發Page_Error,應用程序中的未捕獲異常會觸發Application_Error。經過HttpContext.Current.Server.GetLastError()拿到未捕捉異常,記錄到Log4Net日誌中。

 

  1. 介紹幾個使用過的開源的項目?

Lucene.netNPOIJQueryASP.Net AJAX  toolkitQuartz.NetJqueryUIASP.Net MVC。在CodePlexSourceForge等網站上有更多的開源項目。

 

  1. 如何提升頁面的顯示速度?假如一個頁面的加載時間是10.89s,你會用什麼樣的方式進行優化?

首先要找出問題所在,是服務器端運行的速度慢仍是服務器端到客戶端的下載慢仍是頁面在瀏覽器的加載速度慢。

若是是服務器端運行速度慢,則找是數據庫的緣由仍是算法的問題,若是是數據庫的問題則嘗試添加索引、優化SQL語句,若是是算法的問題,則優化算法。若是對於一些不常常改動的頁面能夠使用靜態頁技術!對於一些數據不須要及時更新的並且取數據的過程很是耗時能夠使用緩存。頁面中的內容能夠按需加載(好比說能夠像verycd網站的評論那樣當用戶須要看的時候再加載其內容),能夠在圖片須要顯示的時候再進行加載。

若是是服務器端到客戶端的下載慢則看是頁面體積過於臃腫仍是網絡問題,若是是頁面體積過於臃腫,則優化HTML代碼,去掉無用的標籤,壓縮JSCSS,能夠用CSS Spirit技術將多個圖片放到一個圖片中,減小向服務器的請求。若是是網絡問題,則嘗試在不一樣的網絡、地區部署服務器,而後使用CDN技術加速訪問。

若是是頁面中的JavaScript運行復雜致使運行速度慢,則優化JavaScript

webkaka:測網速。

 

  1. 在程序編碼的時候,你會對SQL注入漏洞的防範採起什麼樣的措施?

儘可能不要拼SQL語句!使用參數化查詢或存儲過程能夠防止SQL注入攻擊在必須用SQL拼接的地方對用戶輸入的內容進行檢查、過濾。

 

  1. 你會採用什麼樣的策略和方法來實現系統緩存?

在ASP.NET中 緩存有 頁面緩存,數據源緩存,和一些本身定義的緩存!

對於那些整個頁面不常常變化的咱們能夠使用頁面緩存,而對於那些執行很是耗時的SQL語句而且數據的及時性要求不高的咱們能夠使用數據源緩存。

對於頁面緩存、數據源緩存等都不知足要求的狀況下采用直接操做HttpRuntime.Cache來自定義緩存策略。若是須要用多臺Web服務器做爲一個集羣來承載網站的狀況,則能夠部署專門的分佈式緩存服務器,好比Memcached

 

  1. 網站想要實現文件防盜鏈的功能,說說你的解決方案?

讀取HTTP報文頭中的UrlReferrerApplication_BeginRequest中咱們能夠判斷用戶的請求是否來源於本網站。若是不是咱們能夠終止用戶的請求(Response.End();)!

 

  1. 進程和線程的區別?

進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程能夠有多個線程,這些線程共享這個進程的資源。

 

  1. Ajax操做怎麼處理session過時?

Session過時時,咱們獲取請求頭信息值判斷是否爲ajax請求,若是是,咱們能夠返回特定格式的JSON數據,客戶端能夠對此數據處理,發現session失效,能夠跳轉到其餘頁面如登陸等。

 

  1. 簡要談一下你對微軟.Net架構下remoting和webservice兩項技術的理解及實際中的應用

Remoting能夠利用TCP/IP,二進制傳送提升效率,webservice可利用http,穿透防火牆。

遠程邏輯調用,remoing接口只能用在.net remoting.net 中用來跨越machine,process, appdomain 進行方法調用的技術,對於三成結構的程序,就能夠使用remoting技術來構建它是分佈應用的基礎技術.至關於之前的DCOM

WebService是一種構建應用程序的普通模型,並能在全部支持internet網通信的操做系統上實施。Web Service令基於組件的開發和web的結合達到最佳,基於組件的對象模型。

 

  1. 序列化有何做用?

經過流類型能夠方便地操做各類字節流,但如何把現有的實例對象轉換爲方便傳輸的字節流,就須要用到序列化的技術。

 

  1. .Net中會存在內存泄漏嗎請簡單描述。

所謂內存泄露就是指一個再也不被程序使用的對象或變量一直被佔據在內存中。.Net中有垃圾回收機制,它能夠保證一對象再也不被引用的時候,即對象編程了孤兒的時候,對象將自動被垃圾回收器從內存中清除掉。雖然.Net能夠回收無用的對象,可是.Net仍然存在因爲使用不當致使的內存泄露問題。.Net中的內存泄露的狀況:長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄露,儘管短生命週期對象已經再也不須要,可是由於長生命週期對象持有它的引用而致使不能被回收,這就是.Net中內存泄露的發生場景,通俗地說,就是程序員可能建立了一個對象,之後一直再也不使用這個對象,這個對象卻一直被引用,即這個對象無用可是卻沒法被垃圾回收器回收的,這就是.Net中可能出現內存泄露的狀況,例如,緩存系統,咱們加載了一個對象放在緩存中(例如放在一個全局Dictionary對象中),而後一直再也不使用它,這個對象一直被緩存引用,但卻再也不被使用。

 

  1. 請編程遍歷WinForm頁面上全部TextBox控件並給它賦值爲string.Empty?

foreach (System.Windows.Forms.Control control in this.Controls)

{

if (control is System.Windows.Forms.TextBox)

{

System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;  

tb.Text = String.Empty ;

}

}

 

  1. 觸發器的做用?

觸發器是一中特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。

 

  1. 索引的做用?和它的優勢缺點是什麼?

索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。

 

  1. 說一下SQLServer中索引的兩種類型

聚簇(或者叫作彙集,cluster)索引和非聚簇索引。

字典的拼音目錄就是聚簇(cluster)索引,筆畫目錄就是非聚簇索引。這樣查詢「GM的漢字就很是快,而查詢「6劃到8劃的字則慢。

聚簇索引是一種特殊索引,它使數據按照索引的排序順序存放表中。聚簇索引相似於字典,即全部詞條在字典中都以字母順序排列。聚簇索引實際上重組了表中的數據,因此你只能在表中創建一個聚簇索引。

 

當數據按值的範圍查詢時,聚簇索引就顯得特別有用。由於全部SQLServer都必需先找到所查詢範圍的第一行,而後依次下去,直到該範圍的最後一個值找到爲止,而且保證了全部其餘值也落在這個範圍內。舉一個例子,一個應用程序要查找首字母位於GP之間的姓名列表,SQLServer首先找到以字母G開頭的名字,取出全部記錄,直到找到以字母P開頭的名字爲止,這種方法使得查詢過程很是高效。

進行大量數據改動的表不適宜用聚簇索引,由於SQLServer將不得不在表中維護行的次序。若是要索引的值極少,例如一個列包含的全都是10,建立聚簇索引就不是個好主意。若是表常常由一個指定的列來排序,該列將是簇索引的最佳候選列。這是由於表中的數據已經爲你排好序了。若是訪問一個表並使用BETWEEN<>>=<=操做符來返回一個範圍的值時,應該考慮使用聚簇索引。

 

  1. 什麼是事務?什麼是鎖?

事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就能夠使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性

 

鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它能夠使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的。

 

  1. 什麼叫視圖?遊標是什麼?

視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。

 

遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。

 

  1. 什麼是SQL注入式攻擊?

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或做爲存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:

 

⑴ 某個ASP.NET Web應用有一個登陸頁面,這個登陸頁面控制着用戶是否有權訪問應用,它要求用戶輸入一個名稱和密碼。

 

⑵ 登陸頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用做存儲過程的參數。下面是ASP.NET應用構造查詢的一個例子:

 

System.Text.StringBuilder query = new System.Text.StringBuilder(

"SELECT * from Users WHERE login = '")

.Append(txtLogin.Text).Append("' AND password='")

.Append(txtPassword.Text).Append("'");

 

⑶ 攻擊者在用戶名字和密碼輸入框中輸入"''1'='1"之類的內容。

 

⑷ 用戶輸入的內容提交給服務器以後,服務器運行上面的ASP.NET代碼構造出查詢用戶的SQL命令,但因爲攻擊者輸入的內容很是特殊,因此最後獲得的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'

 

⑸ 服務器執行查詢或存儲過程,將用戶輸入的身份信息和服務器中保存的身份信息進行對比。

 

⑹ 因爲SQL命令實際上已被注入式攻擊修改,已經不能真正驗證用戶身份,因此係統會錯誤地受權給攻擊者。

 

若是攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢,他就會嘗試輸入某些特殊的SQL字符串篡改查詢改變其原來的功能,欺騙系統授予訪問權限。

 

系統環境不一樣,攻擊者可能形成的損害也不一樣,這主要由應用訪問數據庫的安全權限決定。若是用戶的賬戶具備管理員或其餘比較高級的權限,攻擊者就可能對數據庫的表執行各類他想要作的操做,包括添加、刪除或更新數據,甚至可能直接刪除表。

 

  1. 如何防範SQL注入式攻擊?

好在要防止ASP.NET應用被SQL注入式攻擊闖入並非一件特別困難的事情,只要在利用表單輸入的內容構造SQL命令以前,把全部輸入內容過濾一番就能夠了。過濾輸入內容能夠按多種方式進行。

 

⑴ 對於動態構造SQL查詢的場合,能夠使用下面的技術:

 

第一:替換單引號,即把全部單獨出現的單引號改爲兩個單引號,防止攻擊者修改SQL命令的含義。再來看前面的例子,"SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'"顯然會獲得與"SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'"不一樣的結果。

 

第二:刪除用戶輸入內容中的全部連字符,防止攻擊者構造出類如"SELECT * from Users WHERE login = 'mas' -- AND password =''"之類的查詢,由於這類查詢的後半部分已經被註釋掉,再也不有效,攻擊者只要知道一個合法的用戶登陸名稱,根本不須要知道用戶的密碼就能夠順利得到訪問權限。

 

第三:對於用來執行查詢的數據庫賬戶,限制其權限。用不一樣的用戶賬戶執行查詢、插入、更新、刪除操做。因爲隔離了不一樣賬戶可執行的操做,於是也就防止了本來用於執行SELECT命令的地方卻被用於執行INSERTUPDATEDELETE命令。

 

⑵ 用存儲過程來執行全部的查詢。SQL參數的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊。此外,它還使得數據庫權限能夠限制到只容許特定的存儲過程執行,全部的用戶輸入必須聽從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。

 

⑶ 限制表單或查詢字符串輸入的長度。若是用戶的登陸名字最多隻有10個字符,那麼不要承認表單中輸入的10個以上的字符,這將大大增長攻擊者在SQL命令中插入有害代碼的難度。

 

⑷ 檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端都執行——之因此要執行服務器端驗證,是爲了彌補客戶端驗證機制脆弱的安全性。

 

在客戶端,攻擊者徹底有可能得到網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),而後將非法內容經過修改後的表單提交給服務器。所以,要保證驗證操做確實已經執行,惟一的辦法就是在服務器端也執行驗證。你能夠使用許多內建的驗證對象,例如 RegularExpressionValidator,它們可以自動生成驗證用的客戶端腳本,固然你也能夠插入服務器端的方法調用。若是找不到現成的驗證對象,你能夠經過CustomValidator本身建立一個。

 

⑸ 將用戶登陸名稱、密碼等數據加密保存。加密用戶輸入的數據,而後再將它與數據庫中保存的數據比較,這至關於對用戶輸入的數據進行了"消毒"處理,用戶輸入的數據再也不對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。 System.Web.Security.FormsAuthentication類有一個HashPasswordForStoringInConfigFile,很是適合於對輸入數據進行消毒處理。

 

⑹ 檢查提取數據的查詢所返回的記錄數量。若是程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就看成出錯處理。

 

  1. 事務是什麼?

事務是做爲一個邏輯單元執行的一系列操做,一個邏輯工做單元必須有四個屬性,稱爲 ACID原子性、一致性、隔離性和持久性)屬性,只有這樣才能成爲一個事務:

1)原子性

事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行。

2)一致性

事務在完成時,必須使全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時,全部的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。

3)隔離性

由併發事務所做的修改必須與任何其它併發事務所做的修改隔離。事務查看數據時數據所處的狀態,要麼是另外一併發事務修改它以前的狀態,要麼是另外一事務修改它以後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,由於它可以從新裝載起始數據,而且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。

4)持久性

事務完成以後,它對於系統的影響是永久性的。該修改即便出現系統故障也將一直保持。

 

  1. Ajax原理

簡述: Ajax的原理就是:經過javascript的方式,將前臺數據經過xmlhttp對象傳遞到後臺,後臺在接收到請求後,將須要的結果,再傳回到前臺,這樣就能夠實現不須要頁面的回發,頁是數據實現來回傳遞,從頁實現無刷新。

Ajax的原理簡單來講,實際上就是經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。

這其中最關鍵的一步就是從服務器得到請求數據。要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。

總結:咱們能夠看出,XMLHttpRequest對象徹底用來向服務器發出一個請求的,它的做用也侷限於此,但它的做用是整個ajax實現的關鍵,咱們能夠把服務器端當作一個數據接口,它返回的是一個純文本流,固然,這個文本流能夠是XML格式,能夠是Html,能夠是Javascript代碼,也能夠只是一個字符串。這時候,XMLHttpRequest向服務器端請求這個頁面,服務器端將文本的結果寫入頁面,這和普通的web開發流程是同樣的,不一樣的是,客戶端在異步獲取這個結果後,不是直接顯示在頁面,而是先由javascript來處理,而後再顯示在頁面。

 

5、 5階段:ASP.NET企業級技術

  1. 談談你對MVC和三層架構的理解

MVC即模型、視圖、控制器,模型表示業務數據及業務處理,用來封裝數據及行爲;視圖是用戶看到並與之交互的界面;控制器接受用戶輸入並調用模型和視圖去完成用戶的請求。使用MVC有利於關注點分離,自動化UI測試成爲了可能。

三層架構即表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。區分層次的目的即爲了高內聚,低耦合的思想。表現層通俗講就是展示給用戶的界面,業務邏輯層即針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。數據訪問層:該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、更新、查找等。

 

  1. MVC中如何保持Sessions?

可以使用tempdataviewdataviewbag三種方式。其中tempdata:在不一樣的控制器或動做間轉換時保持數據。另外,進行頁面轉向時,tempdata能夠保持數據,它是一個內部的Session變量。Viewdata:能夠在控制器和視圖間保持數據。Viewbag:它是視圖數據的動態包裝,使用viewbag不須要類型轉換,它使用的是內部動態關鍵詞。

 

  1. MVC中如何作輸入驗證?

在M層使用數據模型的屬性標籤形如[Required],C層使用ModelState.IsValid屬性檢查數據是否正確,也可在C層使用JavaScript進行數據驗證。

 

  1. 已經有了ASPX,爲何還要Razor?哪一個更好?

Razor是一個輕量級的視圖引擎,MVC3引入,相比ASPXRazor更乾淨、輕量級、語法更簡單,只須要使用@關鍵字,@DataTime.Now

 

  1. MVC有多少種不一樣類型的結果類型,請詳細描述

有12種,最主要的是ActionResult類,它是一個基礎類,它有11個子類型。

ViewResult  - 給響應流渲染指定的視圖

PartialViewResult  - 給響應流渲染指定的局部視圖

EmptyResult  - 返回空的響應結果。

RedirectResult  - 執行一個HTTP轉向到指定的URL

RedirectToRouteResult  -執行一個HTTP轉向到一個URL,這個URL由基於路由數據的路由引擎來決定

JsonResult  - 序列化一個ViewData對像到JSON格式。

JavaScriptResult  - 返回一段javascript代碼,它能夠在客戶端執行。

ContentResult  - 寫內容到響應流,不須要視圖支持。

FileContentResult  - 返回一個文件到客戶端。

FileStreamResult  - 返回一個文件到客戶端,它提供的是流。

FilePathResult  - 返回一個文件到客戶端。

 

  1. 列舉你用過的javascript框架,並簡述它們的優缺點

js框架jQuery EasyUIExtJSBootstrapAngularJS等等。

jQuery EasyUI:輕量級web前端ui開發框架,尤爲適合MIS系統的界面開發,可以重用jquery插件。

ExtJS:統一的前端UI開發框架,學習難度中等。尤爲適合MIS系統的界面開發,開發文檔和例子代碼都比較完整。缺點是大量的js腳本,下降了運行速度。

Bootstrap:響應式網站開發框架,優勢是下降了後端開發人員開發前端頁面的難度,統一了界面風格,缺點是界面風格比較單一。

AngularJS:將java後端的優秀特性引入到了js前端,大而全的框架。缺點是學習曲線高,Angular2幾乎重寫。

 

  1. 什麼是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員,反射就是管理程序集,模塊,類型的對象,它可以動態的建立類型的實例,設置現有對象的類型或者獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在運行時建立和使用類型實例。

 

  1. XML 與 HTML 的主要區別

1. XML是區分大小寫字母的,HTML不區分。

2. HTML中,若是上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你能夠省略</p>或者</li>之類的結束 標記。在XML中,絕對不能省略掉結束標記。

HTML<img src="1.jpg"><br><br>

XML<img src="1.jpg"></img><br/><br/>

3. XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符做爲結尾。這樣分析器就知道不用 查找結束標記了。

4. XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。

5. HTML中,能夠擁有不帶值的屬性名。在XML中,全部的屬性都必須帶有相應的值。

XML是用來存儲和傳輸數據的

HTML是用來顯示數據的

若是使用了徹底符合XML語法要求的HTML,那麼就叫作符合XHTML標準。符合XHTML標準的頁面有利於SEO

 

  1. MVC(模型、視圖、控制器)架構的控制流程

   全部的終端用戶請求被髮送到控制器。

   控制器依賴請求去選擇加載哪一個模型,並把模型附加到對應的視圖。

   附加了模型數據的最終視圖作爲響應發送給終端用戶。

 

  1. MVC同時適用於Windows應用和Web應用嗎?

相比Windows應用,MVC架構更適用於Web應用。對於Windows應用,MVP(Model View Presenter)架構更好一點   。若是你使用WPFSilverlightMVVM更適合。

  1. 使用MVC有哪些好處?

MVC有兩個大的好處:

          離了關注點。後臺代碼被移到單獨的類文件,咱們能夠最大限度的重複利用代碼。

          自動化UI測試成爲可能,由於後臺代碼移到了.NET類。這讓咱們更容易作單元測試和自動化測試

  1. HTML.TextBoxHTML.TextBoxFor有什麼不一樣?

     它們兩個輸出相同的HTML「HTML.TextBoxFor」是強類型的,但「HTML.TextBox」不是。

  1. MVC的路由選擇是什麼?

     路由選擇功能幫你定義一個URL規則,映射URL到控制器。

  1. 在哪裏寫路由映射表?

      「global.asax」 文件。

  1. 咱們能夠映射多個URL到同一個動做嗎?

    是的,能夠。只須要添加多條不一樣Key名字的記錄,而且指定一樣的控制器和動做。

  1. 使用hyperlink生成連接,如何從一個視圖連接到另外一個視圖?

     使用ActionLink方法,以下圖所示。下面的代碼生成一個簡單的URL,連接到"Home"控制器的GotoHome動做。<%= Html.ActionLink("Home","Gotohome") %>   

     

  1. 如何限制一個動做的類型爲GET或POST?

     咱們能夠給MVC的動做一個HttpGetHttpPost屬性去限制HTTP的類型。

  1. MVC中如何保持Sessions?

     能夠經過三種方式保持: tempdata, viewdata, viewbag

  1. tempdata, viewdata, 和 viewbag之間有什麼不一樣?

     Tempdata -在不一樣的控制器或動做間轉換時保持數據。另外,進行頁面轉向時,tempdata能夠保持數據。它    是一個內部的Session變量。

     Viewdata - 能夠在控制器和視圖間保持數據。

     ViewBag -  它是視圖數據的動態包裝。使用Viewbag不須要類型轉換。它使用的是內部動態關健詞。

  1. MVC的局部視圖是什麼?

局部視圖是一個可重複調用的視圖(和用戶控件同樣),它能夠嵌入到視圖裏面。

  1. ASP.NET MVC是如何運行的

     當一個用戶請求提交上來後,ASP.NET MVC會針對當前請求實施路由解析,解析的目標就是找到用戶須要的    Controller並激活它,執行對應的Action方法,最終返回用戶須要的東西。

  也就是說,當ASP.NET MVC接收到抵達的請求後,首要任務就是經過該請求解析獲得對應的Controller和     Action名稱,那麼它是如何解析的呢?這就要了解一下Asp.Net MVC的路由系統了。

  1. 什麼是ASP.NET MVC?

一句話歸納:ASP.NET MVC就是創建在ASP.NET平臺上,基於MVC模式的,Web應用框架。

詳細點說:ASP.NET平臺採用管道式設計,具備良好的擴展性。整個ASP.NET MVC框架就是經過自定義    ASP.NETHttpModuleHttpHandler這兩個核心組件而創建的。

  注:MVC中的Model主要體現爲維持應用狀態並提供業務功能,但ASP.NET MVC中的Model與之是不一樣的,後者   僅僅是綁定到View上的數據而已,二者並非一回事,在學習理解過程當中要格外注意,不要混淆。

相關文章
相關標籤/搜索