2005-10-14

可惡的 ADO (MySQL 和 Win32.ASP 的困擾)

輔導室的系統要搬到網管去,Linux 下的程式搬到 FreeBSD 沒問題,MySQL 4.0 移進 MySQL 5.0 也沒問題,但 Win2000 下的 ASP 程式移到另一台 Win2000 (裝有 .Net Studio) 卻出了許多問題。這在前兩天已經提過了。

今天解決的是 MySQL 的 decimal(4,2) 型別的事。
有些成績因為只需要儲存或運算到小數下兩位,我又不想抓出來再 format 顯示字串,就用 decimal 型別。這在舊的機器一點問題也沒有。但在新的機器裡,decimal 的 adoType = 0 (Empty) ,即使 SELECT 得到資料錄,一樣會 ado.EOF 和 ado.BOF。於是,只好把 decimal 改成 float 然後再加上 adSingle 和 adDouble 的轉換。可是另一個暫存的表格裡,decimal 選出來卻一點問題也沒有。

更扯的是,原本有幾行 case adDate,adDateTime: 運作良好,但我用 case adSingle,adDouble: 卻不能動,一定要 case adSingle: case adDouble 才行。我和 M$ 的平台沒那麼熟,根本不知道這是怎麼回事,只好接受這個結果。

為什麼會有暫存表格呢?因為新的 Win2K + MySQL 上,SELECT '中文',*,'中文' FROM sometable 不能正確執行,原因是「中文」和「中文」的 ado.Fields(i).Name 相同,而且裡面有些 decimal 型別的數據。於是我先把資料 SELECT 進一個暫存表格,再 SELECT * ,一樣有 decimal 在裡面,問題卻解決了! God...

我不確定以上的問題是 MySQL 5.0 、MyODBC 3.51 (新版)、還是 ADO.NET 的錯。雖然我寫的是舊的 ASP,只是 M$ 的東西內部怎麼運作的,其實很不容易了解。

此外,今天還解決了 null.indexOf(c) 的問題。

程式裡有個函式是這樣的: return eStr.indexOf("EMail="); OK, 如果 eStr 是 null 怎辦?舊的機器會傳回 -1 ,也就是找不到東西。新的機器會傳回 'null'=Null 錯誤。我承認應該先檢查 eStr 是不是字串,但是為什麼舊的機器會讓我的程式過關呢?這就很費解了。

只能說,我和 M$ 的平台真是不熟、不熟、不熟....