C#+SQL CE之郵遞區號查詢程式 1.2修正版(速度調整,Word匯出功能)

2009/06/12補充:這支程式的資料庫和架構都有點舊了,可以換成下載小弟新版的Java程式,使用前請先確定Java已安裝(https://kelunyang.wordpress.com/2009/06/12/%e9%83%b5%e9%81%9e%e5%8d%80%e8%99%9f%e6%9f%a5%e8%a9%a2%e7%a8%8b%e5%bc%8fjava%e7%89%88/

話說因為期末大魔王已經殺到眼前了(@@"),所以也就沒有什麼時間再去修改這個程式,不過針對原本寫的某些bug和一些我想加進去的功能我還是把這個程式做了一次很大的調整,當然我最想要的LINQ to XML還是沒加進去,那一定得等暑假再說XD

因為LINQ to XML中間還牽扯到泛型和XML操作,這部分我之前沒處理過,所以得等等啦,其他目前新增的部分都是我可以Handle的,然後考慮到日後還會改版的問題,所以新增了版本更新功能,程式每次啟動都會上線查詢我的Google Page中的一個XML檔案,我有更新的話他就會提示下載更新

要下載的人可以直接點這個連結下載(包含原始碼專案檔、程式)
 image

再來貼圖吧XD
sshot-8
初始畫面,為了方便使用特別將複製郵遞區號等按鈕放到上面,因為根據人類的閱讀習慣應該都是由上而下讀的

sshot-2
這是新增功能,把原本的「關於」對話框和更改資料庫按鈕結合之後在做一個可以檢查我放在Google Page上的版本資訊XML檔的子程式,這樣整個功能會比較完整

sshot-1
為了考慮到以後的XML資料庫,所以特別設計了更改資料庫位置的功能

sshot-3
這是查詢畫面,新增了自動完成提示

 sshot-4
查詢速度大躍進,原本要耗九秒的流水查詢查詢大概兩秒就可以結束了

sshot-5
原本設定成是要點一下查詢結果,下面五個紅框才會出現字,但是這個問題也修正了

sshot-6
新增Word匯出功能

sshot-7
最後的Word匯出結果 ,因為這只是我自己寫信給奇摩賣家用的格式,所以就沒考慮直印了XD

那以下是技術資訊XD

DLL內嵌

這個應該是不可能的,在測試中發現如SQL CE的DLL檔可以內嵌,但是這樣你不可能using他,在某些沒有SQLCE的電腦上還是會當掉,所以為了方便起見,還是把他和程式放在同一個壓縮檔裡發佈,這樣比較單純

XML

不得不說我還是很不熟悉XML,我知道XML裡放在<XXX>叫做node,<XXX YY="33">這樣叫作屬性,<XXX>III</XXX>這樣叫做TEXT,但是怎麼操作XML時再是蠻困擾我的,之前找到一份微軟的這一篇文章(http://support.microsoft.com/kb/307548/zh-tw),後來發現他用的XMLTestReader在C# 2.0之後建議改用XMLReader代替,原本用DataSet的話可以用ReadXML的方式把XML給讀進去ADO.net資料庫裡面,但是我想這只是一個小小的版本檢查功能,應該沒必要搞得這個麻煩,就不處理ADO.net而改用類似Stream的方式讀取(嗯…不錯,XMLReader可以不需要呼叫Webrequest方法),這一部分我花了蠻長的時間處理的說(因為設成當XMLReader.Nodetype等於Node時變數XXX等於XMLReader.Name,而當XMLReader.Nodetype等於TEXT時變數YYY等於XMLReader.Value看起來是對的,但是當他用Stream方式讀入的時候,Name已經改了,但是Value可能還是舊的,這時候就囧了),但總的來說還是完成了,或許XML相關的處理方法還得在研究一下@@"

DataGridView.CurrentCell

這個我也不知道該怎麼說了囧,反正CurrentCell在初始的時候要給他設成null(參考:http://msdn.microsoft.com/zh-tw/library/system.windows.forms.datagridview.currentcell.aspx),我以為這個應該是.net Framework自己會處理的,誰知道看剛剛那一篇MSDN的說法好像是要自己把他設定成Null,然後你才可以在之後用程式的方式去改CurrentCell,要不然他會等資料你用滑鼠點他之後他才會去改變他自己的值,這樣當然就不是我要的了@@"

Thread.Sleep

其實我之前很少用Thread.Sleep這個方法,但是後來我發現在做流水查詢的時候,你如果慢慢打是不會感覺到速度差異的,但是要是是用新注音或者是打數字的話,查詢時間會拖特別久,這一點我一直想不到為什麼,因為我都設定好Textbox.Textchanged要Interrupt掉正在查詢的執行緒,但是還是慢,我後來想到這可能是因為在我中斷的時候電腦正在處理把資料打進去ADO.net的動作,要中斷要等,所以我後來乾脆把一個Thread.Sleep,讓每一個Thread都先等0.3秒之後在出發,這樣子反正新注音把字送進來馬上就可以把在等待中的Thread關掉,比較省時間,結果嘗試之後果然大有改善

第二個表單

好吧… 這部分是我笨了,所謂表單其實也是一個Class,所以要跨表單取得資料就是跨Class,這意思就是說得有一些靜態方法、靜態Thread,才能夠讓Form2去吃Form1的資料

Word

這個部分我以為還蠻單純的,因為有文件(http://support.microsoft.com/kb/316384/zh-tw)可以參考,但是後來發現並不是這個樣子,因為他教學用的oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);之類的語法是會產生段落沒錯啦,可是不能調整這個段落的縮排,或者是斷行(這個英文就不知道叫啥了,只知道HTML語言叫做<BR>),所以後來研究了半天才找到怎麼做斷行和插入內縮的辦法,另外又找到了怎麼改變整個文件全形半形的方法,才讓整個文件看起來比較正常,另外也可以滿足我的要求~

大致上就是這樣啦,暑假要把XML作上去,然後看看能不能把這個程式和Google API結合~

P.S.

喔對還是要抱怨一下郵局的資料庫,實在是很鳥,他把「巷」和「號」都放在同一個欄位,所以這樣造成他自己網路上的查詢系統也不能夠查詢「巷」和「號」,每次顯示出來的結果都是「單號」、「雙256巷到雙888巷」之類的資訊(有巷的時候就不一定有號,真囧),結果讓我也不能去查幾號幾巷,要是別人在流水查詢打完整地址我還真的找不到結果勒@@"(實際上郵局的查詢系統是根本不准你打完整地址)

對「C#+SQL CE之郵遞區號查詢程式 1.2修正版(速度調整,Word匯出功能)」的一則回應

  1. 這程式愈來愈專業了喔~ 厲害。
    我覺得你很有寫code的天份,
    能用各種技巧去整合及變化
    很有前途。

    我從你的程式中看到你的創意及巧思
    這是大多數人缺少的,加油。

  2. 真是太謝謝Tomexou大大了QQ
    等我期末考完我一定寫信給您,因為我實在很想知道您是用了什麼方法能讓查詢看起來這麼有效率@@"

  3. liaogary你好,我剛剛修改了一下這篇網誌,你可以在最上面那個下載按鈕點一下開始下載原始碼,我才只是一個初學者寫的不是很好請多多見諒囉~

  4. 不好意思,能否寄給我您這個程式的原始碼?
    因為最近在寫一個類似的程式
    遇到一些問題,想借您的程式做為參考,謝謝~

  5. gor您好,原始碼和整個專案都已經放在這個網誌一開始的那顆大按鈕點進去的地方囉~
    另外這個程式在搜尋的時候小弟有遇到一點bug,不過大致上是正確的,因為後來有事也就沒有修改了,程式寫得沒有很好就請您多多包涵囉

  6. 您好~
    可否將您的程式碼E-mail給我?
    可以順道請問一下官方3+2郵遞區號XML資料庫要去哪下載?

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料