這一陣子在寫一個指紋機的考勤軟體,由於考慮到這軟體必須要使用者自己安裝,並且沒有多人操作的需求,所以就決定使用Access 2003的mdb檔來當做資料庫,也因為這樣整個程式只能編譯成X86版本,沒想到苦難就這樣開始了。
這一陣子在寫一個指紋機的考勤軟體,由於考慮到這軟體必須要使用者自己安裝,並且沒有多人操作的需求,所以就決定使用Access 2003的mdb檔來當做資料庫,也因為這樣整個程式只能編譯成X86版本,沒想到苦難就這樣開始了。
好不容易整個程式差不多在RC階段了,客戶突然要求要改一個加班的基準計算方式,為了這個需求只好在資料表中多加一個加班基準資料表,這資料表有點瞎,不過就一個欄位,而且永遠只有一筆數字型態的資料。由於我平常撰寫和測試程式都是在VM中進行,而VM安裝的作業系統則是Windows XP SP3 X86版,前幾天我就很開心地把功能測完了,然後使用[安裝專案]把整個程式包裝起來交給客戶,預設安裝在Program files目錄下 (這在X64系統會安裝在 Program files (x86) 目錄下)。結果就發生一個慘絕人寰的案件,客戶告訴我程式執行有錯誤,而錯誤訊息正是找不到那個新的資料表。
我的第一個反應是:「我是不是包到舊的資料表?」檢查了半天,資料表好好地在裡面沒有去哪逛街,該在的資料列也在,資料表名稱也符合,這下可好。於是就做了以下幾個測試。
- 把程式安裝在Windows XP SP3 X86英文版,是正常的。
- 把程式安裝在Windows XP SP3 X86泰文版,是正常的。
- 把程式安裝在Windows 7 X86 中文家用進階版 ,是正常的。
- 把程式安裝在Windows 7 X64中文旗艦中文版 ,一模一樣的錯誤出現了,這還真是卡到陰,同一個mdb檔中十幾二十個資料表就獨獨這一個讀不出來,而且寫法也啥了不起,只不過就是用OleDbReader去讀一筆資料,SQL語法中簡單到連Where都沒用到,看起來也沒啥線索,於是就只好繼續瞎搞。
- 猜猜看第一步,先以[系統管理員身份]執行看看,居然正常了,所以可能權限有關,本來想直接用mt.exe 去改manifest,轉念一想,還是再測一下好了。
- 瞎弄第二回合與第三回合,我把整個程式包含其目錄搬到D:\與C:\底下執行,結果是正常的。
- 經過了上面的步驟,我就決定重新把安裝檔的目錄預設在C:\試試看,安裝完測試,完全沒問題。
- 然後反過來做,把剛剛安裝的整個程式包含目錄複製到Programs files (x86) 目錄下,慘,一樣的錯誤又發生了。
- 於是我就想做一件更瞎的事,把它複製到Program files目錄下,結果居然是正常的。
推演到這邊我已經快崩潰了,只有一個結論,讀取Access DB的程式如果安裝在X64 作業系統的Program files (x86) 目錄下,就是會卡到陰,因為這是我第二次遇到這種鳥問題,第一次也是同一個程式,那次的SQL語法有用到Join,我一直以為是Join的影響 (不是Jolin),可是後來不知怎麼搞的那個查詢突然就變正常,然後就換這個資料表卡到陰。謹寫下此篇文章留作紀念,並沒有要說明什麼技術性的問題。
[後記 1] 因為這個沒法放在回應,所以我只好加在後面,台北聽友水瓶來電致贈防止卡陰三步驟,茲在此和大家分享: ----->----->
[後記 2]台北聽友安先生提供符咒也一併分享大家: