稍微研究一下,發現是參數在搞鬼
於是寫了這篇範例給以後有遇到相同問題,或是有調整參數值需求的人
I. 程式碼配置與情境說明
功能需求取回符合時間區間的登入資料
所以畫面上配置了兩個日期輸入框,以及一個送出按鈕
接著則是 Gridview 及 ObjectDataSource
給 ObjectDataSource 呼叫的方法則是到資料庫取得資料
可以看到有兩段 where 的判斷式,分別判斷該不該加入起始或結束的條件
參數的資料來源就是畫面上的兩個輸入框文字
傳入到 Method 的型別則是 DateTime?
寫好之後開啟虛擬伺服器看運作情況
嗯…Great! 看起來沒什麼問題
但是!!
如果這麼簡單就結束,坎尼就不用寫這篇了…
由下圖可以看到,當日期條件是同一天時,則會顯示不出資料
II. 偵錯
於是坎尼開了偵錯模式開始追蹤問題在哪很幸運的馬上就找到問題點了:
傳入的 DateTime 參數如果只有日期的話,會自動設定在00:00
在 8/8 00:00 ~ 8/8 00:00 之間當然找不到資料
此時較好的解法就是在傳入時把值抓出來做調整之後,再送去查詢
問題是,要在哪個事件攔截參數?
沒錯,就是在 DataSource 的 Selecting 事件!
處理步驟如下:(可搭配上圖一起使用)
- 在 ObjectDataSourceSelectingEventArgs.InputParameters 取出參數
- 將參數轉型
- 處理參數值
- 存回參數裡
再把網頁跑起來一遍,查詢區間都設定為 2012/8/8
很好,有資料了! 收功!
III. 小結
所有的 DataSource 物件皆有 Selecting 事件但需要處理參數的大概只有 ObjectDataSource
另外處理參數的時候要注意轉型和 Nullable 型別的判斷
否則可能測試時沒問題,但一上線就有機會發生例外!
此次的範例下載 (不含資料庫)
沒有留言:
張貼留言