與ObjectDataSource共舞
4,ORM組件XCode(與ObjectDataSource共舞)
XCode為了能更方便的解決大部分問題,不得不“屈身”于ObjectDataSource。
先上一個經典例子(ObjectDataSource+GridView)(ObjectDataSource):
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
選中ObjectDataSource,注意右上角的智能標記
配置數據源
這里只列出數據組件,為什么這里只有我們的Area類?為什么?我們看看實體類
就是DataObject特性起的作用,應該說,所有加了該特性的類,都會被當作數據組件在ObjectDataSource配置里面出現。當然,不加DataObject特性也是可以的,但是在ObjectDataSource配置的時候,就不能勾選數據組件了,那樣會列出所有類(是的,所有類)。
選擇Area類,繼續
繼續猜測,這里能列出這些方法,應該也是有特性的,那就是DataObjectMethod特性啦。
第一個參數代表方法類型(查詢、插入、更新、刪除),第二個參數表示是否默認方法,默認方法會在配置ObjectDataSource時被默認選中。
當然啦,另外三個配置頁也是有的(這里以Update為例)
最后一步定義參數,在這里就不定義了
可以看到,左邊已經列出了前面選擇的Select方法的所有參數。
來看看一個神奇的地方
ObjectDataSource可以把查詢參數綁定到Cookie、控件、Request.Form、Request.QueryString、Session等。我們一般綁定到控件,做查詢的時候非常有用。每一個查詢項作為一個參數,然后在這里綁定到對應的控件;也經常綁定到QueryString,比如表單頁面編輯數據的時候,這里綁定主鍵,然后就能把相應的對象找出來。
這里神奇的地方就在于綁定。需要做復雜查詢的時候,可以在界面上放置查詢控件
然后編寫一個對應的查詢方法,當然要加上DataObjectMethod特性了,然后在ObjectDataSource配置的時候把參數和控件綁定起來
(關于這類高級查詢后面專門介紹,這里僅僅是為了說明綁定的神奇)
綁定的神奇就在于,界面控件問數據源控件(如ObjectDataSource)要數據的時候,數據源控件開始著手準備參數,反射讀取綁定控件的值作為參數,并轉為相應的類型,然后再反射調用實體類的查詢方法(如Search)。
到這里,ObjectDataSource的基本配置已經完成,絕大多數ORM框架對ObjectDataSource的支持,也僅僅是到這里而已。而XCode的模型,是完全滿足ObjectDataSource要求的,下面繼續高級功能
這是ObjectDataSource控件屬性中的分頁類屬性,第一項啟用分頁,第三項指定用于查詢所有記錄數的方法(前面提到過查詢方法是成對出現的,這里的FindAllByName和FindCountByName就是一對),至于第二項和第四項,是不是很熟悉?
這兩個方法,一個返回實體集合,一個返回總行數,而參數則是一摸一樣。這就是ObjectDataSource對分頁查詢的要求,如果沒有第二個,ObjectDataSource也能提供查詢數據功能,但是就沒辦法分頁了。
回過頭了,仔細看看最后兩個參數的名稱,是不是跟ObjectDataSource屬性中的那兩個一摸一樣?所以,XCode使用這兩個名字作為參數名,正是這個原因。如果查詢方法使用的不是這兩個參數,那么在配置ObjectDataSource的時候自己跟著改就是了。
這兩個參數,第一個是從哪一行開始讀數據,第二個是返回的最大行數,其實就是每頁行數。這種分頁結構,跟別的絕大部分分頁控件什么的都不相同。所以,并不是XCode的分頁另類,而是別的分頁才是另類,XCode是正統(哈哈)。
除了分頁屬性,再看看一個排序屬性
正是查詢方法的倒數第三個參數。GridView在排序的時候,會給這個參數傳遞ID Asc或Name Desc等。而查詢方法內部,正是根據這個參數,以及兩個分頁參數,拼接SQL語句進行查詢的。
至此,ObjectDataSource配置完成。打開GridView的智能標記,選擇ObjectDataSource控件作為數據源,GridView即可自動生成列
當然,這個列并不是數據庫字段,而是實體類的屬性。
在智能標記面板上可以看到,啟用分頁和啟用排序可以勾選了,正是因為剛才在ObjectDataSource中配置好了。都勾上!
運行,看效果
界面很丑,不過那是美工的事情了。試試分頁(打開OrmDebug開關,查看SQL語句)
執行的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):
執行的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

浙公網安備 33010602011771號