2012年8月15日

[ASP.NET] 調整傳給 DataSource 的參數值

最近在用 ObjectDataSource 時發現,取回的資料與預期不符
稍微研究一下,發現是參數在搞鬼
於是寫了這篇範例給以後有遇到相同問題,或是有調整參數值需求的人

I. 程式碼配置與情境說明


功能需求取回符合時間區間的登入資料
所以畫面上配置了兩個日期輸入框,以及一個送出按鈕
接著則是 Gridview 及 ObjectDataSource
odp01
給 ObjectDataSource 呼叫的方法則是到資料庫取得資料
可以看到有兩段 where 的判斷式,分別判斷該不該加入起始或結束的條件
odp02
參數的資料來源就是畫面上的兩個輸入框文字
傳入到 Method 的型別則是 DateTime? odp03
寫好之後開啟虛擬伺服器看運作情況
嗯…Great! 看起來沒什麼問題
odp04
但是!!
如果這麼簡單就結束,坎尼就不用寫這篇了…
由下圖可以看到,當日期條件是同一天時,則會顯示不出資料
odp05 嗯,難道這是父親節的詛咒嗎?
0

II. 偵錯

於是坎尼開了偵錯模式開始追蹤問題在哪
odp06
odp07
很幸運的馬上就找到問題點了:

傳入的 DateTime 參數如果只有日期的話,會自動設定在00:00
在 8/8 00:00 ~ 8/8 00:00 之間當然找不到資料
此時較好的解法就是在傳入時把值抓出來做調整之後,再送去查詢

問題是,要在哪個事件攔截參數?
odp08
沒錯,就是在 DataSource 的 Selecting 事件!
處理步驟如下:(可搭配上圖一起使用)
  1. ObjectDataSourceSelectingEventArgs.InputParameters 取出參數
  2. 將參數轉型
  3. 處理參數值
  4. 存回參數裡
如此一來查詢的區間就會在 0 時到 24 時之間

坎尼突然想到以前公司同事都是用字串傳日期,加上 00:00:00 和 23:59:59 之後再去 parse,好像也是個不錯的土法煉鋼的方法啦…

再把網頁跑起來一遍,查詢區間都設定為 2012/8/8
odp09
很好,有資料了! 收功!

III. 小結

所有的 DataSource 物件皆有 Selecting 事件
但需要處理參數的大概只有 ObjectDataSource

另外處理參數的時候要注意轉型和 Nullable 型別的判斷
否則可能測試時沒問題,但一上線就有機會發生例外!

此次的範例下載 (不含資料庫)

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D