今天幫同事追查系統改版後的怪問題一則,挺離奇的,讓我有見鬼的fu。印象中是我第二次遇到,而兩次的受害者都是同一位同事,讓我不禁懷疑IT界應該也要有"靈異體質"這種說法。

不是很確定問題根源,只簡單記錄一下發生情境跟解決方法:

  1. 修改了Oracle資料表,新增一個欄位。例如: Table T1原本有A, B, C, D欄位,新增欄位E。
  2. App_Code裡有個元件MyCom,提供DataTable Query(string p)方法,以ODP.NET 9.2.0.7執行SELECT A.*,B.X,B.Y FROM T1 JOIN T2 ON .... WHERE A.A = :p,傳回DataTable。
  3. 因使用ASP.NET部署專案,MyCom毋需變更,故bin\App_Code.dll未更新。
  4. WebPage.aspx程式負責呼叫MyCom.Query(...)取得DataTable加以顯示,本次也未修改或更新,但發現新增資料表欄位後傳回結果有異。
  5. 我寫了一段程式模擬WebPage動作以便偵錯:
    DataTable t = MyCom.Query("AAA");
    foreach (DataRow r in t.Rows) 
      foreach (DataColumn c in t.Columns)
        Response.Write(String.Format("<li>{0}={1}", c.ColumnName, r[c]));
    Response.End();
  6. 結果很有趣,欄位名稱只出現A, B, C, D, X, Y欄位,E欄位未出現,但事實上E的值卻出現在X欄位,而X的值出現在Y欄位,Y的值不見了。更好玩的是,原本Y欄位長度只有一個字元,而X值有六個字元,被錯置於Y欄位後,就只顯示第一個字元。
  7. 故意重存web.config讓Web Application重啟,怪異結果依舊。
  8. 最後在IISRESET後,問題才劃下句點。

我懷疑這是ODP.NET或Oracle Client快取住Table的Schema資訊所造成的資料錯置,不過無力鑽研深究,反正在其他專案中未曾耳聞有此種狀況,加上ODP.NET 9207已垂垂老矣,就算有Bug也不會有解藥,故留下篇筆記,供其他朋友也遇此等靈異經驗時參考。


Comments

Be the first to post a comment

Post a comment