使用 VB.NET 程式碼壓縮及修復 Access 2007-2013 版本資料庫(.accdb)檔案

Compact and repair Access 2007-2013 database via Vb.net code

最近寫了一個小工具,資料庫使用 Access 2010 的檔案
而 Access 資料庫檔案的特性是檔案大小會持續增大,即使有執行 DELETE 語法
便決定寫一個 壓縮及修復資料庫 的功能,省去對 Office Access 的依賴

上 Google 查了一下,多數都是使用 Microsoft Jet and Replication Objects 2.6 Library 達來成
但是使用 JRO.JetEngine 時,透過 Jet OLEDB:Engine Type=? 指定目標檔案時
最高只能支援到 JET Version 4.x 也就是只能產出 Access 2003 版本檔案格式


後來嘗試使用
Microsoft DAO 3.6 Object Library 來處理
但是 DAO.DatabaseTypeEnum 這個陳述式中只能支援到 dbVersion40 也就是一樣只能到 Access 2003


最後找到了
Microsoft 14.0 Office Access database engine Object Library (版本12)
其中 Dao.DatabaseTypeEnum 最高支援到 dbVersion150 也就是 Access 2013

  • dbVersion120 : Access 2007
  • dbVersion140 : Access 2010
  • dbVersion150 : Access 2013

我電腦中版本的只能支援 Access 2013
有較新的版本應該就可以支援到 dbVersion160,也就是 Access 2016 和之後的版本

先上程式碼範例

參數1 和 參數2 是必須參數
參數3 選擇性:語系,大概是會影響到排序
參數4 選擇性:版本,範例是對應 Access 2010

 

參考:

 

Android 刷機包(卡刷) 中 system.new.dat 的 re-pack工具: rimg2sdat

2013年鸚鵡買了人生第一隻 Android 手機:小米2S 32GB
新機入手就開始刷機和ROOT,從 JLB15.0 玩到 JLB21.0 時就開始動手改卡刷包

就這樣一路改一路玩到了換小米5
搶到陶瓷尊享版後很開心的下載官方卡刷包準備動刀,點開卡刷包時卻矇了

沒有 system 資料夾! 沒有 system 資料夾! 沒有 system 資料夾!

看了一下檔名和檔案大小,大概就是它了: system.new.dat
經過 Google 大神介紹到 xda 論壇拜碼頭,找到了這篇文章 Unpack/re-pack android DAT files
馬上下載工具並安裝 Python ,終於順利的 unpack 了一個 raw image

mount 起來修修改改完準備 re-pack 的時候卡關了
要先用 img2simg 將 raw image 轉換成 Android sparse image 之後才能再轉成 system.new.dat
又不想 git 一堆 andorid source 回來編譯,只為了取得 img2simg 這工具

心想,既然 system.new.dat 可以直接轉 raw image,那直接反向轉回去就好啦!?

完全沒接觸過 Python 還是把 sdat2img.py 開起來,只是閱讀起來異常艱澀
邊看邊對照 unpack 時輸出的資訊,大概抓到原理後就用 PHP 開始土砲

閱讀全文〈Android 刷機包(卡刷) 中 system.new.dat 的 re-pack工具: rimg2sdat〉

設定 WebBrowser 控制項在執行階段模擬的 IE(Internet Explorer) 版本

Microsoft Virtual Studio 中的 WebBrowser 在使用上有蠻多的應用方式

然而有時候開啟某些網站時,卻會提示更換使用較新瀏覽器版本
即使已將 IE 更新的提示較新的版本,透過 WebBrowser 開啟依舊還是跳出提示,這點還真是讓人有點困擾

WebBrowser控制項 在執行階段中預設套用的IE版本,是系統上的註冊機碼定義的
這個註冊機碼的預設值會受到 安裝的系統、IE版本 和 .NET Framework 版本 所影響

閱讀全文〈設定 WebBrowser 控制項在執行階段模擬的 IE(Internet Explorer) 版本〉

VB.NET 跨執行緒作業無效,使用委派(Delegates)來解決

問題是這樣來了
鸚鵡在一個 Form 當中使用了一個自己寫的 Class Controller_A
Controller_A 再以多執行緒的方式用來控制其他的 Class Node_A, Class Node_B 到 Class Node_N

其中 Controller_A 會監聽 Node_N 的自定義事件,除了做各別處理外也會視需求觸發(RaiseEvent)自己的事件
Form 再監聽這些事件來控制 OvalShape 達到燈號的功能

但是當 Form 裡監聽事件的副程式嘗試變更 Form 上其他控制項時,就錯誤惹…

VB_NET例外(委派處理)
因為上一次使用 VB 來開發程式已經是 VB6.0時代了,所以只能慢慢爬官方文件
找到微軟 MSDN 關於 VB.NET 的委派(Delegates) 的相關說明,實在有點咬文嚼字讓我看了很久還是一樣看很不懂

爬文到最後自己好像有點懂了又還是不太懂 =.=
不過至少鸚鵡找到解決方法了

 

當 Ctrl_StatusChanged() 被 其他執行緒呼叫 或是 用來監聽其他執行緒觸發的事件 時會透過 Invoke() 委派的方式執行我們定義的委派 Ctrl_StatusChanged_CallBack()
然後直接跳出副程式

目前鸚鵡透過這樣的方式沒有在遇到 未處理的例外 了