版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué)習(xí)單元5 使用linq技術(shù)操作數(shù)據(jù)庫(kù)在安裝vs2008的時(shí)候,宣傳廣告中不斷地顯示vs2008的新特性,其中重點(diǎn)就有l(wèi)inq。vs作為一個(gè)全球有影響力的開發(fā)軟件,自vs2008開始就把目光重點(diǎn)投給linq,這一定有它的地位和意義。在第三學(xué)習(xí)單元和第四學(xué)習(xí)單元的學(xué)習(xí)中我們掌握了用數(shù)據(jù)源控件和ado.net技術(shù)操作數(shù)據(jù)庫(kù),實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的編輯。雖然數(shù)據(jù)源控件以及傳統(tǒng)的ado.net提供了大量的讀取、查詢、檢索和編輯數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法,然而,有時(shí)這些方法顯得比較繁瑣。開發(fā)人員需要編程查詢或操作數(shù)據(jù)庫(kù)的每個(gè)步驟,如獲取連接字符串、創(chuàng)建數(shù)據(jù)庫(kù)的連接對(duì)象、打開數(shù)據(jù)的連接、執(zhí)行查詢或操作數(shù)據(jù)庫(kù)的命令等
2、。linq引入了標(biāo)準(zhǔn)的、易于學(xué)習(xí)的查詢和更新數(shù)據(jù)的模式,可以對(duì)其技術(shù)進(jìn)行擴(kuò)展以支持幾乎任何類型的數(shù)據(jù)存儲(chǔ),這使得它在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間建立了一座橋梁。圖5-1給出了linq框架的基本架構(gòu),linq主要由3部分組成:linq to ado.net 、linq to objects和linq to xml。其中l(wèi)inq to ado.net又分成為了兩個(gè)組成部分:linq to sql和linq to dataset。本學(xué)習(xí)單元將通過(guò)linq to sql來(lái)認(rèn)識(shí)linq技術(shù),其它組成部分讀者可以借助其它資料進(jìn)行學(xué)習(xí)。c#vb.net語(yǔ)言集成查詢(linq)linq to objectlinq
3、to xml支持linq的數(shù)據(jù)源linq to ado.net對(duì)象數(shù)據(jù)庫(kù)xmllinq to datasetlinq to sql圖5-1 linq基本架構(gòu)其它5.1 任務(wù)1:使用linq to sql操作數(shù)據(jù)庫(kù) 5.1.1 任務(wù)場(chǎng)景“588樂(lè)購(gòu)網(wǎng)”為了向廣大顧客更好地展示商品,決定在網(wǎng)站中添加商品展示板塊。同時(shí),為編輯這些商品信息則必須在網(wǎng)站的后臺(tái)添加數(shù)據(jù)處理的頁(yè)面。商品展示模塊的功能是通過(guò)圖文并茂的方式展示商品的品名、型號(hào)、參數(shù)和圖片等信息。如圖5-2所示的“588樂(lè)購(gòu)網(wǎng)”的首頁(yè),在頁(yè)面的左側(cè)顯示商品品牌導(dǎo)航條,右側(cè)則顯示最新上架商品的圖片縮略圖及其品名和價(jià)格,點(diǎn)擊商品的圖片,則按圖5-3
4、所示的界面顯示商品的詳細(xì)信息。圖5-2 網(wǎng)站首頁(yè)圖5-3 商品詳細(xì)信息頁(yè)面網(wǎng)站的后臺(tái)數(shù)據(jù)管理也是一個(gè)網(wǎng)站必不可少的內(nèi)容。在后臺(tái)數(shù)據(jù)管理頁(yè)面中可以進(jìn)行包括用戶信息、商品信息和訂單信息等等內(nèi)容的處理。如圖5-4商品信息添加模塊的頁(yè)面。圖5-4 添加手機(jī)頁(yè)面5.1.2 學(xué)習(xí)引導(dǎo)在.net framework 3.5的眾多新特性中,linq to sql是最重要的一個(gè),它的出現(xiàn)意味著自sql誕生以來(lái),應(yīng)用程序與數(shù)據(jù)庫(kù)的結(jié)合方式上最重要的一次變革。開發(fā)人員可以使用linq to sql對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行查詢、更新、插入和刪除等操作。目前,可以對(duì)microsoft sql server 2000/200
5、5(包括使用express版)使用linq to sql。其他數(shù)據(jù)庫(kù),如oracle、db2和access等,目前還沒(méi)有得到支持,但也許將來(lái)會(huì)得到支持。linq to sql最重要的就是為關(guān)系數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)對(duì)象模型,然后將該對(duì)象模型映射到sql server數(shù)據(jù)庫(kù)中的相應(yīng)的對(duì)象(如表、列、存儲(chǔ)過(guò)程等)。例如,如果linq to sql映射到數(shù)據(jù)庫(kù)中的表,則這些linq to sql類稱為“實(shí)體類”。該類中的屬性分別映射到數(shù)據(jù)庫(kù)中的相應(yīng)的列。 在理解了映射關(guān)系的基礎(chǔ)上,接下來(lái)就是如何實(shí)現(xiàn)這種映射關(guān)系。這里必不可少的就是掌握l(shuí)inq查詢語(yǔ)句,它實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的查詢和修改。當(dāng)然,被查詢的數(shù)據(jù)也可
6、以是xml(linq to xml)和對(duì)象(linq to objects)。5.1.3相關(guān)知識(shí)與技術(shù)一 linq查詢表達(dá)式語(yǔ)法基礎(chǔ)c# 3.0在c# 1.0和 c# 2.0的基礎(chǔ)上引入了新的語(yǔ)言機(jī)制,如隱型局部變量、對(duì)象初始化程序、查詢表達(dá)式和lambda表達(dá)式等。這些新的機(jī)制為linq提供了語(yǔ)法支持。接下來(lái),我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)理解linq查詢表達(dá)式語(yǔ)法。盡管linq不僅可用來(lái)訪問(wèn)關(guān)系數(shù)據(jù)庫(kù),而且也能訪問(wèn)數(shù)據(jù)集或xml等數(shù)據(jù)類型,但這里為了理解linq查詢表達(dá)式,我們用一個(gè)sql語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù)來(lái)比較說(shuō)明。下面的sql語(yǔ)句是基于northwind數(shù)據(jù)庫(kù)用來(lái)查詢沒(méi)有住在berlin的顧客的
7、名單:select c.companyname, c.contactname, c.cityfrom customers cwhere c.city != 'berlin'order by c.contactname現(xiàn)在來(lái)看看用linq表達(dá)式做同樣的事情,解剖并理解清除其中的細(xì)節(jié),有兩種查詢語(yǔ)法:查詢表達(dá)式和方法查詢。目前,暫時(shí)先考慮查詢表達(dá)式,下面的查詢表達(dá)式將從getcustomers()返回的ienumerable類型結(jié)果,找出那些沒(méi)有居住在berlin的顧客。var customernotinberlin = from c in getcustomers() where
8、 c.city != "berlin" orderby c.contactname select c;表5-1概述了linq一些常用的表達(dá)式:表5-1 linq查詢表達(dá)式子句列表操作符意義var <變量> =使用類型推理來(lái)賦值from <項(xiàng)目> in <數(shù)據(jù)源>從一個(gè)<數(shù)據(jù)源>中取出一個(gè)子集作為一個(gè)<項(xiàng)目> where 從數(shù)據(jù)源中取出一個(gè)子集的約束條件 select 指定查詢結(jié)果的類型和表現(xiàn)形式. group對(duì)查詢結(jié)果進(jìn)行分組join 選擇多個(gè)數(shù)據(jù)源進(jìn)行關(guān)聯(lián)查詢orderby, ascending, descend
9、ing 對(duì)查詢結(jié)果進(jìn)行排序,可以是“升序”、“降序”linq查詢表達(dá)式必須以from子句開頭,并且必須以select 或group子句結(jié)束。在第一個(gè)from子句和最后一個(gè)select或group子句之間,查詢表達(dá)式可以包含一個(gè)或多個(gè)where、orderby、group、join,甚至from子句。1. from、where和select查詢子句linq查詢表達(dá)式必須包含from子句,而且要以from子句開頭,嵌套查詢其子查詢表達(dá)式也必須以from開頭。from子句指定查詢操作的數(shù)據(jù)源和范圍變量。where子句指定篩選元素的邏輯條件,一個(gè)查詢表達(dá)式可以不包含where子句,也可以包含1個(gè)或多個(gè)
10、where子句。select子句指定了查詢結(jié)果的類型和表現(xiàn)形式。linq查詢表達(dá)式要么以select子句結(jié)束,要么以group子句結(jié)束。下面的實(shí)例說(shuō)明了一個(gè)簡(jiǎn)單的查詢操作。代碼使用getmobiles( )方法獲得mobile表的內(nèi)容。之后,使用一個(gè)linq查詢表達(dá)式(利用了from、where和select關(guān)鍵字)獲得where篩選后的數(shù)據(jù)集作為gridview1的數(shù)據(jù)源。private void showdata ( ) var mobiles = getmobiles(); var query=from m in mobiles where m.mbid<5 select quer
11、y gridview1.datasource= query; gridview1.databind(); 注意,from子句指定的數(shù)據(jù)源的類型必須是ienumerable(可枚舉)、ienumerable<t>或前兩者的派生類型。在下面的例子中,我們不是簡(jiǎn)單的選擇query,而是明確定義字段的名稱,定義一個(gè)新的投射,指定在結(jié)果集中的對(duì)象。例如,要給mbid和mbname指定更明確的名稱,以完整地描述他們的內(nèi)容。private void showdata ( ) var mobiles = getmobiles(); var query=from m in mobiles selec
12、t new mobileid = m.mbid , mobilename = m.mbname; gridview1.datasource= query; gridview1.databind(); 2. group子句group子句對(duì)查詢結(jié)果進(jìn)行分組,并返回元素類型為igrouping<tkey,telement>的對(duì)象序列。下面的例子中,使用group關(guān)鍵字按類型組合mobile類別數(shù)據(jù),關(guān)鍵字into提供了一個(gè)臨時(shí)標(biāo)識(shí)符,充當(dāng)group子句的結(jié)果的引用。另外,因?yàn)間roup操作不會(huì)導(dǎo)致任何結(jié)果,所以查詢?nèi)允褂们懊嬗懻摰募夹g(shù)創(chuàng)建一個(gè)定制的查詢投射。private void sh
13、owdata ( ) var mobiles = getmobiles (); var query = from m in mobiles group m by m.mbtypeid into g select new手機(jī)類型標(biāo)記=g.key, 數(shù)量=g.count() ; gridview1.datasource= query; gridview1.databind(); 3. orderby 子句orderby 子句可以多查詢結(jié)果進(jìn)行排序。排序的方式可以是“升序”或“降序”,默認(rèn)的排序方式為“升序”。private void showdata ( ) var mobiles = getmo
14、biles(); var query = from m in mobiles orderby m.mbid descending select new 手機(jī)標(biāo)記= m.mbid , 手機(jī)名稱 = m.mbname; gridview1.datasource= query; gridview1.databind(); 二 通過(guò)linq插入、更新和刪除數(shù)據(jù)linq to sql最重要的功能就是查詢和操作sql server數(shù)據(jù)庫(kù)中的數(shù)據(jù)。通過(guò)它可以很容易的查詢sql server數(shù)據(jù)庫(kù)中的數(shù)據(jù),而且也可以通過(guò)insertonsubmit()、deleteonsubmit()等方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的插入
15、數(shù)據(jù)和刪除數(shù)據(jù)等操作。1. 創(chuàng)建linq to sql實(shí)體在visual studio中包含了一個(gè)基本的object relation映射器,它可以快速地為sql server數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)對(duì)象模型,并將這些對(duì)象模型映射到sql server數(shù)據(jù)庫(kù)中相應(yīng)的對(duì)象(如表、列、存儲(chǔ)過(guò)程和函數(shù)等)。sql server數(shù)據(jù)庫(kù)中的表被映射為linq to sql類,我們稱為“實(shí)體類”;數(shù)據(jù)庫(kù)中的列被映射為實(shí)體類中的屬性或字段;存儲(chǔ)過(guò)程或函數(shù)被映射為實(shí)體類中的方法。linq to sql對(duì)象模型和sql server數(shù)據(jù)中的對(duì)象的映射關(guān)系如表5-2所示。表5-2 不同數(shù)據(jù)提供程序?qū)?yīng)的ado.net對(duì)象l
16、inq to sql對(duì)象模型的基本元素sql server數(shù)據(jù)庫(kù)中的對(duì)象實(shí)體類表屬性(或字段)列關(guān)聯(lián)外鍵關(guān)系方法存儲(chǔ)過(guò)程或函數(shù)實(shí)體是描述數(shù)據(jù)庫(kù)表(或視圖)的類,通過(guò)它可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,接下來(lái)我們來(lái)學(xué)習(xí)如何通過(guò)visual studio 2008的object relational designer創(chuàng)建實(shí)體類。(1)創(chuàng)建dbml文件在【解決方案資源管理器】中右擊解決方案名稱,然后選擇【添加新項(xiàng)】命令,如圖5-5所示:圖5-5 添加新項(xiàng)在彈出的【添加新項(xiàng)】對(duì)話框中選擇【linq to sql類】選項(xiàng),并在【名稱】對(duì)話框中輸入類文件名,如圖5-6所示:圖5-6 添加實(shí)體類dataclasses
17、.dbml左擊【添加】按鈕后,會(huì)出現(xiàn)如圖5-7的對(duì)話框,選擇【是】按鈕,將linq to sql類放在app_code文件中:圖5-7 是否將實(shí)體類添加入app_code文件夾對(duì)話框選擇【是】后,將在app_code文件夾中生成一個(gè)dataclasses.dbml文件,并在ide視圖窗口中打開了這個(gè)文件。如圖5-8所示,i區(qū)是用來(lái)創(chuàng)建實(shí)體類的,ii區(qū)是用來(lái)創(chuàng)建方法的。圖5-8 實(shí)體類的ide視圖窗口(2)創(chuàng)建“數(shù)據(jù)上下文類”具體操作為:在【服務(wù)器資源管理器】面板中選擇database數(shù)據(jù)庫(kù)中的mbtype表,然后將其拖放到圖5-8的【i】區(qū)視圖面板中,如圖5-9。保存dataclasses.d
18、bml文件后,該文件將為mbtype表創(chuàng)建一個(gè)名為mbtype的類。類的內(nèi)容保存在dataclasses.designer.cs代碼窗口中,如圖5-10。而以后沒(méi)改變一次dbml文件中的內(nèi)容,必須在重新保存一次.dbml文件,這時(shí)dataclasses.designer.cs中的內(nèi)容也將更新。圖5-9 拖放數(shù)據(jù)庫(kù)表進(jìn)對(duì)象關(guān)系設(shè)計(jì)器示意圖圖5-10 數(shù)據(jù)上下文類的代碼窗口(3)創(chuàng)建數(shù)據(jù)庫(kù)的數(shù)據(jù)上下文方法如果開發(fā)人員需要使用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程或函數(shù),則需要把存儲(chǔ)過(guò)程或函數(shù)也添加到dataclasses.dbml文件中。具體操作為:在【服務(wù)器資源管理器】面板中選擇數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程或函數(shù),并將它們拖
19、放到dataclasses.dbml文件的視圖面板圖5-8【ii】區(qū)中。保存dataclasses.dbml文件之后,該文件將為每一個(gè)存儲(chǔ)過(guò)程和函數(shù)創(chuàng)建一個(gè)相應(yīng)的方法。2. 查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)使用linq to sql可以輕松查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),下面我們通過(guò)linq to sql來(lái)查詢database數(shù)據(jù)庫(kù)中的mbtype表中的數(shù)據(jù),并通過(guò)repeater控件顯示在頁(yè)面中。具體步驟如下:(1) 創(chuàng)建dataclassesdatacontext類的實(shí)例db。(2) 使用linq查詢表達(dá)式查詢mbtype表中的數(shù)據(jù),并將查詢的結(jié)果保存為result變量。(3) 把result變量作為repeate
20、r控件rptdata的數(shù)據(jù)源,并綁定該控件的數(shù)據(jù)來(lái)顯示查詢的結(jié)果。private void showdata() /創(chuàng)建database數(shù)據(jù)庫(kù)的上下文實(shí)例。 dataclassesdatacontext db = new dataclassesdatacontext(configurationmanager.connectionstrings"mg_mobileconnectionstring".connectionstring); var result = from p in db.mbtype select p; rptdata.datasource = result;
21、 rptdata.databind(); 3. 修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)具體步驟如下:(1) 使用linq查尋查找被修改的記錄。(2) 賦予記錄新的值。(3) 調(diào)用submitchanges()方法將上述修改提交到數(shù)據(jù)庫(kù),并完成修改操作。private void updatedatawithlinq() /創(chuàng)建linqdb數(shù)據(jù)庫(kù)的數(shù)據(jù)上下文的實(shí)例 tempdatacontext db = new tempdatacontext( );/查詢被修改的數(shù)據(jù)var result = from r in db.mobile where r.mbid = 2 select r;/修改數(shù)據(jù)foreach (mo
22、bile r in result) r.mbname = "123"/將修改操作提交到數(shù)據(jù)庫(kù)中db.submitchanges();4. 插入數(shù)據(jù)創(chuàng)建了datacontext類對(duì)象之后,就能夠使用datacontext的方法進(jìn)行數(shù)據(jù)插入、更新和刪除操作。相比ado.net,使用datacontext對(duì)象進(jìn)行數(shù)據(jù)庫(kù)操作更加方便和簡(jiǎn)單。使用linq to sql類進(jìn)行數(shù)據(jù)插入的操作步驟如下。(1) 創(chuàng)建dataclassesdatacontext類的實(shí)例db。(2) 聲明實(shí)體類對(duì)象info,并設(shè)置其相應(yīng)的屬性值,為實(shí)體屬性賦值。(3) 調(diào)用insertonsubmit()方法將
23、實(shí)體類對(duì)象info添加到db實(shí)例的mobile表中。(4) 調(diào)用submitchanges()方法將實(shí)體類中的數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)修改數(shù)據(jù)的功能。private void adddatawithlinq() /創(chuàng)建linqdb數(shù)據(jù)庫(kù)的數(shù)據(jù)上下文的實(shí)例 tempdatacontext db = new tempdatacontext( ); mobile mb = new mobile();/ 創(chuàng)建一個(gè)實(shí)體 mb.mbname = “apple”;db.mobile.insertonsubmit( mb ); / 添加到數(shù)據(jù)庫(kù)中db.submitchanges();/將修改操作提交到數(shù)據(jù)庫(kù)中
24、5. 刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)使用linq能夠快速的刪除行,刪除行的基本步驟如下:(1) 創(chuàng)建dataclassesdatacontext類的實(shí)例db。(2) 使用linq查詢將要?jiǎng)h除的數(shù)據(jù),將查詢結(jié)果保存到result變量中。(3) 使用deleteallonsubmit()方法刪除result變量中的所有記錄。(4) 調(diào)用submitchanges()方法將實(shí)體類中的數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)修改數(shù)據(jù)的功能。private void deletedatawithlinq() /創(chuàng)建linqdb數(shù)據(jù)庫(kù)的數(shù)據(jù)上下文的實(shí)例 tempdatacontext db = new tempdatacontext
25、( ); / 查詢被刪除的數(shù)據(jù) var result = from r in db.mobile where r.mbid=2 select r; / 刪除數(shù)據(jù),并提交到數(shù)據(jù)庫(kù)中 db.mobile. deleteallonsubmit ( result );/將修改操作提交到數(shù)據(jù)庫(kù)中db.submitchanges();5.1.4任務(wù)的設(shè)計(jì)與實(shí)現(xiàn)一 相關(guān)數(shù)據(jù)庫(kù)設(shè)置與定義根據(jù)任務(wù)場(chǎng)景,該功能模塊可設(shè)置保存商品信息的數(shù)據(jù)表mobile和保存商品品牌的數(shù)據(jù)表mbtype,所在的數(shù)據(jù)庫(kù)文件為database.mdf。mbtype和mobile數(shù)據(jù)表定義分別如表5-3和表5-4所示。表5-3 mbty
26、pe數(shù)據(jù)表定義字段名數(shù)據(jù)定義允許為空字段描述typeidint否類別編號(hào),主鍵mbtypenamenvarchar(50)否類別名稱mbtypepicnvarchar(50)否類別圖片存放路徑表5-4 mobile數(shù)據(jù)表表定義字段名數(shù)據(jù)定義允許為空字段描述mbidint否商品編號(hào),自動(dòng)編號(hào),主鍵mbnamenvarchar(50)否商品名稱mbtypeidint否類別編號(hào)pricemoney否商品價(jià)格picturenvarchar(50)否商品圖片addedtimedatetime否商品上架時(shí)間stockint否商品庫(kù)存二 功能的設(shè)計(jì)與實(shí)現(xiàn)1.設(shè)計(jì)前準(zhǔn)備在vs2008中新建網(wǎng)站,并在站點(diǎn)app
27、_data目錄下創(chuàng)建數(shù)據(jù)庫(kù)database.mdf,同時(shí)在該數(shù)據(jù)庫(kù)中創(chuàng)建如表5-3和表5-4所示的數(shù)據(jù)表。2.任務(wù)的功能設(shè)計(jì)根據(jù)學(xué)習(xí)任務(wù)學(xué)習(xí)場(chǎng)景描述,主要包含三個(gè)頁(yè)面:網(wǎng)站首頁(yè)、商品詳細(xì)信息頁(yè)面和網(wǎng)站后臺(tái)商品添加頁(yè)面。(1) 網(wǎng)站首頁(yè):將網(wǎng)站的首頁(yè)分成上中下的結(jié)構(gòu),最新上架商品的信息放在中間區(qū)域。(2) 商品詳細(xì)信息頁(yè)面:每一款商品詳細(xì)信息展示包含:一張商品圖片、商品名稱、商品編號(hào)、商品價(jià)格,并在該頁(yè)面中添加購(gòu)買按鈕和購(gòu)買數(shù)量。(3) 商品添加頁(yè)面:該頁(yè)面主用用來(lái)提交一款商品的信息。在提交信息之前能夠預(yù)覽該商品的縮略圖。3.任務(wù)的功能實(shí)現(xiàn)(1) 首頁(yè)模板頁(yè)頁(yè)面布局設(shè)計(jì)為使網(wǎng)站有一個(gè)統(tǒng)一的風(fēng)格,
28、在網(wǎng)站根目錄下按上、中、下的網(wǎng)頁(yè)布局創(chuàng)建一個(gè)模板頁(yè)masterpage.master,模板頁(yè)布局如圖5-11所示。圖5-11 首頁(yè)模板頁(yè)布局模板頁(yè)的頁(yè)頭區(qū)域包含了頁(yè)面標(biāo)題、網(wǎng)站logo、登錄區(qū)、搜索區(qū)等;頁(yè)腳區(qū)域包含了一些擴(kuò)展鏈接。模板頁(yè)的左半部分為商品品牌導(dǎo)航區(qū)域,它采用商品品牌的縮略圖來(lái)作導(dǎo)航按鈕。這里用一個(gè)名為dlisttype的datalist控件來(lái)顯示這些商品品牌數(shù)據(jù),編輯dlisttype控件模板,在其中放置一個(gè)名為ibttype的imagebutton控件和一個(gè)名為lbtypeid的label控件。顯示商品品牌導(dǎo)航的datalist控件及其子控件相關(guān)屬性設(shè)置如表5-5所示。表5-
29、5 顯示商品品牌導(dǎo)航的datalist控件及其子控件相關(guān)屬性設(shè)置dlisttypedatalist控件,綁定到mbtype數(shù)據(jù)表,以便其itemtemplate視圖子控件ibttype顯示商品品牌縮略圖,子控件lbtypeid綁定品牌id。子控件功能屬性綁定表達(dá)式續(xù)表5-5iimagebtntypeimagebutton控件,用于顯示商品縮略圖導(dǎo)航按鈕,通過(guò)查詢字符串將當(dāng)前商品品牌的mbtypeid傳遞到目標(biāo)頁(yè)面productlist.aspximageurleval("mbtypepic")commandnameimagebuttonlbtypeidlabel控件,主要用
30、于獲取商品品牌的id,可作為按類別顯示手機(jī)信息時(shí)的條件。texteval("typeid")visiblefalse導(dǎo)航實(shí)現(xiàn)獲取數(shù)據(jù)庫(kù)中mbtype表作為控件dlisttype的數(shù)據(jù)源。這需要在網(wǎng)站中新建一個(gè)linq to sql實(shí)體類dataclasses.dbml,并將mbtype表拖進(jìn)ide窗口后保存該dbml文件。給dlisttype控件指定數(shù)據(jù)源。在masterpage.master.cs文件中添加獲取數(shù)據(jù)源的方法showlefttype()。public void showlefttype() dataclassesdatacontext dc = new da
31、taclassesdatacontext(); var results = from t in dc.mbtype select t; dlisttype.datasource = results; dlisttype.databind(); (2) 網(wǎng)站首頁(yè)網(wǎng)站首頁(yè)應(yīng)直觀地給顧客以網(wǎng)上商品琳瑯滿目的感覺(jué)以及瀏覽方便。還應(yīng)讓顧客知道網(wǎng)站最新的信息,特色的商品信息推薦。因此,在本學(xué)習(xí)任務(wù)中,我們?cè)O(shè)計(jì)了在網(wǎng)站的首頁(yè)中顯示最新上架的商品信息,這些信息通過(guò)圖文并茂的方式來(lái)展現(xiàn)。最新上架信息顯示設(shè)計(jì)最新上架商品信息的顯示也借助datalist控件來(lái)顯示。在網(wǎng)站首頁(yè)default.aspx(屬于模板頁(yè)ma
32、sterpage.master的內(nèi)容頁(yè))中添加名為dlistlatest的datalist控件。編輯dlistlatest模板,在itemtemplate模板中添加能顯示每一款商品縮略圖、商品名和價(jià)格等信息的控件。商品縮略圖設(shè)計(jì)成一個(gè)名為imagebtn的imagebutton控件,它可以作為顯示商品詳細(xì)信息的頁(yè)面導(dǎo)航按鈕;商品名和價(jià)格分別用名為lbname和lbprice的label控件來(lái)顯示。itemtemplate模板的布局如圖5-12所示圖5-12 商品展示模板布局顯示最新上架商品信息的datalist控件及其子控件相關(guān)屬性設(shè)置如表5-6所示。表5-6 顯示最新上架商品信息datali
33、st控件及其子控件相關(guān)屬性設(shè)置dlistlatestdatalist控件,綁定到mobile數(shù)據(jù)表,以便其itemtemplate視圖子控件imagebtn顯示商品縮略圖,子控件lbname綁定商品名,子控件lbprice綁定商品價(jià)格。子控件功能屬性綁定表達(dá)式imagebtnimagebutton控件,用于顯示商品縮略圖導(dǎo)航按鈕,通過(guò)查詢字符串將當(dāng)前商品品牌的mbtypeid傳遞到目標(biāo)頁(yè)面productlist.aspximageurleval("picture")postbackurleval("mbid","/mobiledetails.a
34、spx?mbid=0")lbnamelabel控件,用于顯示商品名。texteval("mbname")lbpricelabel控件,用于顯示商品價(jià)格。texteval("price","0:c")數(shù)據(jù)顯示將mobile表拖入linq to sql實(shí)體類dataclasses.dbml的ide窗口并保存。在default.aspx.cs文件中添加顯示最新上架信息的方法showlatest(),public void showlatest() dataclassesdatacontext dc = new dataclasse
35、sdatacontext(); var results = from m in dc.mobile orderby m.addedtime descending select m; var query = results.take(8); / 取返回結(jié)果的前8條記錄 dlistlatest.datasource = query; dlistlatest.databind(); (3) 商品詳細(xì)信息頁(yè)面當(dāng)單擊首頁(yè)中的商品縮略圖時(shí),將打開一個(gè)商品詳細(xì)信息頁(yè)面mobiledetails.aspx用來(lái)顯示商品的更詳細(xì)信息。商品詳細(xì)信息頁(yè)面也是masterpage.page的內(nèi)容頁(yè),在該頁(yè)面中用名為dl
36、istdetails的datalist控件來(lái)顯示商品的詳細(xì)信息。編輯dlistdetails模板,在itemtemplate模板中添加能顯示每一款商品詳細(xì)信息的子控件。商品縮略圖設(shè)計(jì)成一個(gè)名為immb的image控件;商品名、價(jià)格和庫(kù)存信息分別用名為lbname、lbprice和lbstock的label控件來(lái)顯示。另外,在本頁(yè)面中還添加了名為quantity的textbox控件作為用戶購(gòu)買數(shù)量的輸入框,以及一個(gè)名為ibtnbuy的imagebutton控件的購(gòu)買按鈕,用來(lái)將商品添加入購(gòu)物車。itemtemplate模板的布局如圖5-13所示圖5-13 商品詳細(xì)信息模板布局示意圖顯示商品詳細(xì)信
37、息的datalist控件及其子控件相關(guān)屬性設(shè)置如表5-7所示。表5-7 顯示最新上架商品信息datalist控件及其子控件相關(guān)屬性設(shè)置dlistdetailsdatalist控件,綁定到mobile數(shù)據(jù)表。子控件功能屬性綁定表達(dá)式lbnamelabel控件,用于顯示商品名稱texteval("mbname")lbidlabel控件,用于顯示商品編號(hào)。texteval("mbid")lbpricelabel控件,用于顯示商品價(jià)格。texteval("price","0:c")lbstocklabel控件,用于顯示商品
38、庫(kù)存。texteval("stock")quantitytextbox控件,用戶輸入用戶購(gòu)買數(shù)量ibtnbuyimagebutton控件,添加商品進(jìn)購(gòu)物車的觸發(fā)按鈕commandnamebuy當(dāng)單擊添加到購(gòu)物車按鈕時(shí),觸發(fā)dlistdetails控件itemcommand事件dlistdetails_itemcommand,方法如下:protected void dlistdetails_itemcommand(object source, datalistcommandeventargs e) if (e.commandname = "buy") /
39、判斷用戶是否登錄,如果已登錄則跳轉(zhuǎn)至購(gòu)物車頁(yè)面,/ 若未登錄則跳轉(zhuǎn)至用戶登錄頁(yè)面。 通過(guò)設(shè)置dlistdetails控件中的子控件的commandname屬性,可以用來(lái)判斷用戶觸發(fā)了哪個(gè)子控件的事件,進(jìn)而執(zhí)行該事件。購(gòu)物車的實(shí)現(xiàn)在本學(xué)習(xí)單元中并不體現(xiàn),讀者可根據(jù)學(xué)習(xí)需要查閱相關(guān)材料。(4) 新增商品信息頁(yè)面新增手機(jī)頁(yè)面用一個(gè)table來(lái)布局。table中包含的控件屬性設(shè)置如表5-8所示。表5-8 新增手機(jī)頁(yè)面相關(guān)控件屬性設(shè)置控件功能屬性/事件值tbnametextbox控件,用于輸入手機(jī)名稱ddltypedropdownlist控件,作為手機(jī)品牌的輸入功能。tbpricetextbox控件,用
40、于輸入手機(jī)價(jià)格fileuploadfileupload控件,用于上傳手機(jī)圖片onchangepreviewimage()picimage控件,該控件為html控件,用來(lái)顯示圖片預(yù)覽圖。tbstocktextbox控件,用于輸入手機(jī)庫(kù)存commandnamebuyrevpriceregularexpressionvalidator控件,驗(yàn)證用戶輸入價(jià)格格式controltovalidatetbpriceerrormessage(請(qǐng)輸入一個(gè)小數(shù)位為2的正實(shí)數(shù))validationexpression0-9+(.0-92)?$revstockregularexpressionvalidator控件,
41、驗(yàn)證用戶輸入庫(kù)存格式controltovalidatetbstockerrormessage(請(qǐng)輸入一個(gè)非負(fù)整數(shù))validationexpressiond+$ibtnaddiimagebutton控件,觸發(fā)手機(jī)數(shù)據(jù)插入事件clickibtnadd_click()添加手機(jī)信息,手機(jī)圖片的處理分為兩個(gè)步驟完成:將手機(jī)圖片上傳至服務(wù)器存放圖片的文件夾images中,同時(shí)將存放該手機(jī)圖片的相對(duì)路徑和圖片文件名提交服務(wù)器保存,這兩個(gè)過(guò)程在名為ibtnadd的imagebutton控件click事件中完成,代碼如下:protected void ibtnadd_click(object sender,
42、imageclickeventargs e) dataclassesdatacontext dc = new dataclassesdatacontext(); mobile mb = new mobile(); mb.mbname = tbname.text; var value = from u in dc.mbtype where u.mbtypename = ddltype.selecteditem.tostring() select u; foreach (mbtype u in value) mb.mbtypeid = u.typeid; mb.addedtime = dateti
43、me.now; mb.price = convert.todecimal(tbprice.text); mb.stock = int.parse(tbstock.text.trim(); /獲取手機(jī)圖片相對(duì)路徑及文件名 mb.picture = "/images/mobile/" + fileupload.filename; /將手機(jī)圖片保存至網(wǎng)站服務(wù)器中的相關(guān)位置 fileupload.saveas(server.mappath("/images/mobile/" + fileupload.filename); dc.mobile.insertonsu
44、bmit(mb); dc.submitchanges(); 在手機(jī)添加頁(yè)面中增加一個(gè)預(yù)覽手機(jī)圖片的功能,該功能只需要在客戶端處理,因此圖片預(yù)覽的處理的方法是在頁(yè)面中增加一段<script>代碼,如下所示:<script type="text/javascript" language="javascript"> /如果用戶選擇了圖片,則顯示圖片的預(yù)覽效果 function previewimage() var x = document.getelementbyid("<%=fileupload.clientid%&g
45、t;")var y = document.getelementbyid("pic"); if(!x | !x.value | !y)/如果沒(méi)有選擇上傳文件 return; var patn = /.jpg$|.jpeg$|.gif$/i; if(patn.test(x.value)/如果上傳文件的后綴是.jpg或.jpeg或.gif y.src = 'file:/localhost/' + x.value; y.style.display="block" else alert("您選擇的似乎不是圖像文件。")
46、; </script>至此,本學(xué)習(xí)任務(wù)描述的功能需求實(shí)現(xiàn)基本完成。5.2 任務(wù)2:使用linqdatasource控件操作數(shù)據(jù)庫(kù)5.2.1 任務(wù)場(chǎng)景在網(wǎng)站的首頁(yè)中給出了手機(jī)品牌縮略圖,當(dāng)顧客單擊該縮略圖時(shí)將顯示網(wǎng)站中隸屬于該品牌的所有商品信息,如圖5-14所示:圖5-14 按品牌顯示商品信息頁(yè)5.2.2 學(xué)習(xí)引導(dǎo)在asp.net 3.5中,提供了一個(gè)全面支持linq的數(shù)據(jù)源控件,通過(guò)使用 linqdatasource 控件,無(wú)需編寫 select、update、insert 或 delete 語(yǔ)句即可執(zhí)行對(duì)數(shù)據(jù)庫(kù)的操作。接下來(lái),我們將介紹如何使用linqdatasource控件及其
47、在設(shè)計(jì)期間的配置選項(xiàng)。在使用linqdatasource控件操作數(shù)據(jù)庫(kù)時(shí),我們按下面的步驟來(lái)完成:1. 創(chuàng)建數(shù)據(jù)庫(kù)表和數(shù)據(jù)表。注意:在創(chuàng)建數(shù)據(jù)表時(shí)一定要給該表設(shè)置主鍵。2. 創(chuàng)建表示數(shù)據(jù)庫(kù)實(shí)體的類。也即創(chuàng)建一個(gè)dbml文件。3. 創(chuàng)建和配置 linqdatasource 控件4. 添加顯示數(shù)據(jù)的控件5. 配置linqdatasource,使用戶能夠更新、插入和刪除數(shù)據(jù)5.2.3相關(guān)知識(shí)與技術(shù)和其他數(shù)據(jù)源控件一樣,linqdatasource控件也是通過(guò)設(shè)置該控件的屬性轉(zhuǎn)換為可以再目標(biāo)數(shù)據(jù)對(duì)象上操作的查詢,也就是轉(zhuǎn)換為有效地linq查詢。把該控件拖放到visual studio的設(shè)計(jì)界面上,然后
48、選【擇配置數(shù)據(jù)源】就可以使用智能標(biāo)記配置控件了。圖5-15顯示了配置向?qū)У某跏柬?yè)面。圖5-15 配置linqdatasource初始頁(yè)面在這個(gè)頁(yè)面中,我們可以選擇要做數(shù)據(jù)源的上下文對(duì)象。默認(rèn)情況下,向?qū)э@示由linq to sql創(chuàng)建的數(shù)據(jù)上下文類。也允許選擇其他上下文對(duì)象。選擇上下文對(duì)象后,可以選擇上下文對(duì)象中的指定表或?qū)傩?,以返回要綁定的?shù)據(jù)。如圖5-16,【表】項(xiàng)的下拉列表包含了改上下文對(duì)象中的所有數(shù)據(jù)表。選擇相應(yīng)的表后單擊【完成】按鈕,完成向?qū)?。程序清單列出了linqdatasource配置向?qū)傻臉?biāo)記。圖5-16指定linqdatasource數(shù)據(jù)來(lái)源表頁(yè)面<asp:linq
49、datasource id="linqdatasource1" runat="server" contexttypename="tempdatacontext" tablename="mobile"></asp:linqdatasource>當(dāng)然,在圖5-17中,配置向?qū)н€可以通過(guò)設(shè)置【select(s)】項(xiàng)來(lái)返回相應(yīng)字段的結(jié)果集。接下來(lái),linqdatasource就可以作為數(shù)據(jù)源綁定到數(shù)據(jù)控件(如gridview或datalist等)中上了。另外,設(shè)置完數(shù)據(jù)源后,我們還可以通過(guò)linqdata
50、source控件的屬性窗口(設(shè)置enableinsert、enableupdate和enabledelete屬性值為false或true)或者下圖來(lái)設(shè)置該控件是否可以執(zhí)行插入、更新和刪除操作。這個(gè)設(shè)置將可以讓我們無(wú)需編寫任何刪除、插入和更新的代碼就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。圖5-17 配置是否啟用刪除、插入和更新頁(yè)面1. 查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)在linqdatasource控件中,我們可以通過(guò)where和orderby來(lái)指定不同的查詢參數(shù)。單擊圖 中的【where(w)】或【orderby】按鈕來(lái)設(shè)置。(1)定義where子句where參數(shù)使用和其他數(shù)據(jù)源控件一樣的parameters語(yǔ)法創(chuàng)建的,它
51、可以使用各種運(yùn)行期間產(chǎn)生的數(shù)據(jù)源提供數(shù)據(jù)。如:form字段、querystring和session等等??梢酝ㄟ^(guò)圖5-18來(lái)設(shè)置。圖5-18配置where表達(dá)式頁(yè)面(2)定義orderby子句通過(guò)圖5-19,可以定義orderby子句,向?qū)J(rèn)生成以逗號(hào)隔開的字段列表的orderby屬性值。圖5-19 配置orderby頁(yè)面5.2.4任務(wù)的設(shè)計(jì)與實(shí)現(xiàn)在網(wǎng)站的根目錄下新建一個(gè)以masterpage.master為模板頁(yè)的名為mobilebytype.aspx的內(nèi)容頁(yè),用來(lái)顯示按品牌展示的商品信息頁(yè)面。在該頁(yè)面中首先顯示該品牌文本信息,這通過(guò)一個(gè)名為lbname的label控件來(lái)顯示,它的值在頁(yè)面
52、page_load時(shí)加載;采用名為dlistmobilebytype的datalist控件作為數(shù)據(jù)顯示控件,該控件的數(shù)據(jù)源來(lái)自名為ldsmobile的linqdatasource控件。1. 給模板頁(yè)中顯示商品品牌的dlisttype控件添加itemcommand事件dlisttype_itemcommand:protected void dlisttype_itemcommand(object source, datalistcommandeventargs e) if (e.commandname = "imagebutton") label lb = e.item.findcontrol("lbtypeid") as label; response.redirect("mobilebytype.aspx?mbtypeid=" + lb.text); 2. lbname控件的值由以下方法獲得:private void showtypename() int id = int.parse(request.querystring"mbtypeid"); dataclassesdatacontext dc = new dataclassesdatacontext
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)防火災(zāi)安全教育
- 員工激勵(lì)培訓(xùn)
- 2024年限定版家紡購(gòu)銷協(xié)議細(xì)則版B版
- 全國(guó)浙教版初中信息技術(shù)八年級(jí)下冊(cè)第二單元第6課《語(yǔ)音合成技術(shù)》說(shuō)課稿
- 2024版水果購(gòu)銷合同書
- 汕頭市SCRATCH圖形化編程課 5.外敵入侵說(shuō)課稿
- 第21課《小圣施威降大圣》說(shuō)課稿 2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)001
- 2024版員工購(gòu)房借款合同
- 高中信息技術(shù)選修3說(shuō)課稿-2.2.2 IP地址的格式與分類-粵教版
- 2025年浙教新版選擇性必修3歷史上冊(cè)階段測(cè)試試卷
- 幼兒心理健康的教育課件
- 冷凍設(shè)備租賃合同
- DB43T 1167-2016 高純(SiO ≥99.997%)石英砂 規(guī)范
- 《環(huán)境保護(hù)產(chǎn)品技術(shù)要求 工業(yè)廢氣吸附凈化裝置》HJT 386-2007
- 化工過(guò)程安全管理導(dǎo)則學(xué)習(xí)考試題及答案
- 銀行下半年對(duì)公業(yè)務(wù)工作計(jì)劃(13篇)
- 2024年公開招聘事業(yè)單位工作人員報(bào)名登記表
- 給水管移位專項(xiàng)施工方案
- 二級(jí)建造師繼續(xù)教育考試題及答案
- 冀少版八年級(jí)下冊(cè)生物期末復(fù)習(xí)知識(shí)點(diǎn)考點(diǎn)提綱
- 八年級(jí)語(yǔ)文上冊(cè)《作文》專項(xiàng)測(cè)試卷及答案
評(píng)論
0/150
提交評(píng)論