計算機軟件及應(yīng)用c編程技巧_第1頁
計算機軟件及應(yīng)用c編程技巧_第2頁
計算機軟件及應(yīng)用c編程技巧_第3頁
計算機軟件及應(yīng)用c編程技巧_第4頁
計算機軟件及應(yīng)用c編程技巧_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

一、最小化窗口點擊“X”或“AltF4”時,最小化窗口,如:protectedoverridevoidWndProc(refMessagem){constintWM_SYSCOMMAND=0x0112;constintSC_CLOSE=0xF060;if(m.Msg==WM_SYSCOMMAND&&(int)m.WParam==SC_CLOSE){//Userclickedclosebuttonthis.WindowState=FormWindowState.Minimized;return;}base.WndProc(refm);}二、如何讓Foreach循環(huán)運行的更快foreach是一個對集合中的元素進行簡單的枚舉及處理的現(xiàn)成語句,用法如下例所示:usingSystem;usingSystem.Collections;namespaceLoopTest{classClass1{staticvoidMain(string[]args){//createanArrayListofstringsArrayListarray=newArrayList();array.Add("Marty");array.Add("Bill");array.Add("George");//printthevalueofeveryitemforeach(stringiteminarray){Console.WriteLine(item);}}}你可以將foreach語句用在每個實現(xiàn)了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NETFrameworkSDK文檔中的C#LanguageSpecification。在編譯的時候,C#編輯器會對每一個foreach區(qū)域進行轉(zhuǎn)換。IEnumeratorenumerator=array.GetEnumerator();try{stringitem;while(enumerator.MoveNext()){item=(string)enumerator.Current;Console.WriteLine(item);}}finally{IDisposabled=enumeratorasIDisposable;if(d!=null)d.Dispose();}這說明在后臺,foreach的管理會給你的程序帶來一些增加系統(tǒng)開銷的額外代碼。三、將圖片保存到一個XML文件WinForm的資源文件中,將PictureBox的Image屬性等非文字內(nèi)容都轉(zhuǎn)變成文本保存,這是通過序列化(Serialization)實現(xiàn)的,例子://usingSystem.Runtime.Serialization.Formatters.Soap;Streamstream=newFileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);SoapFormatterf=newSoapFormatter();Imageimg=Image.FromFile("E:\\Image.bmp");f.Serialize(stream,img);stream.Close();四、屏蔽CTRL-V在WinForm中的TextBox控件沒有辦法屏蔽CTRL-V的剪貼板粘貼動作,如果需要一個輸入框,但是不希望用戶粘貼剪貼板的內(nèi)容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V鍵,例子:privatevoidrichTextBox1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse){if(e.Control&&e.KeyCode==Keys.V)e.Handled=true;}ps:網(wǎng)上摘抄,看了以后感覺不錯,以后碰見好的再陸續(xù)發(fā)布Tags:dotnet技術(shù),c#開發(fā)技術(shù)ASP.NET2.0中使用webpart系列控件Dot-Net技術(shù)|閱讀(144)|評論(0)Oct292005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理]在現(xiàn)在的網(wǎng)站設(shè)計中,更強調(diào)的是用戶的個性化設(shè)置,讓用戶可以自由的設(shè)置符合自己喜好的頁面成為網(wǎng)站開發(fā)人員的頭號難題,不過現(xiàn)在看來這個難題微軟幫我們解決了。在2.0中新增加了一系列webpart控件,可以讓用戶很方便地對網(wǎng)頁的各區(qū)域布局進行調(diào)整。在一些web應(yīng)用程序中,如果用戶想自定義頁面布局,比如一個新聞發(fā)布系統(tǒng),想讓左,中,右三欄的位置進行調(diào)換的話,就可以使用webpart控件。下面,我們來看下2.0中webpart系列控件的一些基本用法。首先,在2005中的工具箱中,可以找到如下圖所示的webpart系列控件,有很多個,限于篇幅,本文介紹其中的一些重要的控件:在webpart系列控件中,其中的webpartmanager控件用于統(tǒng)一管理各webpart控件。而webpartzone控件,則是提供了各區(qū)域劃分,在這些區(qū)域中,用戶可以往里面放置各式各樣的控件,而當(dāng)運行的時候,用戶可以移動的就是這些webpartzone控件所在的區(qū)域。為增強認(rèn)識,我們先做個簡單的例子。1、首先使用2005beta2(或者RC1)新建一個web站點,2、往窗體中拖拉一個webpartmanager控件,再建一個3列1行的表格,分別往每個單元格里拖拉一個webpartzone控件,如下圖:3、往webpartzone1中拖拉放一個日歷控件,并為這個日歷控件選擇一個合適的樣式4、切換到代碼視圖狀態(tài),將日歷控件的title屬性改為:today’sdate。注意的是,日歷控件本身沒有title屬性,但當(dāng)一個控件加入到webpartzone區(qū)域中去后,則該控件被自動包裝為GenericWebPart類型控件,這些類型的控件有title屬性。5、這時,我們可以按F5來運行該程序,運行如下圖所示,可以看到,區(qū)域的右上角有最小化和關(guān)閉,恢復(fù)的按鈕。接下來,我們介紹如何在webpart系列控件中,使用用戶自定義的控件。1、首先,我們?yōu)楣こ添椖吭黾右粋€"google.ascx"的控件,并且在images目錄下,添加google那張著名的logo圖片。接著,往窗體中添加一個2*2行的表格,再往其中的一個單元格添加一個image圖象控件,指定其圖象為google.gif,再添加一個文本框,一個按鈕,如下圖所示,其中,括號內(nèi)的是該控件的名稱:3、在btnsearch按鈕的click事件中寫入如下代碼:Response.Write(Page.IsValid)DimqueryStrAsString=HttpUtility.UrlEncode(txtSearch.Text)Response.Redirect("/search?q="&queryStr)EndSub4、這時,將寫好的google.ascx控件,整個拖拉到我們剛才建立好的表格中的中間那個單元格,如下圖所示:我們并且修改代碼如下,修改其名稱為googleserach:<uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/>接下來,F(xiàn)5運行,可以看到,可以在googlesearch所在的webpart里進行g(shù)oogle搜索了。同時,如果覺得webpart的那些關(guān)閉,恢復(fù),最小化的按鈕不大好看,還可以自定義按鈕,比如在images目錄下,添加下面的圖片:然后,在webpartzone1的屬性中,指定如下的屬性就可以了。CloseVerb.ImageUrl="Images/CloseVerb.gif"EditVerb.ImageUrl="Images/EditVerb.gif"MinimizeVerb.ImageUrl="Images/MinimizeVerb.gif"RestoreVerb.ImageUrl="Images/RestoreVerb.gif"使webpart動起來上面設(shè)計的webpart還沒能動起來,要讓webpart動起來的話,必須要將webpar設(shè)置為designdisplay模式。先為webpart添加下面的radiobutton選擇框<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem></asp:RadioButtonList>并且在code-behind的代碼中,寫入如下代碼:ProtectedSubRadioButtonList1_SelectedIndexChanged(ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeEndSelectEndSub運行上面代碼,選擇designdisplaymode,則可以象下圖那樣,自由拖動webpart,要注意的是,當(dāng)移動各webpart的位置后,即使關(guān)掉瀏覽器,下次重新打開時,依然可以看到各個控件保持原來的位置。其實,2.0是使用在aspnetdb.mdf中的一個叫aspnet_PersonalizationPerUser的表來保存數(shù)據(jù)的,表的結(jié)構(gòu)如下所示:FieldValueId928e121a-4042-4fb4-9520-21210b9b37c1PathId7c3b5dc0-04d0-48a2-bbb2-2b70286f22feUserId9bff14df-024f-4bda-9a0a-b4a19ab9e387PageSettings<Binarydata>LastUpdatedDate10/06/20054:44:05AM如果想恢復(fù)各控件的原來位置,只需要將該數(shù)據(jù)表中相應(yīng)的行刪除掉就可以了。但有個問題是,如果使用每一個webpart的關(guān)閉按鈕,則很難再將其恢復(fù)(當(dāng)然刪除數(shù)據(jù)表中的行,但十分麻煩)。在2.0中,提供了另一種webpart,叫做catlogzone控件,下面介紹其用法:1、往窗體中拖拉一個catlogzone控件,如下圖所視。2、往該catlogzone控件區(qū)域中,再拖放三個webpart系列的控件,分別是DeclarativeCatalogPart,PageCatalogPart,andImportCatalogPart,如下圖所示。其中,DeclarativeCatalogPart控件的作用是,顯示目前頁面上有哪些可以用的webpart控件;PageCatalogPart的作用是,可以讓用戶通過勾選的方式,選定將哪些控件添加轉(zhuǎn)移到其他webpart區(qū)域中去。ImportCatalogPart則可以通過外部磁盤文件的方式,加載其他做好了的webpart部件。3、在radiobutton區(qū)域中,修改以下代碼,增添一個catalogdisplay的顯示模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem></asp:RadioButtonList>然后,在code-behind的代碼中,將代碼修改為如下:ProtectedSubrblMode_SelectedIndexChanged(_ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeEndSelectEndSub4、在DeclarativeCatalogPart任務(wù)菜單上,點擊右上角的智能感知按鈕,然后選"edittemplates"的鏈接,進入模版編輯狀態(tài),如下圖:再往其中的webpartstemplate區(qū)域中拖拉一個google.ascx控件,如下圖,這將允許用戶在運行時,可以自由地往頁面增加這樣的google搜索控件。5、然后修改代碼如下:<ZoneTemplate><asp:DeclarativeCatalogPartID="DeclarativeCatalogPart1"runat="server"><WebPartsTemplate><uc1:Googletitle="GoogleSearch"ID="Google2"runat="server"/></WebPartsTemplate></asp:DeclarativeCatalogPart>6、運行程序,可以看到,當(dāng)選擇catalogdisplaymode時,會顯示如下圖所示的catalogzone,其中列出了當(dāng)前可用的有哪些webpart控件,我們可以把這個google的控件加到其他的webpart區(qū)域,也可以嘗試將已經(jīng)存在的webpart控件關(guān)閉,然后在catalogzone區(qū)域中的控件列表中,把它們再加回到頁面中去。此外,在運行期間,還可以動態(tài)地修改webpart控件的外觀等屬性,如下:1)往窗體中添加一個editorzone的區(qū)域控件,往其中再拖放一個appearanceEdiotrPart控件,該控件可以在運行時,讓用戶動態(tài)改變各webpart控件的屬性。2)我們再修改radiobutton選擇框的代碼如下,則加一個編輯模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem><asp:ListItem>EditDisplayMode</asp:ListItem></asp:RadioButtonList>3)修改code-behind代碼如下:ProtectedSubrblMode_SelectedIndexChanged(ByValsenderAsObject,ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeCase3:WebPartManager1.DisplayMode=WebPartManager.EditDisplayModeEndSelectEndSub4)運行程序,選擇editdisplaymode模式,這時,會發(fā)現(xiàn)每個控件的右上角,會多了一個"edit"的按鈕,點該按鈕,彈出如下圖的窗體,用戶可以修改每個控件的外觀等屬性。最后,我們看下,webpart控件之間還可以進行相互之間的通信,下面的例子中,要實現(xiàn)的是,在一個日歷控件中點選某一個日期,會在已經(jīng)做好的googlesearch的webpart控件的文本框中顯示其日期,達(dá)到通信的目的,下面介紹其實現(xiàn)步驟:1、為了使兩個webpart控件之間進行通信,必須先聲明一個公共的接口。往工程項目里增加一個叫ISelectedDate.vb的類文件,放在app_code目錄下,寫入如下代碼:ImportsMicrosoft.VisualBasicPublicInterfaceISelectedDateReadOnlyPropertySelectedDate()AsDateEndInterface這里,我們返回一個只讀的日期屬性selectedDate.2、再創(chuàng)建一個日歷控件CalendarUC.ascx,其中拖拉一個普通的日歷控件即可。然后寫入如下代碼:PartialClassCalendarUC_ascxImplementsISelectedDatePublicReadOnlyPropertySelectedDate()AsDateImplementsISelectedDate.SelectedDateGetEndGetEndProperty<ConnectionProvider("SelectedDate","SelectedDate")>_PublicFunctionGetSelectedDate()AsISelectedDateReturnMeEndFunctionEndClass上面的代碼,首先實現(xiàn)了已經(jīng)聲明了的IselectedDate接口,要留意的是<ConnectionProvider("SelectedDate","SelectedDate")>中的寫法。由于在這個例子中,日歷控件要為其他的控件提供信息,因此,該日歷控件是一個provider(提供者),而另外的接收信息的控件,是consumer(消費者)。而兩者為了要通信,必須要提供一個通信接入點,就象一個電插頭,要找到合適的電插板一樣。因此,<ConnectionProvider("SelectedDate","SelectedDate")>中的第一個參數(shù),定義了兩者的接口點,第二個參數(shù),則是要傳遞給consumer的參數(shù),本例是selectedDate。3、接下來,我們在已經(jīng)做好的google.ascx控件的代碼中,編寫如下代碼:Private_selectedDateAsISelectedDate<ConnectionConsumer("SelectedDate","SelectedDate")>_SubsetSearchText(ByValSearchTextAsISelectedDate)Me._selectedDate=SearchTextEndSubProtectedSubPage_PreRender(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.PreRenderIf_selectedDateIsNotNothingThenEndIfEndSub可以看到<ConnectionConsumer("SelectedDate","SelectedDate")>的定義必須和provider中的定義一樣。4、再修改如下代碼,將兩個控件的命名變得通俗易懂<ZoneTemplate><uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/><uc3:CalendarUCtitle="CalendarWebPart"runat="server"ID="CalendarUC1"/></ZoneTemplate>5、最后,為了使兩者能互相通信,必須在default.aspx頁中修改如下代碼:<asp:WebPartManagerID="WebPartManager1"runat="server"><StaticConnections><asp:WebPartConnectionID="Connection"ProviderID="CalendarUC1"ProviderConnectionPointID="SelectedDate"ConsumerID="Google1"ConsumerConnectionPointID="SelectedDate"/></StaticConnections></asp:WebPartManager>6、在頁面代碼中,增加一個radiobutton,用作顯示connection模式,并寫入如下代碼:Case4:WebPartManager1.DisplayMode=WebPartManager.ConnectDisplayMode7、運行程序,選擇connectdisplaymode模式。再選擇GOOGLESEARCH的那個webpart控件,點右上角的"conenct"按鈕,此時,會顯示如下圖所示,提示你要選擇從那個控件中得到信息,這里選擇日歷控件,按確定。那么,當(dāng)點選日歷控件的某個日期值的時候,GOOGLESEARCH的那個文本框里,就會顯示相應(yīng)的日期了。小結(jié):本文主要介紹了在2.0中,如何使用基本的webpart系列控件,以達(dá)到改變頁面布局以及如何使頁面的各webpart控件相互之間通信。Tags:dotnet技術(shù),c#開發(fā)技術(shù)用C#與XML創(chuàng)建動態(tài)分層菜單Dot-Net技術(shù)|閱讀(164)|評論(0)Oct282005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理]Author:unknownFrom:Internet從在復(fù)雜的B2B交易中的交換數(shù)據(jù)到為應(yīng)用程序提供配置文件結(jié)構(gòu),XML在許多方面大顯身手!由于XML不斷地獲得軟件的支持,我們完全能夠預(yù)見:XML的應(yīng)用將不斷增加。本文就介紹這樣一種應(yīng)用程序,它使用XML創(chuàng)建類似于Windows開始菜單的分層菜單系統(tǒng),從而向終端用戶提供更滿意的Web體驗。這個應(yīng)用程序?qū)⑹褂肅#、XML和服務(wù)器端Microsoft.Net框架,創(chuàng)建一個DHTML結(jié)構(gòu),IE4或更高版本的瀏覽器可以操作它并在客戶端動態(tài)顯示。由于我們可以快速地訪問服務(wù)器上的XML,并且XML能夠描述層次之間的關(guān)系,因此它成為標(biāo)記“父/子菜單”數(shù)據(jù)的一個最佳選擇。(一個三層菜單系統(tǒng),可點擊放大)除了學(xué)習(xí)如何使用XML創(chuàng)建一個菜單應(yīng)用程序外,我們還要介紹.Net框架的主要XML類,它們位于System.Xml集合中。什么是.Net集合(Assembly)要在C#文件中使用XML,就必須引用一個特定的名稱空間。.Net平臺中的一個名稱空間是作為一個程序組件的組織系統(tǒng)使用的,它對于解決命名沖突很重要,這一點很象XML中的名稱空間。這個基于XML的菜單系統(tǒng)是用位于System.Xml集合中的System.Xml名稱空間創(chuàng)建的。.NetSDK是這樣定義集合的:一個集合就是一個類型和資源的匯集信息,這些類和資源一起使用,形成一個功能的邏輯單元,即一個“邏輯”dll。一個集合需要許多物理文件,如界面、類、資源文件等等,并且創(chuàng)建了關(guān)于文件如何一起工作的元數(shù)據(jù)。集合中還可能包含版本及安全信息。集合有許多好處,其中之一就是可以在ASP.NET應(yīng)用程序中使用,而無須用regsvr32.exe向注冊文件中增加一個類識別號(CLSID)。這樣以來,集合的升級操作與將適當(dāng)?shù)募蠌?fù)制到一個ASP.NET應(yīng)用程序的bin目錄中一樣簡單?,F(xiàn)在我們就來仔細(xì)看一看那些建立在System.Xml名稱空間和集合中的類。如果你以前使用過Microsoft的MSXML3分解器,就會發(fā)現(xiàn)使用System.Xml集合中的類相當(dāng)簡單。這里的菜單應(yīng)用程序只使用了這些主要集合類中的一部分:XmlNode、XmlDocument、XmlNodeList、XmlNamedNodeMap、DocumentNavigator、XmlTextReader和XmlTextWriter。XmlDocument、XmlNodeList和XmlNode類用來創(chuàng)建傳遞給客戶端瀏覽器的菜單應(yīng)用程序的結(jié)構(gòu)。用XmlDocument類以一種安全線程(thread-safe)的方式從服務(wù)器上裝載和分解本地或遠(yuǎn)程XML文檔。建立在一個字符串中的XML標(biāo)記也可以被裝載或分解,從而在一個文檔中創(chuàng)建、移動節(jié)點或取消節(jié)點的移動。XmlNodeList類可以使我們列舉一個節(jié)點的集合來訪問一個特定屬性,如名稱、值或名稱空間。最后,XmlNode類可以用來在XML文檔中向一個用于檢驗的XmlNode對象分配一個特定節(jié)點。XmlNamedNodeMap類用來列舉建立在一個元素類型選擇中的屬性集合。DocumentNavigator、XmlTextReader和XmlTextWriter類提供與XML一起使用所需要的額外功能。要特別說明的是,DocumentNavigator可以用來執(zhí)行XPath查詢,它被包含在XSLT轉(zhuǎn)換中。XmlTextReader類提供對XML節(jié)點的只向前(forward-only)、無緩存的訪問,從而使XML節(jié)點對大型XML文檔也同樣生效。XmlTextWriter類提供一個快速、只向前的指針模型,實現(xiàn)將XML內(nèi)容寫到一個流或一個文件中的目的。在菜單應(yīng)用程序中使用的XML文檔相對來說是較小的,因此我們可以在服務(wù)器端使用文檔對象模式(DOM)來存取XML文檔中的不同節(jié)點。當(dāng)分解大型XML文檔時,就需要使用XmlTextReader類所含有的只向前模型。XML代碼菜單應(yīng)用程序使用了3個XML文檔:menuItems.xml、menuItems2.xml和menuItems3.xml,它們用于標(biāo)記單獨的菜單項目。XML的處理和操作由一個叫做xmlMenus.dll的集合完成,這個集合被服務(wù)器端的一個ASP.NET文件createMenus.aspx所使用。在客戶端的動態(tài)HTML(DHTML)內(nèi)容使用了一個層疊格式表文件和一個JavaScript文件,這些文件聯(lián)合在一起生成了本文開始部分的圖示結(jié)果。我們在List1的代碼顯示了用來標(biāo)記單獨菜單項目的XML文檔的一部分。文檔中的主元素命名為menuItem,它可以包含一個名字和超級鏈接元素以及額外的menuItem子元素。這種關(guān)系可以用來創(chuàng)建包含子菜單的菜單系統(tǒng),就象Windows的開始菜單一樣。由于XML已經(jīng)標(biāo)出了分層關(guān)系,因此就可以利用循環(huán)在不同元素之間行走:當(dāng)使用XmlDocument、XmlNode和XmlNodeList類創(chuàng)建子節(jié)點時,我們可以反復(fù)調(diào)用WalkTree()函數(shù)以顛倒父/子關(guān)系。其它的類如ArrayList和StreamWriter用于將相關(guān)菜單歸類到數(shù)組中,然后在適當(dāng)時間將所生成的菜單結(jié)構(gòu)寫入一個文件中。XmlMenus集合的代碼開始時要聲明一個XmlHierMenu名稱空間,接下來要引用System、System.Xml、System.Collections和System.IO名稱空間:usingSystem;usingSystem.Xml;usingSystem.Collections;usingSystem.IO;在這部分代碼之后要創(chuàng)建3個構(gòu)造器。一個構(gòu)造器不接收變量,只對變量進行初始化。下一個構(gòu)造器接收一個圖象文件的定制路徑。最后一個構(gòu)造器在不經(jīng)常對XML菜單進行刷新的情況下,允許將由集合生成的輸出存儲到一個文件中。最后一個構(gòu)造器所生成的文件可以被靜態(tài)地包含在一個ASP.NET文件中,而不是在各個Web頁面請求時隨時地生成。在構(gòu)造器之后,開始定義CreateMenu()方法,具體請看List2中的代碼。這個方法負(fù)責(zé)進行XML文檔的裝載和解析,找到根節(jié)點,然后在根的子節(jié)點之間循環(huán)。如果發(fā)現(xiàn)一個子節(jié)點本身還有子節(jié)點,就調(diào)用WalkTree()方法,并且把這些子節(jié)點都傳遞到其中。如果這些子節(jié)點還有子節(jié)點,就再次調(diào)用WalkTree()。這個過程循環(huán)進行直到不再發(fā)現(xiàn)增加的子節(jié)點。Walktree()方法的代碼可以參看List3。在調(diào)用WalkTree()方法并且對不同的節(jié)點進行分析的同時,要解析menuItem節(jié)點,將來自其超級鏈接和名字節(jié)點的數(shù)據(jù)放在數(shù)組列表中。對整個XML文檔都進行解析之后,數(shù)組列表的內(nèi)容就被傳遞回調(diào)用的ASP.NET的頁面,然后使用Response對象寫出信息。從這時起,客戶端的JavaScript代碼就開始控制DHTML菜單了。在服務(wù)器端,我們使用一個ASP.NET頁面來開始菜單的創(chuàng)建過程。這個頁面輸入了與集合相關(guān)聯(lián)的名稱空間XmlHierMenu:<%@pagelanguage="C#"%><%@ImportNamespace="XmlHierMenu"%>然后,將樣式表文件和JavaScript文件包含在文件的代碼區(qū)中。最后,在ASP.NET頁面底部的代碼用來引用上面提到的CreateMenu()方法與WalkTree()方法,請看List4。在ASP.NET頁面中所找到的C#代碼只是建立了到不同的XML文檔的路徑,并且對XmlMenu類進行了例示。一旦對這個類進行了例示,就對CreateMenu()方法進行調(diào)用。這個方法接收菜單名以及到這個菜單的XML文檔的文件路徑。在本例中,要創(chuàng)建3個名為menu1、menu2和menu3的菜單,然后在一個ASP.NET頁面中使用。這個應(yīng)用程序在一個給定頁面中可以支持無窮多的菜單,但是我們建議菜單數(shù)目不要過多,因為每增加一個菜單,發(fā)送到客戶端的文件規(guī)模都會增加。編譯C#文件現(xiàn)在我們已經(jīng)看到了菜單應(yīng)用程序的結(jié)構(gòu),接下來討論一下使用哪些開關(guān)可以將C#文件編譯到一個集合中。在.NetSDK文檔中,我們可以查詢到一個所有編譯開關(guān)的完整列表。要想正確地編譯C#文件以使它能用于一個ASP.NET頁面中,編譯器就必須要知道包含了System.Xml集合。這可以通過使用/r開關(guān)并在后面加上到集合的完整路徑來完成。由于將要創(chuàng)建的dll是一個庫,因此就必須指定/t開關(guān),這樣編譯器就不再尋找一個靜態(tài)的Main()方法。最后一個需要的開關(guān)是/out,它將告訴編譯器輸出的文件名是什么,以及將其放在哪里。所有對C#編譯器的調(diào)用都以csc(C#編譯器)開始,然后指定適當(dāng)?shù)拈_關(guān)。編譯器語法的最后一部分包括到已創(chuàng)建的.cs文件的路徑。請看下面的編譯文件的完整語法格式:C:\>csc/r:System.Xml.dll/t:library/out:d:\inetpub\wwwroot\xml\bin\xmlMenus.dlld:\inetpub\wwwroot\xml\menus\xmlMenus.cs這行命令告訴編譯器包含System.Xml集合、將文件作為一個庫進行編譯、將文件輸出到bin目錄中、輸入文件命名為xmlMenus.cs,輸出文件名叫xmlMenus.dll。當(dāng)輸入回車鍵后,.cs文件就進行編譯,生成的dll將被放置在適當(dāng)?shù)奈募A中。結(jié)束語本文通過講解一個應(yīng)用程序的思路及實現(xiàn)代碼,使我們對于使用Microsoft.Net平臺中的一些集合和類有了一個很好的了解。隨著進一步的學(xué)習(xí),我們將看到,還會有其它一些集合和類可以以多種方式與本地和遠(yuǎn)程XML文檔一起工作。Tags:dotnet技術(shù),c#開發(fā)技術(shù)C#語言函數(shù)參數(shù)的傳遞Dot-Net技術(shù)|閱讀(118)|評論(0)Oct282005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理]就像C語言眾多的后世子孫一樣,C#的函數(shù)參數(shù)是非常講究的。首先,參數(shù)必須寫在函數(shù)名后面的括號里,這里我們有必要稱其為形參。參數(shù)必須有一個參數(shù)名稱和明確的類型聲明。該參數(shù)名稱只在函數(shù)體內(nèi)部可見。因此在該函數(shù)體以外的任何地方使用同樣的變量名是不會引起沖突的。每當(dāng)調(diào)用函數(shù)的時候,必須將一個實參傳遞給函數(shù)定義中的形參。默認(rèn)情況下,C#的參數(shù)傳遞是值傳遞。這種方式的優(yōu)點和缺點同樣明顯。另外,在傳送引用類型的時候還時不時引起一些小誤會。更加使人困惑的是,既然CLR不支持指針類型,那么我們以前在C/C中的那些關(guān)于指針傳遞的妙用應(yīng)該如何實現(xiàn)呢?不必發(fā)愁,本文將會逐一回答上述這些疑問。首先我們會討論默認(rèn)情況下的值傳遞以及這種方式的優(yōu)缺點,解釋默認(rèn)情況下傳遞引用類型時容易產(chǎn)生的誤解。然后,我們討論如何利用ref關(guān)鍵字把一個值類型作為引用類型傳遞給參數(shù)。最后,我們嘗試著讓一個函數(shù)可以返回多個值,在C/C中我們經(jīng)常利用指針達(dá)到這一目的,這里我們將會利用out關(guān)鍵字重溫這種美妙的感覺。值傳遞每當(dāng)調(diào)用一個函數(shù)的時候,我們就必須為該函數(shù)的每一個形參傳遞一個實參。默認(rèn)情況下,采用值傳遞的機制。也就是說,實參的值會被拷貝到形參里面,這樣我們在函數(shù)內(nèi)部得到一個本地變量,該變量的值和傳遞進來的那個實參的值相等,但是它們存放在不同的存儲空間。因此,我們對函數(shù)參數(shù)所做的一切實際上都是對函數(shù)提內(nèi)本地變量的操作,絕對不會影響到作為實際參數(shù)傳遞過來的那個函數(shù)體外的變量??聪旅娴睦?,我就不再多費口舌了。usingSystem;namespaceCS語言函數(shù)參數(shù)的傳遞{///<summary>///Class1的摘要說明。///</summary>classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();System.Console.WriteLine(argument);exp.fun1(argument);System.Console.WriteLine(argument);}publicExample(){}publicvoidfun1(intparameter){//對parameter的操作實際上是對本地變量的修改//不會影響到函數(shù)體外作為實參傳遞過來的變量parameter=5;System.Console.WriteLine(parameter);}}}但是值傳遞的機制有一個明顯的缺點。主要表現(xiàn)在值類型的傳遞方面。我們對參數(shù)的修改會在函數(shù)體執(zhí)行結(jié)束之際消失。如果我們希望將這種變化影響到作為實參傳遞過來的那個函數(shù)體以外的變量就必須把值類型作為引用類型傳遞。后邊會具體討論。值傳遞機制的另一個缺點,或許你會認(rèn)為這是一個優(yōu)點,表現(xiàn)在引用類型的傳遞方面。按照值傳遞的機制傳遞一個引用類型的變量,實際上只是完成了一次淺拷貝。請不要誤認(rèn)為對整個對象進行了深拷貝。函數(shù)參數(shù)得到的只是實參的handle的值。也就是說,本地的參數(shù)實際上只是一個引用類型的handle,和作為實參傳遞過來的那個變量的handle具有相同的值,指向同一個object(兩個handle指向堆上的相同位置)。這樣我們在函數(shù)內(nèi)部對參數(shù)所做的修改會直接影響到堆上的object。當(dāng)函數(shù)結(jié)束之后,本地的參數(shù)消失,而對于堆上的object的修改會成為持久的修改而繼續(xù)保留下來。把值類型作為引用類型傳遞有一些時候,我們不惜望函數(shù)對于參數(shù)的修改隨著函數(shù)的結(jié)束而消失。作為引用類型,作到這一點其實一點都不難,就像我們上面說的那樣。但是,如果是值類型的參數(shù),似乎就有一點麻煩了。從前在C/C里面可以采取傳遞指針的方法來達(dá)到這個目的。但是CLR已經(jīng)明確取消了指針。作為補償,C#為我們提供了ref關(guān)鍵字。ref關(guān)鍵字通知編譯器,參數(shù)的實參是作為引用類型而非值類型進行傳遞。下面的這段程序幫助我們說明問題。usingSystem;namespaceCS語言函數(shù)參數(shù)的傳遞{classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();//首先顯示argumentSystem.Console.WriteLine(argument);exp.fun2(refargument);//傳遞參數(shù)時必須使用ref關(guān)鍵字System.Console.WriteLine(argument);System.Console.ReadLine();}publicvoidfun1(intparameter){//對parameter的操作實際上是對本地變量的修改//不會影響到函數(shù)體外作為實參傳遞過來的變量parameter=5;System.Console.WriteLine(parameter);}publicvoidfun2(refintparameter){parameter=5;System.Console.WriteLine(parameter);}}}函數(shù)fun2要求一個int類型的參數(shù),并且伴有關(guān)鍵字ref。在Main()函數(shù)內(nèi)定義了一個整形變量argument,它將會作為實參傳遞給函數(shù)fun2()。在調(diào)用該函數(shù)之前,首先顯示了變量argument,其值等于5。緊接著調(diào)用函數(shù)fun2(),并且傳遞argument給參數(shù)parameter。這時函數(shù)得到的是一個本地的,指向整形變量argument的handle。在函數(shù)內(nèi)部,把parameter加5,然后顯示它。這時其值為10。函數(shù)返回后再一次顯示argument,其值同樣為10。讓函數(shù)返回多個返回值有些時候我們可能會希望一個函數(shù)可以返回多個返回值。事實上,這是不可能的因為一個函數(shù)只能返回一個返回值。但是我們確實辦法達(dá)到這種效果。最簡單的是下面這種方法。publicintfun3(refinti,intj){i=j;returnij;}我們這樣調(diào)用這個函數(shù)。inti;intsum=exp.fun3(refi,10);System.Console.WriteLine(i);System.Console.WriteLine(sum);這樣在執(zhí)行過函數(shù)fun3()之后,我們實際上得到了i的值和ij的值。實際上起到了利用一個函數(shù)返回兩個值的作用。另外有一個關(guān)鍵字也是非常重要的。那就是out關(guān)鍵字。該關(guān)鍵字允許向參數(shù)傳遞一個沒有分配空間的引用類型。利用這個關(guān)鍵字同樣可以達(dá)到返回多個值的目的。publicvoidfun4(refinti,outobjectobj){i=5;obj=i.ToString();System.Console.WriteLine(i);System.Console.WriteLine(obj);}上面這個方法要求兩個參數(shù)。第二個參數(shù)要求一個object類型的變量。該參數(shù)前面有一個out關(guān)鍵字。編譯器會認(rèn)為該參數(shù)的實參沒有被分配存儲空間。Out參數(shù)在未被賦值之前不能使用??梢赃@樣調(diào)用該函數(shù):inti=5;objectobj;exp.fun4(refi,outobj);System.Console.WriteLine(i);System.Console.WriteLine(obj);輸出為4個10。說明我們在調(diào)用該函數(shù)之后得到了變量i和obj兩個變量的值。Tags:dotnet技術(shù),c#開發(fā)技術(shù)使用C#語言操作ADO數(shù)據(jù)庫Dot-Net技術(shù)|閱讀(125)|評論(0)Oct282005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理]訪問數(shù)據(jù)庫是大多數(shù)應(yīng)用程序的一部分,而且隨著C#和ADO.NET的發(fā)布,這個過程已經(jīng)變得相當(dāng)?shù)暮唵?本文將展示下面四個基本的數(shù)據(jù)庫操作:1.讀數(shù)據(jù).這包括諸如整數(shù),字符串和日期等不同的數(shù)據(jù)類型.2.寫數(shù)據(jù).就象讀數(shù)據(jù)一樣我們會寫這些通常的數(shù)據(jù)類型.這是通過SQL語句來實現(xiàn)的.3.更新或是修改數(shù)據(jù).我們還是使用簡單SQL語句.4.刪除數(shù)據(jù).使用SQL.這些操作是對一個微軟Access2000數(shù)據(jù)庫進行的,但是SQL或是其它ADO數(shù)據(jù)源可以通過簡單的改變連接字符串來使用.開始第一步為了使用ADO類,我們需要包括進ADO.NET命名空間(namespace)和一些精巧的日期類.在你要進行數(shù)據(jù)庫操作的地方加入下列幾行代碼.它應(yīng)該被放置在命名空間引入代碼行的下面而在類定義的上面.usingSystem.Data;//申明變量usingSystem.Data.ADO;//數(shù)據(jù)庫usingSystem.Globalization;//日期根據(jù)你所參與的工程的類型,你可能需要增加對System.Data命名空間的引用.你可以根據(jù)在你添加上面的代碼以后編譯器是否產(chǎn)生錯誤來判斷.要添加System.Data命名空間,你可以:1.在Solutionexplorer-References分支中右鍵單擊.2.選擇"添加引用"3.選擇.NETFramework標(biāo)簽.4.雙擊System.data.dll條目5.單擊OK6.System.Data現(xiàn)在應(yīng)該出現(xiàn)在了Solutionexplorer的引用列表中了.因為連接字符串在大多數(shù)操作中都要使用,所以我建議你將它設(shè)置成你要編寫的類的成員.注意:在你的程序中,數(shù)據(jù)庫文件的路徑有可能不同.//屬性publicconststringDB_CONN_STRING="Driver={MicrosoftAccessDriver(*.mdb)};""DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb";讀數(shù)據(jù)現(xiàn)在一切都變得有趣起來.讀數(shù)據(jù)可以通過ADODataReader類來實現(xiàn).(參看ChrisMaunder的文章"ADO.NETADODataReader類"來獲取關(guān)于這個類的更多信息.)讀數(shù)據(jù)的步驟如下:1.我們用ADOConnection來打開一個數(shù)據(jù)庫.ADOConnectionconn=newADOConnection(DB_CONN_STRING);conn.Open();2.我們編寫一個SQL語句來定義將要取出的數(shù)據(jù).這個數(shù)據(jù)執(zhí)行的結(jié)果是返回一個ADODataReader對象.注意Execute方法中的out關(guān)鍵字.這在C#中意味著通過引用傳遞參數(shù).ADODataReaderdr;ADOCommandcmd=newADOCommand("SELECT*FROMPerson",conn);cmd.Execute(outdr);3.我們循環(huán)遍歷ADODataReader中的每一個記錄直到我們完成要做的工作.注意:數(shù)據(jù)被直接作為一個字符串返回同時數(shù)據(jù)域名稱用來指明讀的數(shù)據(jù)域.while(dr.Read()){System.Console.WriteLine(dr["FirstName"]);}4.我們收工但是,作為好的程序員我們還需要加進許多try/catch/finally語句來確保我們處理了所有的錯誤.try{數(shù)據(jù)庫操作...}catch(Exceptionex){System.Console.WriteLine("READING:");System.Console.WriteLine("ERROR:"ex.Message);System.Console.WriteLine("SQL:"sSqlCmd);System.Console.WriteLine("Conn.:"DB_CONN_STRING);}finally{//關(guān)閉連接if(conn.State==DBObjectState.Open)conn.Close();}讀取不同的數(shù)據(jù)類型dr["stuff"]這個語句通常能夠返回一個數(shù)據(jù).但是要返回一個int或者DateTime對象的話通常需要進行數(shù)據(jù)轉(zhuǎn)換.這通??梢酝ㄟ^使用ADODataReader許多內(nèi)建轉(zhuǎn)換器中的一個來實現(xiàn).也就是:intnOrdinalAge=dr.GetOrdinal("Age");intnAge=dr.GetInt32(nOrdinalAge);DateTimetUpdated=(DateTime)dr["Updated"];注意GetOrdinal定位數(shù)據(jù)域用名字來讀取數(shù)據(jù)的用法.如果數(shù)據(jù)域是空白的(還沒有填入任何數(shù)據(jù)),上面的代碼會拋出一個異常.要捕捉這種情況,我們可以用IsNull方法檢查是否有數(shù)據(jù)存在,如下所示:intnOrdinalAge=dr.GetOrdinal("Age");if(dr.IsNull(nOrdinalAge)){System.Console.WriteLine("Age:Notgiven!");}else{intnAge=dr.GetInt32(nOrdinalAge);System.Console.WriteLine("Age:"nAge);}插入,修改,刪除和其他SQL命令插入,修改,刪除過程可以非常容易的通過SQL語句來實現(xiàn).下面的代碼執(zhí)行一條SQL命令來插入一條記錄.//SQL命令StringsSQLCommand="INSERTINTOPerson(Age,FirstName,Description,Updated)""VALUES(55,'Bob','IsaPenguin','2001/12/2520:30:15');";//創(chuàng)建command對象ADOCommandcmdAdder=newADOCommand(sSQLCommand,DB_CONN_STRING);cmdAdder.ActiveConnection.Open();//ExecutetheSQLcommandintnNoAdded=cmdAdder.ExecuteNonQuery();System.Console.WriteLine("\nRow(s)Added="nNoAdded"\n");注意:try/catch代碼沒有在上面的例子里出現(xiàn),但是應(yīng)該包括上面的代碼.插入上面的代碼通過建立一個SQL命令然后執(zhí)行它來插入一條記錄.一些在編寫SQL命令時應(yīng)注意的事項如下:1.數(shù)值數(shù)據(jù)應(yīng)該直接表示.沒有單引號(').2.字符串的表示應(yīng)該包括在單引號中('blah').3.確保字符串中不包含任何嵌入的單(雙)引號.這會使事情混淆.4.日期和時間數(shù)據(jù)用包裹在單引號中的國際通用形式來表示('YYYY/MM/DDHH:MM:SS').修改UPDATE命令指明要修改的數(shù)據(jù)和修改的動作.ExecuteNonQuery()的返回值指出改變的記錄的個數(shù),所以如果有5個Peter's在表單中的話下面的代碼將返回5.StringsSQLCommand="UPDATEPersonSETAge=27WHEREFirstName='Peter'";刪除DELETE命令指明要刪除的記錄.ExecuteNonQuery()的返回值指出改變的記錄的個數(shù),所以如果有2個Bobo在表單中的話下面的代碼將返回2.兩個Bobo都會被刪除.StringsSQLCommand="DELETEFROMPersonWHEREFirstName='Bobo'"";Tags:dotnet技術(shù),c#開發(fā)技術(shù)C#中一些字符串操作的常用用法Dot-Net技術(shù)|閱讀(132)|評論(0)Oct282005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理]//獲得漢字的區(qū)位碼byte[]array=newbyte[2];array=System.Text.Encoding.Default.GetBytes("啊");inti1=(short)(array[0]-''\0'');inti2=(short)(array[1]-''\0'');//unicode解碼方式下的漢字碼array=System.Text.Encoding.Unicode.GetBytes("啊");i1=(short)(array[0]-''\0'');i2=(short)(array[1]-''\0'');//unicode反解碼為漢字stringstr="4a55";strings1=str.Substring(0,2);strings2=str.Substring(2,2);intt1=Convert.ToInt32(s1,16);intt2=Convert.ToInt32(s2,16);array[0]=(byte)t1;array[1]=(byte)t2;strings=System.Text.Encoding.Unicode.GetString(array);//default方式反解碼為漢字array[0]=(byte)196;array[1]=(byte)207;s=System.Text.Encoding.Default.GetString(array);//取字符串長度s="iam方槍槍";intlen=s.Length;//willoutputas6byte[]sarr=System.Text.Encoding.Default.GetBytes(s);len=sarr.Length;//willoutputas33*2=9//字符串相加System.Text.StringBuildersb=newSystem.Text.StringBuilder("");sb.Append("i");sb.Append("am");sb.Append("方槍槍");/////////////////////////////////////////////////////////////////////string-->bytearraybyte[]data=Syste.Text.Encoding.ASCII.GetBytes(string);string-->bytebytedata=Convert.ToByte(string);byte[]-->stringstringstring=Encoding.ASCII.GetString(bytes,0,nBytesSize);Tags:dotnet技術(shù),c#開發(fā)技術(shù)Asp.Net性能優(yōu)化Dot-Net技術(shù)|閱讀(112)|評論(0)Oct282005[此文來源于互聯(lián)網(wǎng),牛C網(wǎng)只負(fù)責(zé)收集整理](一).選擇會話狀態(tài)存儲方式在Webconfig文件配置:<sessionStatemode="???"stateConnectionString="tcpip=:42424"sqlConnectionString="datasource=;Trusted_Connection=yes"cookieless="false"timeout="20"/>A有三種方式存儲會話狀態(tài)信息:1.存儲在進程中:屬性mode=InProc特點:具有最佳的性能,速度最快,但不能跨多臺服務(wù)器存儲共享.2.存儲在狀態(tài)服務(wù)器中:屬性mode="StateServer"特點:當(dāng)需要跨服務(wù)器維護用戶會話信息時,使用此方法。但是信息存儲在狀態(tài)服務(wù)器上,一旦狀態(tài)服務(wù)器出現(xiàn)故障,信息將丟失3.存儲在SqlServer中:屬性mode="SqlServer"特點:工作負(fù)載會變大,但信息不會丟失.補充一點:I.由于某些頁面不需要會話狀態(tài),則可以將會話狀態(tài)禁用:代碼如下:<%@PageEnableSessionState="false"%>II.如果頁面需要訪問會話變量但不允許修改它們,可以設(shè)置頁面會話狀態(tài)為只讀:代碼如下:<%@PageEnableSessionState="false"%>使用時可以根據(jù)具體情況選擇某種方式(二).使用Page.IsPostBackPage.IsPostBack表示是否是從客戶端返回的.初次運行時,不是從客戶端返回,它的值為false,當(dāng)觸發(fā)頁面上的事件或刷新頁面時,Page.IsPostBack由于是回發(fā)的,值變?yōu)閠rue;一般在:Page_Load方法中用:privatevoidPage_Load(Objectsender,EventArgse){if(!Page.IsPostBack){;//初始化頁面的代碼。這些代碼第一次頁面初始化時執(zhí)行,當(dāng)?shù)诙位匕l(fā)時,//不會再執(zhí)行。提高效率。}}往往很多時候不得不用IsPostBack,因為有些控件初始化后,要保持它的狀態(tài).例如:DropDownList,如果每次都初始化,則用戶無論選擇其選項,都會被初始化為默認(rèn)值.(三).避免使用服務(wù)器控件1.一般的靜態(tài)顯示信息,盡量不要用服務(wù)端控件顯示.因為服務(wù)端控件需要回發(fā)服務(wù)端執(zhí)行,會降低程序執(zhí)行效率,一般用<DIV>顯示即可.如果用了服務(wù)端控件,將:runat="server"去掉,也會提高效率.2.禁用服務(wù)端控件的狀態(tài)視圖,有些控件不需要維護其狀態(tài),可以設(shè)置其屬性:EnableViewState=false;如果整個頁面控件都不需要維持狀態(tài)視圖,則可以設(shè)置整個頁面的狀態(tài)視力為false:代碼如下:<%@PageEnableViewState="false"%>3.在Web.Config文件中配置:ASP.NETSessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。下面是在Web.config中的設(shè)置的例子:<Sessionsstatetimeout="10"cookieless="false"mode="Inproc"/>(四).避免使用DataGrid大家都知道DataGrid功能強大。但是功能強大的同時,增加了性能上的開銷。一般用其它控件:DataList或Repeater控件能實現(xiàn)的,盡量不用DataGrid.(五).字符串操作1.避免裝箱操作.裝箱操作運行效率比較低.例如運行兩個代碼段:stringtest="";for(forinti=0;i<10000;i){test=testi;}和stringtest="";for(forinti=0;i<10000;i){test=testi.ToString();}下面的代碼段顯然效率要高.因為i是整型的,系統(tǒng)要先把i進行裝箱轉(zhuǎn)換為string型的,再進行連接.需要時間,讀者可以Copy到自己機器上測試一下.2.使用StringBulider類在進行字符串連接時:stringstr=str1str2;一般超過三項連接,最好用StringBuilder來代替String類.StringBuilder可以避免重新創(chuàng)建String對象造成的性能損失.一般用于組裝Sql語句時用到:StringBulider.讀者可以到自己機器上測試一下.(六).ADO.Net使用方面優(yōu)化1.數(shù)據(jù)庫連接打開和關(guān)閉。在需要連接時打開,當(dāng)訪問完數(shù)據(jù)庫要立刻關(guān)閉連接.舉例說明,還是看兩個代碼段:I.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);MyConnection.Open();//打開連接for(inti=0;i<1000;i)//for循環(huán)模擬取得數(shù)據(jù)前的商業(yè)邏輯操作{Thread.Sleep(1000);}myAdapter.Fill(ds);for(inti=0;i<1000;i)//for循環(huán)模擬取得數(shù)據(jù)后的商業(yè)邏輯操作{Thread.Sleep(1000);}MyConnection.Close();//關(guān)閉連接II.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);for(inti=0;i<1000;i)//for循環(huán)模擬取得數(shù)據(jù)前的商業(yè)邏輯操作{Thread.Sleep(1000);}MyConnection.Open();//打開連接myAdapter.Fill(ds);MyConnection.Close();//關(guān)閉連接for(inti=0;i<1000;i)////for循環(huán)模擬取得數(shù)據(jù)后的商業(yè)邏輯操作{Thread.Sleep(1000);}顯示II代碼比I代碼好的多,I中早早占著連接不放,如果用戶很多的話,容易出現(xiàn)連接池滿情況。嚴(yán)重時出現(xiàn)死機現(xiàn)象.2.數(shù)據(jù)庫查詢I.直接生成SQL語句。SqlServer每次都要對其進行編譯,在性能方面不會有很大的提高。另外也不夠安全。容易被攻擊.II.使用帶

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論