與ObjectDataSource共舞

4,ORM組件XCode(與ObjectDataSource共舞) html

 

XCode爲了能更方便的解決大部分問題,不得不「屈身」於ObjectDataSource。 數據庫

先上一個經典例子(ObjectDataSource+GridView)(ObjectDataSource): 框架

 

< asp:GridView  ID ="GridView1"  runat ="server"  AllowPaging ="True"  AllowSorting ="True"
    AutoGenerateColumns
="False"  DataKeyNames ="ID"  DataSourceID ="ObjectDataSource1"
    EnableModelValidation
="True" >
    
< Columns >
        
< asp:BoundField  DataField ="ID"  HeaderText ="ID"  InsertVisible ="False"  ReadOnly ="True"
            SortExpression
="ID"   />
        
< asp:BoundField  DataField ="Name"  HeaderText ="Name"  SortExpression ="Name"   />
        
< asp:BoundField  DataField ="ParentID"  HeaderText ="ParentID"  SortExpression ="ParentID"   />
        
< asp:BoundField  DataField ="test"  HeaderText ="test"  SortExpression ="test"   />
        
< asp:BoundField  DataField ="Description"  HeaderText ="Description"  SortExpression ="Description"   />
    
Columns>
asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="PurpleSun.Center.Area"
    DeleteMethod
="Delete" EnablePaging="True" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}"
    SelectCountMethod
="FindCountByName" SelectMethod="FindAllByName" SortParameterName="orderClause"
    TypeName
="PurpleSun.Center.Area" UpdateMethod="Save">
    
<SelectParameters>
        
<asp:Parameter Name="name" Type="String" />
        
<asp:Parameter Name="value" Type="Object" />
        
<asp:Parameter Name="orderClause" Type="String" />
        
<asp:Parameter Name="startRowIndex" Type="Int32" />
        
<asp:Parameter Name="maximumRows" Type="Int32" />
    
SelectParameters>
asp:ObjectDataSource>

 

 

下面用截圖演示整個過程: 測試

拖GridView和ObjectDataSource 網站

wps_clip_image-15245

選中ObjectDataSource,注意右上角的智能標記 spa

wps_clip_image-23943

配置數據源 code

wps_clip_image-16852

這裏只列出數據組件,爲何這裏只有咱們的Area類?爲何?咱們看看實體類 orm

wps_clip_image-12458

就是DataObject特性起的做用,應該說,全部加了該特性的類,都會被看成數據組件在ObjectDataSource配置裏面出現。固然,不加DataObject特性也是能夠的,可是在ObjectDataSource配置的時候,就不能勾選數據組件了,那樣會列出全部類(是的,全部類)。 server

選擇Area類,繼續 htm

wps_clip_image-24997

繼續猜想,這裏能列出這些方法,應該也是有特性的,那就是DataObjectMethod特性啦。

wps_clip_image-9268

第一個參數表明方法類型(查詢、插入、更新、刪除),第二個參數表示是否默認方法,默認方法會在配置ObjectDataSource時被默認選中。

固然啦,另外三個配置頁也是有的(這裏以Update爲例)

wps_clip_image-12855

wps_clip_image-24612

最後一步定義參數,在這裏就不定義了

wps_clip_image-16010

能夠看到,左邊已經列出了前面選擇的Select方法的全部參數。

來看看一個神奇的地方

wps_clip_image-21754wps_clip_image-27958

ObjectDataSource能夠把查詢參數綁定到Cookie、控件、Request.Form、Request.QueryString、Session等。咱們通常綁定到控件,作查詢的時候很是有用。每個查詢項做爲一個參數,而後在這裏綁定到對應的控件;也常常綁定到QueryString,好比表單頁面編輯數據的時候,這裏綁定主鍵,而後就能把相應的對象找出來。

這裏神奇的地方就在於綁定。須要作複雜查詢的時候,能夠在界面上放置查詢控件

wps_clip_image-140

而後編寫一個對應的查詢方法,固然要加上DataObjectMethod特性了,而後在ObjectDataSource配置的時候把參數和控件綁定起來

wps_clip_image-9814

(關於這類高級查詢後面專門介紹,這裏僅僅是爲了說明綁定的神奇)

綁定的神奇就在於,界面控件問數據源控件(如ObjectDataSource)要數據的時候,數據源控件開始着手準備參數,反射讀取綁定控件的值做爲參數,並轉爲相應的類型,而後再反射調用實體類的查詢方法(如Search)。

