2010年10月27日 星期三

[excel][access]excel抓access資料

工作上難免收到 access 的資料庫,要把部份資料抓進來。不要說用人工處理成千上萬筆的資料很痛苦,就連一兩百筆資料要核對就夠累人了。

打開 excel 然後,進到俗稱 VBA 編輯器去,在
工具>>設定引用項目

Microsoft ActiveX Data Objects 6.0 Library
勾起來。是的,我要用 ADO。

首先建立 connection
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & AccessFileFullPath & ";")

再來開啟 Recordset
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "select * from mytable", cn, adOpenStatic, adLockReadOnly

接下來把資料帶出來,最簡單循序的方法如下,每一個 recordset 可以用 index 取該 column 的值,或用 column name 來取值。
Do While rs.EOF = False
iid = rs(0).Value
sname = rs("CityName").Value
rs.MoveNext
Loop

至於 recordset 開啟時的參數有何不同功效,有待改日或高人指點。

2010年10月21日 星期四

[webdav]可惜有限制

原本打算,有了webdav,就可以把網路芳鄰給丟到一邊了。因為這兩個看起來功能真的都一樣,而且好像webdav還可以支援到外部ip,不是很讚嗎?

不過,我遇到一個限制,就是單一檔案傳送,不能超過2G,現在很多好看的檔案都超過2G,叫我怎麼辦呢?

不曉得這個限制是我設定的問題還是apache webdav在compile設參數的問題,亦或是spec天生的限制。

之前看設定檔上面寫LimitXMLRequestBody最大值是2G,我也試過0,也是失敗。

[xml]xml formatter

常常遇到別人寄來的xml沒有縮排,因為都是用機器產生的。
如果要看,雖然可以用瀏覽器來看,但是要手動改幾個內容,還是會找不到位置。
隨手用dot net寫一個,自己用一用,記錄下來以免忘了。

xdoc = new XmlDocument();
xdoc.Load(inputname);
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.Encoding = System.Text.Encoding.UTF8;
XmlWriter xw = XmlWriter.Create(outputname, xws);
xdoc.WriteTo(xw);
xw.Flush();
xw.Close();

就這幾行,把inputname及outputname指定了,就搞定了。

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 個就行了。