2010年9月30日 星期四

[aspnet]自行用程式讀取 excel 2007 的內容,需要的元件

又發現,在開發環境沒問題的東西,到了測試環境出問題的問題。
讀取 excel 2007 的確還是使用 oledb 來抓資料,用到的 driver,是

Microsoft.ACE.OLEDB.12.0

可是裝上 Visual Studio 2008 的開發環境可以,沒裝的測試環境就不行,那不是要我們把 VS2008 裝上去嗎?真是裝笑維嗎?

還好只要去找微軟把 AccessDatabaseEngine.exe 裝好就可以了。
謝天謝地

2010年9月15日 星期三

[aspnet]使用access 2007 x86, x64有不同

發生在跟同事整合web service遇到的問題。

嚴格說起來,就是在 OLEDB 底下,使用 Microsoft.ACE.OLEDB.12.0 這個 driver 存取 access file。

在他的電腦上都好好的,到了整合的時候卻出來

"The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine"

當下決定,把 mdb 改成舊格式,driver 改成 Jet。

從此不想碰這種問題了。

可是,後來到了客戶那裡安裝程式,他的環境是 windows 2008 R2。居然會出現:

"The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine"

這簡直是要我的命嘛!

就算裝了AccessDatabaseEngine.exe 也沒用,事情沒有這麼單純。

要感謝 google 幫忙,一下子就找到原因。那就是AccessDatabaseEngine.exe 現在只有 32bit 的版本。我們的OS都是32bit的,所以到了整合的時候才發生這個問題。

http://ybbest.wordpress.com/2009/07/22/the-microsoft-ace-oledb-12-0-provider-is-not-registered-on-the-local-machine/

改編譯方法之外變成x86,還是沒有用。還要更改 iis 的進階設定,讓 iis 能夠執行 32bit 程式才行,否則還是白談。

謝謝大家

2010/11/3 更新

2010年9月14日 星期二

[aspx]utf8完全征服

我們知道現實,utf8現在是網頁上處理多國語言及與 ajax 互動的文字編碼。我們非得處理它不可。

當你在 aspx 上面寫好 charset=”UTF-8”,並不代表你把工作都做完了。還有一些工作要做。

(1) 在 head 裡加上 <meta http-equiv='Content-type' content='text/html; charset=UTF-8' />
這只是告訴 browser 會是UTF-8。但是不代表我們傳送出去的真的是UTF-8,得要另外想辦法。特別是 ashx,也沒地方加這個東西。

(2) 如果使用 Response.Write 方式輸出,就要改變 Response 的編碼。
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Write(something);
something 是 .Net 的字串(string)。因此,你得確定 something 是 unicode 編碼而不是UTF-8或其他系統編碼。如此 Response.Write 輸出才會是對的 UTF-8。

(3) 在網頁中的連結或 Query String,例如 <a href=”http://localhost.com/中文連結”>你的連結</a>。
這種你可以賭,browser不會幫你做urlencode,且原來編碼跟你伺服器預設編碼一樣。但是請不要這樣做。直接在位置列打的連結會被urlencode,而在頁面上的則視不同瀏覽器有不一樣的結果,再加上每個使用者的預設編碼不一樣,你會被搞死。因此,幫自己一個忙,在連結上的中文字串,記得用 System.Web.HttpUtility.UrlEncode(dotnetstring, System.Text.Encoding.UTF8) 做編碼的動作。如此的連結所產生的 Request,IIS會正確地翻譯回正確的 .Net string。Query String 也是一樣的道理,產生正確的 urlencode 給瀏覽器,當 Request 送回來的時候,直接取用 Request.QueryString 就會是正確的值了。

(4) 如果你有需要從別的網頁拿資料回來,而使用 WebClient 要求資料。如果確定對方回來的字串是UTF-8,直接使用
WebClient wc = new WebClient();
string response = wc.DownloadString(theURL);
response裡面會出現亂碼。要改成
string response = System.Text.Encoding.UTF8.GetString( wc.DownloadData(theURL));

你以為已經轉好UTF-8了,要怎麼測試呢?有一個字「菓」不在big5編碼裡,可以拿這個字來測試你的系統。

2010年9月13日 星期一

[xml]escape

為了要在 xml 裡傳遞另一個 xml。要把被傳的那一個先變成一般的字串。那麼,<, >, 這類的被 xml 拿來當做分隔符號的符號,就要被轉換成其他樣子啦。到底,有哪些符號需要被轉換呢?

原來 轉換
> &gt;
< &lt;
& &amp;
" &quot;
' &apos;

好像就這麼 5 個就行了。