到這裏,ObjectDataSource的基本配置已經完成,絕大多數ORM框架對ObjectDataSource的支持,也僅僅是到這裏而已。而XCode的模型,是徹底知足ObjectDataSource要求的,下面繼續高級功能

wps_clip_image-31176

這是ObjectDataSource控件屬性中的分頁類屬性,第一項啓用分頁,第三項指定用於查詢全部記錄數的方法(前面提到過查詢方法是成對出現的,這裏的FindAllByName和FindCountByName就是一對),至於第二項和第四項,是否是很熟悉?

wps_clip_image-17527

wps_clip_image-6921

這兩個方法,一個返回實體集合,一個返回總行數,而參數則是一摸同樣。這就是ObjectDataSource對分頁查詢的要求,若是沒有第二個,ObjectDataSource也能提供查詢數據功能,可是就沒辦法分頁了。

回過頭了,仔細看看最後兩個參數的名稱,是否是跟ObjectDataSource屬性中的那兩個一摸同樣?因此,XCode使用這兩個名字做爲參數名,正是這個緣由。若是查詢方法使用的不是這兩個參數,那麼在配置ObjectDataSource的時候本身跟着改就是了。

這兩個參數,第一個是從哪一行開始讀數據,第二個是返回的最大行數,其實就是每頁行數。這種分頁結構,跟別的絕大部分分頁控件什麼的都不相同。因此,並非XCode的分頁另類,而是別的分頁纔是另類,XCode是正統(哈哈)。

除了分頁屬性,再看看一個排序屬性

wps_clip_image-8804

正是查詢方法的倒數第三個參數。GridView在排序的時候,會給這個參數傳遞ID Asc或Name Desc等。而查詢方法內部,正是根據這個參數,以及兩個分頁參數,拼接SQL語句進行查詢的。

至此,ObjectDataSource配置完成。打開GridView的智能標記,選擇ObjectDataSource控件做爲數據源,GridView便可自動生成列

wps_clip_image-7754

固然,這個列並非數據庫字段,而是實體類的屬性。

在智能標記面板上能夠看到,啓用分頁和啓用排序能夠勾選了,正是由於剛纔在ObjectDataSource中配置好了。都勾上!

運行,看效果

wps_clip_image-6948

界面很醜,不過那是美工的事情了。試試分頁(打開OrmDebug開關,查看SQL語句)

wps_clip_image-8101

執行的SQL:

Select * From (Select row_number() over(Order By ID Desc) as row_number, * From Area) XCode_Temp_b Where row_Number Between 71 And 80

這是XCode生成的分頁語句,由於如今測試環境是SQL2008,隨意生成了row_number的分頁,若是是別的數據庫,就會不一樣了。但那是XCode的事情,開發者不須要關心。

再試試在分頁的基礎上排序(點擊Name):

wps_clip_image-31464

    執行的SQL:

Select * From (Select row_number() over(Order By Name) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

    排序已經改成Order By Name了,再點一次Name,執行SQL:

Select * From (Select row_number() over(Order By Name DESC) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

    徹底知足要求!

 

    BTW:GridView那裏,其實還能夠啓用編輯和刪除的,由於配置ObjectDataSource的時候,默認已經配置了編輯和刪除的方法。

 

    最後,目的已經達到,或許你尚未發現,到這裏咱們尚未手工編寫任何代碼呢!

 

    XCode與ObjectDataSource共舞能夠獲得很是美的開發效果,可是,上面的模式,已是三年前的作法了,咱們如今有了更好的工業級的作法——批量生產

 

大石頭

新生命開發團隊

2010-08-24 13:25

做者: 大石頭 發表於 2010-09-13 01:39 原文連接

評論: 6 查看評論 發表評論

最新新聞:
· 是否該讓開發人員跟客戶直接交流?(2010-12-21 07:53)
· 亞馬遜副總裁跳槽Groupon任CFO(2010-12-21 07:50)
· Gmail語音服務將延長至2011年末(2010-12-21 07:49)
· AOL收購我的檔案網站About.me(2010-12-21 07:48)
· AT&T 19.25億美圓購入高通 700MHz 低頻頻譜(2010-12-21 07:42)

編輯推薦:Mono又更新了

網站導航:博客園首頁  個人園子  新聞  閃存  小組  博問  知識庫

相關文章
相關標籤/搜索