C#面試題大全(2)
63.簡要談您對微軟.NET 構(gòu)架下remoting和webservice兩項(xiàng)技術(shù)的理解以及實(shí)際中的應(yīng)用。
答:WS主要是可利用HTTP,穿透防火墻。而Remoting可以利用TCP/IP,二進(jìn)制傳送提高效率。
remoting是.net中用來跨越machine,process, appdomain進(jìn)行方法調(diào)用的技術(shù),對于三成結(jié)構(gòu)的程序,就可以使用remoting技術(shù)來構(gòu)建.它是分布應(yīng)用的基礎(chǔ)技術(shù).相當(dāng)于以前的DCOM。
Web Service是一種構(gòu)建應(yīng)用程序的普通模型,并能在所有支持internet網(wǎng)通訊的操作系統(tǒng)上實(shí)施。Web Service令基于組件的開發(fā)和web的結(jié)合達(dá)到最佳,基于組件的對象模型。
64.公司要求開發(fā)一個(gè)繼承System.Windows.Forms.ListView類的組件,要求達(dá)到以下的特殊功能:點(diǎn)擊ListView各列列頭時(shí),能按照點(diǎn)擊列的每行值進(jìn)行重排視圖中的所有行 (排序的方式如DataGrid相似)。根據(jù)您的知識,請簡要談一下您的思路
答:根據(jù)點(diǎn)擊的列頭,包該列的ID取出,按照該ID排序后,在給綁定到ListView中。
65.給定以下XML文件,完成算法流程圖。
< DriverC >
請畫出遍歷所有文件名(FileName)的流程圖(請使用遞歸算法)。
答:voidFindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders)
{
if(fof is File)
You Found a file;
else if (fof is Directory)
FindFile( fof );
}
}
66.String s = new String("xyz");創(chuàng)建了幾個(gè)String Object?
答:兩個(gè)對象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對像s。
67.abstract class和interface有什么區(qū)別?
答:聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽像類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽像類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽像構(gòu)造函數(shù)或抽像靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽像方法提供實(shí)現(xiàn),否則它們也是抽像類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。
接口(interface)是抽像類的變體。在接口中,所有方法都是抽像的。多繼承性可通過實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽像的,沒有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對像上調(diào)用接口的方法。由于有抽像類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來決定某對象的類是否實(shí)現(xiàn)了接口。
68.啟動一個(gè)線程是用run()還是start()?
答:啟動一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會立即運(yùn)行。
run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。
69.兩個(gè)對像值相同(x.equals(y)== true),但卻可有不同的hashcode,這句話對不對?
答:不對,有相同的hashcode。
70.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:switch(expr1)中,expr1是一個(gè)整型,字符或字符串,因此可以作用在byte和long上,也可以作用在string上。
71.當(dāng)一個(gè)線程進(jìn)入一個(gè)對象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對象的其它方法?
答:不能,一個(gè)對象的一個(gè)synchronized方法只能由一個(gè)線程訪問。
72.abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?
答:都不能。
73.List, Set, Map是否繼承自Collection接口?
答:List,Set是Map不是
74.Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?
答:Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。
equals()和==方法決定引用值是否指向同一對像equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對象的內(nèi)容和類型相配的話,返回真值。
75.sleep() 和 wait() 有什么區(qū)別?
答:sleep()方法是將當(dāng)前線程掛起指定的時(shí)間。
wait()釋放對象上的鎖并阻塞當(dāng)前線程,直到它重新獲取該鎖。
76.short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)?
答:short s1 =1; s1 = s1 + 1;有錯(cuò),
s1是short型,s1+1是int型,不能顯式轉(zhuǎn)化為short型。可修改為s1=(short)(s1 + 1) 。short s1 = 1;s1 += 1正確。
77.談?wù)刦inal,finally, finalize的區(qū)別。
答:final-修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中 不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為 final的方法也同樣只能使用,不能重載
finally-再異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進(jìn)入 finally 塊(如果有的話)。
finalize-方法名。Java 技術(shù)允許使用finalize() 方法在垃圾收集器將對像從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對象沒有被引用時(shí)對這個(gè)對象調(diào)用的。它是在 Object 類中定義的 ,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對像之前對這個(gè)對象調(diào)用的。
78.如何處理幾十萬條并發(fā)數(shù)據(jù)?
答:用存儲過程或事務(wù)。取得最大標(biāo)識的時(shí)候同時(shí)更新。注意主鍵不是自增量方式這種方法并發(fā)的時(shí)候是不會有重復(fù)主鍵的。取得最大標(biāo)識要有一個(gè)存儲過程來獲取.
79.Session有什么重大BUG,微軟提出了什么方法加以解決?
答:是iis中由于有進(jìn)程回收機(jī)制,系統(tǒng)繁忙的話Session會丟失,可以用Sate server或SQL Server數(shù)據(jù)庫的方式存儲Session不過這種方式比較慢,而且無法捕獲Session的END事件。
80.成員變量和成員函數(shù)前加static的作用?
答:它們被稱為常成員變量和常成員函數(shù),又稱為類成員變量和類成員函數(shù)。分別用來反映類的狀態(tài)。比如類成員變量可以用來統(tǒng)計(jì)類實(shí)例的數(shù)量,類成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動作。
81.請說明在.net中常用的幾種頁面間傳遞參數(shù)的方法,并說出他們的優(yōu)缺點(diǎn)。
答:session(viewstate)簡單,但易丟失
application 全局
cookie 簡單,但可能不支持,可能被偽造
input type="hidden" 簡單,可能被偽造
url參數(shù)簡單,顯示于地址欄,長度有限
數(shù)據(jù)庫穩(wěn)定,安全,但性能相對弱
82.請指出GAC的含義?
答:全局程序集緩存。
83.向服務(wù)器發(fā)送請求有幾種方式?
答:get,post。get一般為鏈接方式,post一般為按鈕方式。
84.軟件開發(fā)過程一般有幾個(gè)階段?每個(gè)階段的作用?
答:需求分析,架構(gòu)設(shè)計(jì),代碼編寫,QA,部署
85.在c#中using和new這兩個(gè)關(guān)鍵字有什么意義,請寫出你所知道的意義?using 指令 和語句 new 創(chuàng)建實(shí)例 new 隱藏基類中方法。
答:using 引入名稱空間或者使用非托管資源
new 新建實(shí)例或者隱藏父類方法
86.需要實(shí)現(xiàn)對一個(gè)字符串的處理,首先將該字符串首尾的空格去掉,如果字符串中間還有連續(xù)空格的話,僅保留一個(gè)空格,即允許字符串中間有多個(gè)空格,但連續(xù)的空格數(shù)不可超過一個(gè).
答:string inputStr=" xx xx ";
inputStr = Regex.Replace(inputStr.Trim(),"*"," ");
87.什么叫做SQL注入,如何防止?請舉例說明。
答:利用sql語言漏洞獲得合法身份登陸系統(tǒng)。如身份驗(yàn)證的程序設(shè)計(jì)成:
SqlCommand com=new SqlCommand("Select* from users where username='"+t_name.text+"' andpwd='"+t_pwd.text+"'");
object obj=com.ExcuteScale();
if(obj!=null)
{
//通過驗(yàn)證
}
這段代碼容易被sql注入。如用戶在t_name中隨便輸入,在t_pwd中輸入1' and 1='1 就可以進(jìn)入系統(tǒng)了。
88.什么是反射?
答:動態(tài)獲取程序集信息
89.用Singleton如何寫設(shè)計(jì)模式
答:static屬性里面new ,構(gòu)造函數(shù)private
90.什么是ApplicationPool?
答:Web應(yīng)用,類似Thread Pool,提高并發(fā)性能。
91.什么是虛函數(shù)?什么是抽像函數(shù)?
答:虛函數(shù):可由子類繼承并重寫的函數(shù)。
抽像函數(shù):規(guī)定其非虛子類必須實(shí)現(xiàn)的函數(shù),必須被重寫。
92.什么是XML?
答:XML即可擴(kuò)展標(biāo)記語言。eXtensible Markup Language.標(biāo)記是指計(jì)算機(jī)所能理解的信息符號,通過此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。如何定義這些標(biāo)記,即可以選擇國際通用的標(biāo)記語言,比如HTML,也可以使用象XML這樣由相關(guān)人士自由決定的標(biāo)記語言,這就是語言的可擴(kuò)展性。XML是從SGML中簡化修改出來的。它主要用到的有XML、XSL和XPath等。
94.什么是ASP.net中的用戶控件?
答:用戶控件一般用在內(nèi)容多為靜態(tài),或者少許會改變的情況下.用的比較大.類似ASP中的include.但是功能要強(qiáng)大的多。
95.列舉一下你所了解的XML技術(shù)及其應(yīng)用
答:xml用于配置,用于保存靜態(tài)數(shù)據(jù)類型.接觸XML最多的是web Services和config
96.什么是code-Behind技術(shù)。
答:aspx,resx和cs三個(gè)后綴的文件,這個(gè)就是代碼分離.實(shí)現(xiàn)了HTML代碼和服務(wù)器代碼分離.方便代碼編寫和整理.
97.C#中 property 與 attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
答:一個(gè)是屬性,用于存取類的字段,一個(gè)是特性,用來標(biāo)識類,方法等的附加性質(zhì)
98.XML 與 HTML 的主要區(qū)別
答:1. XML是區(qū)分大小寫字母的,HTML不區(qū)分。
2. 在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結(jié)尾,那么你可以省略
或者之類的結(jié)束 標(biāo)記。在XML中,絕對不能省略掉結(jié)束標(biāo)記。
3. 在XML中,擁有單個(gè)標(biāo)記而沒有匹配的結(jié)束標(biāo)記的元素必須用一個(gè) / 字符作為結(jié)尾。這樣分析器就知道不用查找結(jié)束標(biāo)記了。
4. 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。
5. 在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應(yīng)的值。
99.類成員有_____種可訪問形式?
答:this.; newClass().Method;
100.在Asp.net中所有的自定義用戶控件都必須繼承自________?
答:Control。
101.在.Net中所有可序列化的類都被標(biāo)記為_____?
答:[serializable]
102.在.Net托管代碼中我們不用擔(dān)心內(nèi)存漏洞,這是因?yàn)橛辛薩_____?
答:GC。
103.在.Net中,類System.Web.UI.Page 可以被繼承么?
答:可以。
104..net的錯(cuò)誤處理機(jī)制是什么?
答:.net錯(cuò)誤處理機(jī)制采用try->catch->finally結(jié)構(gòu),發(fā)生錯(cuò)誤時(shí),層層上拋,直到找到匹配的Catch為止。
105.利用operator聲明且僅聲明了==,有什么錯(cuò)誤么?
答:要同時(shí)修改Equale和GetHash() ? 重載了"==" 就必須重載 "!="
106.某一密碼僅使用K、L、M、N、O共5個(gè)字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規(guī)則:
(1) 密碼單詞的最小長度是兩個(gè)字母,可以相同,也可以不同
(2) K不可能是單詞的第一個(gè)字母
(3) 如果L出現(xiàn),則出現(xiàn)次數(shù)不止一次
(4) M不能使最后一個(gè)也不能是倒數(shù)第二個(gè)字母
(5) K出現(xiàn),則N就一定出現(xiàn)
(6) O如果是最后一個(gè)字母,則L一定出現(xiàn)
問題一:下列哪一個(gè)字母可以放在LO中的O后面,形成一個(gè)3個(gè)字母的密碼單詞?
A) K B)L C) M D) N
答案:B
問題二:如果能得到的字母是K、L、M,那么能夠形成的兩個(gè)字母長的密碼單詞的總數(shù)是多少?
A)1個(gè) B)3個(gè) C)6個(gè) D)9個(gè)
答案:A
問題三:下列哪一個(gè)是單詞密碼?
A) KLLN B) LOML C) MLLO D)NMKO
答案:C
107.C#中 property 與 attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
答:attribute:自定義屬性的基類;property :類中的屬性
108.C#可否對內(nèi)存進(jìn)行直接的操作?
答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序員不過在C#中,不能直接實(shí)現(xiàn)Finalize方法,而是在析構(gòu)函數(shù)中調(diào)用基類的Finalize()方法
109.ADO.NET相對于ADO等主要有什么改進(jìn)?
答:1:ado.net不依賴于ole db提供程序,而是使用.net托管提供的程序,
2:不使用com
3:不在支持動態(tài)游標(biāo)和服務(wù)器端游
4:,可以斷開connection而保留當(dāng)前數(shù)據(jù)集可用
5:強(qiáng)類型轉(zhuǎn)換
6:xml支持
110.大概描述一下ASP.NET服務(wù)器控件的生命周期
答:初始化 加載視圖狀態(tài)處理回發(fā)數(shù)據(jù) 加載 發(fā)送回發(fā)更改通知 處理回發(fā)事件 預(yù)呈現(xiàn) 保存狀態(tài) 呈現(xiàn) 處置 卸載
111.Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)?
答:不能,可以實(shí)現(xiàn)接口
112.Static Nested Class 和 Inner Class的不同,說得越多越好
答:StaticNested Class是被聲明為靜態(tài)(static)的內(nèi)部類,它可以不依賴于外部類實(shí)例被實(shí)例化。而通常的內(nèi)部類需要在外部類實(shí)例化后才能實(shí)例化。
113.&和&&的區(qū)別
答:&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and).
114. 和 有什么區(qū)別?
答:表示綁定的數(shù)據(jù)源,是服務(wù)器端代碼塊
115.你覺得ASP.NET 2.0(VS2005)和你以前使用的開發(fā)工具(.Net 1.0或其他)有什么最大的區(qū)別?你在以前的平臺上使用的哪些開發(fā)思想(pattern/ architecture)可以移植到ASP.NET2.0上 (或者已經(jīng)內(nèi)嵌在ASP.NET 2.0中)
答:1、ASP.NET2.0把一些代碼進(jìn)行了封裝打包,所以相比1.0相同功能減少了很多代碼。
2、同時(shí)支持代碼分離和頁面嵌入服務(wù)器端代碼兩種模式,以前1.0版本,.NET提示幫助只有在分離的代碼文件,無 法 在頁面嵌入服務(wù)器端代碼獲得幫助提示。
3、代碼和設(shè)計(jì)界面切換的時(shí)候,2.0支持光標(biāo)定位.這個(gè)我比較喜歡。
4、在綁定數(shù)據(jù),做表的分頁.UPDATE,DELETE,等操作都可以可視化操作,方便了初學(xué)者。
5、在ASP.NET中增加了40多個(gè)新的控件,減少了工作量。
116.重載與覆蓋的區(qū)別?
答:1、方法的覆蓋是子類和父類之間的關(guān)系,是垂直關(guān)系;方法的重載是同一個(gè)類中方法之間的關(guān)系,是水平關(guān)系。
2、覆蓋只能由一個(gè)方法,或只能由一對方法產(chǎn)生關(guān)系;方法的重載是多個(gè)方法之間的關(guān)系。
3、覆蓋要求參數(shù)列表相同;重載要求參數(shù)列表不同。
4、覆蓋關(guān)系中,調(diào)用那個(gè)方法體,是根據(jù)對象的類型(對像對應(yīng)存儲空間類型)來決定;重載關(guān)系,是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來選擇方法體的。
117.什么是WSE?目前最新的版本是多少?
答:WSE (WebService Extension)包來提供最新的WEB服務(wù)安全保證,最新版本2.0。
118.a=10,b=15,在不用第三方變量的前提下,把a(bǔ),b的值互換
答:a=a+b;b=a-b;a=a-b;
119.還有變態(tài)要求,需要代碼最短呢。有兩個(gè)結(jié)果:
1) a^=b^(b^=a^b); // 13個(gè)字節(jié)
2) a=b+(b=a)*0; // 11個(gè)字節(jié)
120.請簡述面向?qū)ο蟮亩鄳B(tài)的特性及意義!
答:面向?qū)ο蟮木幊淌褂昧伺缮^承以及虛函數(shù)機(jī)制.一個(gè)本來指向基類的對象指針可以指向其派生類的.并訪問從基類繼承而來的成員變量和函數(shù).而虛函數(shù)是專門為這個(gè)特性設(shè)計(jì)的,這個(gè)函數(shù)在每個(gè)基類的派生類中都是同一個(gè)名字,但函數(shù)體卻并不一定相同,派生類往往為實(shí)現(xiàn)自己的功能而修改這個(gè)虛函數(shù).這樣用一個(gè)指針就能夠?qū)崿F(xiàn)對多種不同的派生類的訪問, 并實(shí)現(xiàn)其派生類的特定功能(代碼 )
121.session喜歡丟值且占內(nèi)存,Cookis不安全,請問用什么辦法代替這兩種原始的方法
答:用ViewState,stateserver
122.對數(shù)據(jù)的并發(fā)采用什么辦法進(jìn)行處理較好。
答:可以控制連接池的連接數(shù)量,條件好的話可以用負(fù)載平衡
123.ADO.NET處理數(shù)據(jù)并發(fā)的方法和步驟?
答:開放式并發(fā),沒有用到數(shù)據(jù)庫的鎖,而依靠SQL語句判斷數(shù)據(jù)是否已經(jīng)變化了。
步驟:通常使用VS提供的工具生成SQL語句,工具生成的結(jié)果實(shí)在不符合要求,才手工寫SQL語句。
124.動態(tài)創(chuàng)建的控件PostBack后是否可以保存下來,為什么?
答:ASP.NET框架不會為你保存,但可以手工保存到ViewState
125.T-SQL中is null和null 的區(qū)別?
答:is null 和 null 區(qū)別相當(dāng)于 "是空盒子" 和 "空盒子"的區(qū)別
--非技術(shù)問題
1、對你來說工作中最重要的是什么?
答:團(tuán)隊(duì)目標(biāo)的實(shí)現(xiàn)。(這是所有公司希望員工擁有的素質(zhì))
2、為什么愿意為本公司工作?
答:因?yàn)槲艺J(rèn)為我可以與貴公司取得共同的發(fā)展。(暗示留下我可能為公司帶來的益處)
3、你認(rèn)為公司為什么要聘用你?
答:因?yàn)槲艺J(rèn)為我的能力和性格完全適合貴公司的這個(gè)職位。
4、如果我們聘用你,你會待多久?
答:我說過了,我想與貴公司共同發(fā)展,當(dāng)然我相信這種發(fā)展是可持續(xù)的,我不愿意失去這個(gè)發(fā)展機(jī)會。(考慮忠誠度問題,這樣回答比較中肯,亂發(fā)誓在陌生人面前是完全沒用的)
5、在你看來,我們會為你的職業(yè)生涯規(guī)劃一個(gè)怎樣的環(huán)境?
答:我有一個(gè)比較長遠(yuǎn)的職業(yè)生涯規(guī)劃目標(biāo),但不管是近期目標(biāo)還是中長期目標(biāo),貴公司的環(huán)境恰恰與我的計(jì)劃相吻合,我相信一定能在貴公司的幫助下實(shí)現(xiàn)自己的規(guī)劃。(看你的計(jì)劃性,如果知道公司的一些具體情況,也可順便拍拍馬屁,但不能過頭)
6、你的優(yōu)點(diǎn)是什么?
答:優(yōu)點(diǎn)是不喜歡多說,喜歡多做。(每個(gè)老板都喜歡的腳踏實(shí)地而不是夸夸其談的員工)
7、什么是你最大的弱點(diǎn)?友情提示:不妨借自我批評來自我表揚(yáng)。
答1:我的短處是心比較軟,總是不擅于推辭別人的要求。(體現(xiàn)你的樂于助人)
答2:我過去不太注重與人的溝通,覺得只要技術(shù)好就可以了,但隨著年齡的增長和接觸更多的人,我覺得與人溝通也很重要,我現(xiàn)在正努力地鍛煉提高自己的溝通能力
8、你的業(yè)余時(shí)間(愛好)喜歡做什么?
答:我經(jīng)常會去打籃球,喜歡戶外運(yùn)動,聽音樂和看電影
9、你對薪水的期望是多少?
答:望可以根據(jù)貴公司的情況以及本地軟件業(yè)行情還有我的能力給出一個(gè)合理的薪金。
10、如果……的話,你怎么辦?
答:如果在我的利益呵公司的利益之間選擇,我會毫不猶豫選擇公司。
11、你對我們公司有什么想法?
友情提示:這可體現(xiàn)你對公司前景的關(guān)注,切忌回答:“都很好,沒什么想法。”,參考回答:“貴公司XX地方做的很好,但XX地方需要加強(qiáng)”, 不宜多說。
--其它
存儲過程和用戶定義函數(shù)都是“SQL語句組成的子程序,用以封裝代碼以便重復(fù)使用”。但區(qū)別也是顯而易見的。簡單說,存儲過程功能強(qiáng)大,但調(diào)用不便,用戶函數(shù)正相反。
用戶定義函數(shù)的優(yōu)點(diǎn):
可以在SQL語句中調(diào)用,直接使用返值,從而形成復(fù)雜的SQL應(yīng)用。
存儲過程則只能用execute命令調(diào)用,用輸出參數(shù)的到返回的結(jié)果。
用戶定義函數(shù)的缺點(diǎn):
能在函數(shù)中使用的語句有嚴(yán)格限制:
不支持create、drop等DDL命令
insert、delete、update只能用在臨時(shí)表上
不支持動態(tài)SQL
不支持“不確定”的函數(shù),比如常用的getdate。不確定函數(shù)是指輸入?yún)?shù)相同,返回結(jié)果可能不同的函數(shù)。全部不確定函數(shù)如下表
@@CONNECTIONS @@TOTAL_ERRORS
變通辦法:
要解決用戶函數(shù)的種種限制,可以巧妙運(yùn)用用戶函數(shù)調(diào)用存儲過程。
比如,需要在函數(shù)中用getdate,就寫個(gè)存儲過程返回getdate的結(jié)果。然后從函數(shù)里去調(diào)用這個(gè)存儲過程。需要在函數(shù)中使用update等,也可類推。
‘--------------------------------------
缺點(diǎn):
1、可移植性是存儲過程和觸發(fā)器最大的缺點(diǎn)。
2、占用服務(wù)器端太多的資源,對服務(wù)器造成很大的壓力
3、不能做DDL。
4、觸發(fā)器排錯(cuò)困難,而且數(shù)據(jù)容易造成不一致,后期維護(hù)不方便。
優(yōu)點(diǎn):
1、預(yù)編譯,已優(yōu)化,效率較高。避免了SQL語句在網(wǎng)絡(luò)傳輸然后再解釋的低效率。
2、存儲過程可以重復(fù)使用,減少開發(fā)人員的工作量。
3、業(yè)務(wù)邏輯封裝性好,修改方便。
4、安全。不會有SQL語句注入問題存在。