通過前兩次的內容我們已經實現了帶有分頁和排序的顯示資料,那麼我們如何用ObjectDataSource來協助我們實現刪改
還是老辦法我們先實現DAL層和BLL層當中的操作資料的方法
[DataObjectMethod(DataObjectMethodType.Insert)] public static void InserUserInfo(UserInfo info) { DAL.UserInfoDAL.InsertUserInfo(info); } [DataObjectMethod(DataObjectMethodType.Update)] public static void UpdateUserInfo(UserInfo info) { DAL.UserInfoDAL.UpdateUserInfo(info); } [DataObjectMethod(DataObjectMethodType.Delete)] public static void DeleteUserInfo(UserInfo info) { DAL.UserInfoDAL.DeleteUserInfo(info); }
這裡我們可以發現我這裡傳遞的都是UserInfo對象了.至於好處嘛,我認為你在賦值的時候通過屬性對其處理安全性更好一些.反正我總覺得比傳一大堆的變數過來要好.所以這裡採用這個方式.
如果你要採用我這種方式那麼就需要注意你的ObjectDataSource中的一個屬性是否正確設定了
這裡我設定為我查詢出的對象UserInfo
這樣你就可以來實現刪除和修改了.有些人就問呀!我沒有像以前那樣設定傳遞的參數啊.^_^
這裡當你設定了ObjectDataSource的DataObjectTypeName,當你執行相關操作的時候ObjectDataSource就會自動產生一個你設定的對象並且將行內的值一一對應的傳入到你的這個對象.然後直接將這個對象傳入到你的BLL中的方法.但是要注意,這裡還是有很多陷阱的
第一個陷阱 由資料衝突引起的問題
在ObjectDataSource中有個屬性↑
這裡屬性來設定如何處理是否新舊值一起處理
MSDN上的描述為:擷取或設定一個值,該值確定是僅將新值傳遞給 Update 方法,還是將舊值和新值都傳遞給 Update 方法。
當這裡使用預設的OverwriteChanges的時候傳遞的值內容為你更改後值.這裡傳遞是我們修改後的對象值.所以預設狀態下你的更新是沒有問題的.
但如果你要處理新舊值的時候就需要設定到CompareAllValues.但是這時你再更新資料的時候就會報錯了.
為什麼會這樣呢?原來當你設定為CompareAllValues的時候他需要給你BLL層傳遞過兩個對象,一個是原來的UserInfo一個是你修改後的Userinfo.
所以你的方法需要改成這樣
[DataObjectMethod(DataObjectMethodType.Update)] public static void UpdateUserInfo(UserInfo info,UserInfo original_info) { ...... }
這裡發現我們的更新方法多了後面的一個參數叫original_info,這樣才能將我們的修改後的內容正確更新回資料庫,而且這裡的original_這個首碼可以通過修改
來實現.
陷阱二,鍵欄位的問題.
那當我們ConflicDetection使用預設的OverwriteChanges值的時候我們進行刪除操作.發現沒有刪除了我們想要操作的那條記錄.然後通過監視可以發現傳遞到BLL中的UserInfo對象雖不為空白.但是裡面屬性的值都為預設值
那為什麼會出現這個問題呢?我認為是,刪除操作並沒有修改我GridView中的記錄所以在ConflicDetection使用預設的OverwriteChanges值的時候傳遞過的對象裡要是有值只能是修改後的值.所以這裡你要通過id來刪除則只能刪除記錄為0的了.^_^
所以通常來說刪除不了你想要的內容,但是不出錯.
那怎麼辦呢?這裡因為我們使用的是集合所以在編寫GridView的時候少設定了一個屬性,那就是
這裡我們添加上鍵欄位id.再來看看效果
這次發現,雖然這裡沒有吧UserInfo對象完整的傳遞過來.但是我們想要的id值過來了.^_^