台灣最大程式設計社群網站
線上人數
1170
 
會員總數:244980
討論主題:188950
歡迎您免費加入會員
討論區列表 >> VB.NET >> Win10環境下如何對Access進行資料壓縮之問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Win10環境下如何對Access進行資料壓縮之問題
價值 : 150 QP  點閱數:511 回應數:31

樓主

KSRS
門外漢
0 25
452 60
發送站內信

各位小舖專家大德勳鑒
小弟用下述方式在Win10(64bit)環境對Access(64bit)進行資料壓縮失敗,請專家幫忙看下面的Code有什麼錯誤之處,感謝大家
Shared Function CompressAndRepairMDB(ByVal strFile As String) As Boolean
Try
' Jet Access (MDB) 連線字串; Jet ( Joint Engine Technology )
Dim strCn As String

strCn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0}"
Dim strTmpFile As String = Path.GetTempFileName.Replace(".tmp", ".mdb") ' 把tmp 副檔名改成mdb
Dim objPara As Object() = New Object() {String.Format(strCn, strFile), String.Format(strCn, strTmpFile)}
Dim objJRO As Object = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"))

objJRO.GetType.InvokeMember("CompactDatabase", Reflection.BindingFlags.InvokeMethod, Nothing, objJRO, objPara)

File.Delete(strFile) ' File.Delete 方法: 刪除Compact 前之mdb 檔
File.Move(strTmpFile, strFile) ' File.Move 方法: 將Compact 過的mdb 檔改成(回)正確檔名

Runtime.InteropServices.Marshal.ReleaseComObject(objJRO)
objJRO = Nothing
Return True

Catch ex As Exception
''MsgBox("Data Compression Failure!!!")
Return False
End Try
End Function

敬此 祝 萬事如意 KSRS敬上


搜尋相關Tags的文章: [ Access Win10 資料壓縮 ] ,
本篇文章發表於2019-07-21 18:17
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

香帥
檢舉此回應
請將
'MsgBox("Data Compression Failure!!!")
改為
MsgBox(ex.Message.ToString())
就能查出失敗原因,再針對原因解決
本篇文章回覆於2019-07-21 21:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

HB
檢舉此回應
試試參考資料,並保objJRO 設定修改一下!
本篇文章回覆於2019-07-23 07:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

KSRS
檢舉此回應
香帥大德您好
錯誤訊息在Win10環境如下,請幫忙看一下
System.Runtime.InteropServices.COMException (0x80040154): 由於發生下列錯誤,為具有 CLSID {DE88C160-FF2C-11D1-BB6F-00C04FAE22DA} 的元件擷取 COM Class Factory 失敗: 80040154。
於 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
於 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
於 System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
於 System.Activator.CreateInstance(Type type, Boolean nonPublic)
於 AQEg.ArkiElements.ToolDB.CompressAndRepairMDB(String strFile)
小弟程度不夠,實在看不懂,請您協助看一看 多謝您 KSRS敬上
本篇文章回覆於2019-07-23 15:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

KSRS
檢舉此回應
還有上面 2樓 大德提供的 參考資料 的Link連不上去,麻煩幫我看看好嗎,多謝2F大德 KSRS敬上
本篇文章回覆於2019-07-23 15:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

HB
檢舉此回應
可以連上參考資料的網址:https://www.itread01.com/p/1423311.html
些微調整如下語法供參考:


本篇文章回覆於2019-07-24 07:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

KSRS
檢舉此回應
HB大德勳鑒
收到,即行測試,感謝您 KSRS敬上
本篇文章回覆於2019-07-24 11:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

KSRS
檢舉此回應
HB大德勳鑒 為了配合我程式的撰寫模式,我將您的SAMPLE碼改成如下FUNCTION模式
Shared Function CompressAndRepairMDB_NEW(ByVal FilePathStr As String) As Boolean
Dim jro As Object = Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"))

