前言
機房收費系統,對於我來說已經做了好多次。現在讓我們做導師,真正感覺到受益最大的就是自己。每次在給他們要求什麼的時候,其實是對自己的督促。換種說法就是,你總是在要求別人怎樣怎樣的時候,其實也是在對自己做要求。
知易行難,所以有些事情需要多次強調。機房收費系統也一樣,又一次的回顧,又一次的測試,讓我有了不同的認識。
問題概述
這個問題是關於組合查詢的,關於組合查詢,我附一個圖,大家看一就大概能明白這個組合查詢是怎麼回事。
對於裡面的商務邏輯和健壯性判斷這裡我就不說了,遇到的問題是:你說上面的查詢,會查到什麼,和你想查的結果一樣嗎?
我先說下我想查的結果:首先前兩個進行或運算,然後與第三個進行與運算,所以這樣的結果應該是空才對。
可是,那隻是我想的結果,但結果卻是出來結果了,這是為什麼呢?
問題解答
問題就在於資料庫中and和or這兩個關鍵字優先順序是不一樣的。and優先順序要比or的優先順序高,所以出現了與願望不符的結果。這給了我們警示:在寫程式時,儘可能對運算用小括弧進行優先順序劃分。將出錯機會降低到最小。
問題深入
現在問題來了,怎麼加括弧呢?首先先說一下這個程式沒有修改前的運行規則:
1. 定義一個字串strSQL="select * from 表明 where"
2. 如果只按照一個條件查詢,假設這個條件為A,那麼strSQL=strSQL+A,(A為第一個條件的字串)
3. 如果有兩個條件,第二個條件的字串為B,那麼strSQL=strSQL+B
4. 如果有三個條件,同3.
5. 執行strSQL語句。
現在需要再第一個條件和第二個條件加上括弧。有兩種加法
第一種
strSQL+(
一個條件的話A+)
兩個條件strSQL-),然後B+)
這樣在三個條件的時候,前兩個就始終最先運算
第二種
再定義一個變數strEndSQL。
一個條件strEndSQL=strSQL+A,
兩個條件strEndSQL=strSQL+A+B
三個條件的時候strEndSQL=strSQL+(+A+B+)+C
(說明,上面說的這兩種需要大家結合自己的代碼想一想才更清晰,沒有原始碼的可以給我留言,我給你原始碼)
問題深入
其實問題已經解決了,幹嘛還不停住呢?
原因就是我感覺這個問題很有代表性。我們都太懶了,組合查詢這個思路,應該是從學生資訊管理系統裡面學的吧。這個思路已經根深蒂固,所以每次遇到此類問題時,大家都往那方面去想,以至於已經出現了問題,首先的第一想法是,我怎麼去修改。
不得不承認,在修改的過程中,能學到新的知識。例如此例,第一種進行完後,你對字串的操作肯定會更熟悉。但是幹嘛要對自己畫地為牢,固步自封呢?
這些其實不是我自己一個人的思想結晶,是在給海燕姐測試的時候,遇到的這個問題。我當時是第一種思路,在他做出來後,我們進行交流,我們都沒有想到第二種,只是她的一種我感覺行不通的方法,給了我這個思路。
這種非技術上的學習,僅僅是看視頻,是學習不到的。通過和他們交流,我感覺我收穫了很多。
總結
循規蹈矩,固然好。但是能夠突破重圍,體驗另一個世界的美好,又有何不佳呢?不要被以往的思路禁錮住,相似的問題,用相同的解法,可能會出現你想象不到的問題,而當出現問題時,可以試著想另外的解決思路。因為相似不等於相同!!!