要取得新ID 必需先將目前ID最大值給傳入嗎?
坎尼的作法就是利用 T-SQL 語法中的 select max(id) from table 來取得最大值
而最近坎尼一直在改同事的程式,發現到一個怪現象
他們一樣和坎尼用 max 去抓取目前最大值 id
然後回傳的是 DataTable,接著再用 DataTable.Rows.Count 去判斷
if(DataTable.Rows.Count != 0)
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
有人看出哪不對勁了嗎?
大家先看一下下列美美的抓圖




知道為什麼坎尼要下第一個 select 語法嗎?
第一個 select 不是什麼東西都抓不到嗎?
沒錯! 就是什麼都抓不到!
此時若是把這個查詢塞進一個 DataTable 中,DataTable.Rows.Count = 0
那為什麼要提這個呢?
原因就在於
當我們用 max、min 、count、avg....等語法時
如果資料表內無資料
它仍然會回傳一個值 (count是回傳0,max min avg則是回傳null)
所以,上述的判斷條件式應該改為
if(DataTable.Rows[0][0].ToString() != "")
ID = DataTable.Rows[0][0].ToString();
else
ID = "0";
同樣的bug坎尼已經抓過數次 (還是不同的同事寫的 囧>
所以提出此觀念讓還不知道的人了解一下
以上測試環境皆以 MS SQL 2000 為基準
課後補充
坎尼prefer的作法是,用MS SQL裡的 IsNull來判斷 (Oracle是NVL)
這樣抓取資料的人也不用再去判斷來判斷去
語法是 select IsNull(max(ID) , 0) as MaxID from Table
沒有留言:
張貼留言