与ObjectDataSource共舞
4,ORM組件XCode(與ObjectDataSource共舞)
?
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
選中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
轉載于:https://www.cnblogs.com/nnhy/archive/2010/09/13/1824669.html
總結
以上是生活随笔為你收集整理的与ObjectDataSource共舞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不孕症妇科检查都哪些
- 下一篇: 炸鸡多少钱啊?