Try
jro.CompactDatabase("Provider=microsoft.ACE.OLEDB.12.0;Mode=share Exclusive;Data Source=" & FilePathStr, _
"Provider=microsoft.ACE.OLEDB.12.0;Mode=share Exclusive;Data Source=" & FilePathStr.Replace(".mdb", "1.mdb") & ";Jet OLEDB:Engine Type=5")
'刪除Access檔案
Kill(FilePathStr)
jro.CompactDatabase("Provider=microsoft.ACE.OLEDB.12.0;Mode=share Exclusive;Data Source=" & FilePathStr.Replace(".mdb", "1.mdb"), _
"Provider=microsoft.ACE.OLEDB.12.0;Mode=share Exclusive;Data Source=" & FilePathStr & ";Jet OLEDB:Engine Type=5")
Kill(FilePathStr.Replace(".mdb", "1.mdb"))
Return True
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "資料庫路徑不存在!!!")
Return False
End Try
End Function
結果在Win10執行結果仍出現在前面7月23日相同的錯誤訊息,能否幫忙看一下,多謝您 KSRS敬上
本篇文章回覆於2019-07-25 00:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

KSRS
檢舉此回應
HB大德您好
真抱歉,經再測試,以上在Win10執行並無現錯誤訊息,但資料庫並未被壓縮下來,好像接近成功了,可以再幫忙看一看嗎?非常感謝您 KSRS敬上
本篇文章回覆於2019-07-25 02:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

HB
檢舉此回應
To KSRS:經測試後,可以將818,505筆的資料庫,刪除剩8筆後,利用7F程式進行壓縮,可以將檔案容量由133,808KB壓縮至264KB,再執行一次,就不能再壓縮了。

因此,建議比照上述方式進行測試,看看能否成功!
本篇文章回覆於2019-07-25 07:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

P陳
檢舉此回應
1.access 的壓縮並不是 ZIP 類的壓縮。
2.Access 的壓縮是將已刪除的資料真實的踢出資料庫。


所以 7F 中的的作法,只要是沒有被刪的資料的話,是不會再被壓的。 (新建立的檔案或剛被壓縮過的 是不會再被壓更小的)
本篇文章回覆於2019-07-25 08:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

KSRS
檢舉此回應
HB大德您好
經重複測試,我仍然無法將資料庫壓縮下來,我絕對清楚10樓P陳君的提示,因為我直接用Access壓縮就可成功縮小MDB size,我懷疑HB君可以壓縮成功是原始Access是64位元為基礎的,而我的原始資料庫是用MS Office 2000 32位元基礎建立的,才因此在Win64位元OS環境無法成功?可否冒昧請求HB君提供一個測試用的64位元Access MDB,當然要您同意才可,如果您不方便,我可以將我的資料庫送給您幫忙測一下,我的資料下載link為 https://www.asuswebstorage.com/navigate/a/#/s/ECD96739C4F94E98AAAF9DA8B66ACC69Y, 不論如何,很感謝您幫助我至此 敬此 KSRS敬上
本篇文章回覆於2019-07-25 20:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

P陳
檢舉此回應
之前的 Office 2000 (近20年前的產品了 不考慮升級嗎?)
好像不是用
Provider=microsoft.ACE.OLEDB.12.0
而是要用
Provider=Microsoft.Jet.OLEDB.4.0;
本篇文章回覆於2019-07-25 21:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

HB
檢舉此回應
To 11F KSRS:

9F提供的測試報告檔案也是2010年的舊檔案,目前Access是2003版,所以5F提供的程式語法,才會將附檔名.accdb變更為.mdb進行測試。

依提供之下載link下載檔案進行解壓縮,發現解壓縮軟體出現『無法開啟壓縮檔....』訊息,無法測試。
如果可以,壓縮成.zip格式再提供試試。
本篇文章回覆於2019-07-26 07:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

KSRS
檢舉此回應
TO 12F P陳君-當然想升級,但目前仍在XP環境作業,所以尚無法升到64位元Office,但昇級已在規劃中,由於程式須要在Win10 64bit 執行,才須如此測試, 感謝您提醒 KSRS敬上
TO 13F HB君- 已將資料庫重新壓縮,一用較新版WinRAR,一用7zip,請您試試看能否開啟,如不可以,請務必再通知我,感激不盡 KSRS敬上

https://www.asuswebstorage.com/navigate/a/#/s/ECD96739C4F94E98AAAF9DA8B66ACC69Y
https://www.asuswebstorage.com/navigate/a/#/s/9901B9FCC8D44787B73455FEF65D7159Y
本篇文章回覆於2019-07-26 10:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

P陳
檢舉此回應
TO 13# HB:
所以5F提供的程式語法,才會將附檔名.accdb變更為.mdb進行測試。<----
.accdb 直接改名成 .mdb 是無法共通的 需用匯出方式來處理

本篇文章回覆於2019-07-26 10:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.