Compattare Db Access da Vb.Net

mercoledì 27 febbraio 2013 - 22.23

jekisi Profilo | Senior Member

Salve a tutto il forum, avrei il seguente problema:

Dovrei compattare un Db Access da Vb.Net e guardando in giro non ho ancora le idee tanto chiare.

Qualcuno sa dirmi come fare?

Distinti Saluti

Fabio Messina

0v3rCl0ck Profilo | Guru

Ciao,

Esiste una mini guida MSDN che trovi qui: http://support.microsoft.com/kb/306287

Fammi sapere se non ti è chiaro qualche passaggio che vediamo di approfondire
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/

jekisi Profilo | Senior Member

Mi da questo errore:

Recupero della class factory COM per il componente con CLSID {DE88C160-FF2C-11D1-BB6F-00C04FAE22DA} non riuscito a causa del seguente
errore: 80040154.

Ho provato sia con Microsoft.Jet.OLEDB.4.0

che con Microsoft.ACE.OLEDB.12.0

Nel mio progetto uso Microsoft.ACE.OLEDB.12.0

Potresti dargli un occhiata?

Distinti Saluti

Fabio Messina

0v3rCl0ck Profilo | Guru

io ho provato sistemando la connection string mettendo come file di destinazione un nome diverso da quello di origine (perchè è obbligatorio) e togliendo la version jet che altrimenti mi si incazzava, e ha funzionato:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma credo che il tuo problema sia relativo al fatto che la dll non è registrata correttamente nel registro di sistema, prova a lanciare questo comando da start -> esegui:

regsvr32 %windir%\system32\msjet40.dll


ciao!
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/

jekisi Profilo | Senior Member

ciao,

ho scaricato e registrato la dll MSJET40.DLL

ma mi da sempre il solito errore:

Recupero della class factory COM per il componente con CLSID {DE88C160-FF2C-11D1-BB6F-00C04FAE22DA} non riuscito a causa del seguente errore: 80040154.

evidenziandomi come errore questa riga

jro = New JRO.JetEngine

Forse devo scaricare da Microsoft l' AccessDatabaseEngine per il 4.0?

Distinti Saluti

Fabio Messina

0v3rCl0ck Profilo | Guru

credo che il problema risieda nel fatto che stai eseguendo il codice da una macchina a 64 bit, e il target della tua applicazione è Any CPU o x64, mentre dovrebbe essere x86, perchè purtroppo la DLL di Jet è stata rilasciata solo per architetture x86, il che non vuol dire che non puoi utilizzarla su un pc a 64 bit, ma devi compilare la tua applicazione con target platform settata a x86, vedi sotto:


716x449 56Kb


infatti a me funzionava perchè provavo da un virtual machine x86, mentre sul laptop effettivamente ho riprodotto il problema perchè l'applicazione era compilata in Any CPU e il sistema operativo era a 64-bit.

La fonte da dove ho scoperto che la libreria Jet è compilata solo a 32-bit, è la wikipedia: http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine

dalla wiki ho anche letto che c'è una libreria a 64-bit, in pratica quello ACE, che però non è parte del sistema operativo e va installato a parte:

The engine in Microsoft Access 2010 discontinued support for Access 1.0, Access 2.0, Lotus 1-2-3 and Paradox files.[10] A 64-bit version of the ACE Driver/Provider has been introduced, which in essence provides a 64-bit version of Jet. The driver is not part of the Windows operating system, but is available as a redistributable.[11] Previously the Jet Database Engine was only 32-bit and did not run natively under 64-bit versions of Windows. This meant that native 64-bit applications (such as the 64-bit versions of SQL Server) could not access data stored in MDB files through ODBC, OLE DB, or any other means, except through intermediate 32-bit software (running in WoW64) that acted as a proxy for the 64-bit client.[12]

e questo è l'articolo che parla di come avere il Jet engine a 64-bit: http://blogs.msdn.com/b/psssql/archive/2010/01/21/how-to-get-a-x64-version-of-jet.aspx

e in pratica come dicevi si deve installare il Microsoft Access Database Engine però il 2010 Redistributable da qui: http://www.microsoft.com/en-us/download/details.aspx?id=13255

Riepilogando puoi:

- Utilizzare il Jet engine che hai referenziato nel progetto, modificando il target platform a x86

- Installare l'Access Database Engine 2010 a 64-bit, cercare la reference da aggiungere al progetto, e modificare la connection string con il provider "Microsoft.ACE.OLEDB.12.0". In questo caso dovrai pensare di fare un pacchetto di installazione con dentro le istruzioni per scaricare ed installare l'AccessDatabaseEngine 2010 oppure scaricarlo e aggiungerlo all'interno del setup, ma non solo devi anche prevedere se vorrai potere installare il software sia su sistemi 32-bit che 64-bit, e quindi prevedere due setup differenti, uno per x86 e l'altro per x64, dove all'interno metterai rispettivamente l'installer AccessDatabaseEngine.exe e AccessDatabaseEngine_x64.exe, mentre la tua applicazione la puoi lasciare compilare in Any-CPU.


spero sia tutto chiaro,
ciao!
-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/

jekisi Profilo | Senior Member

Ciao, mi sa che ho avuto un lapsus, me ne ero scordato.

Solo che ora me ne succede un' altra.

Se eseguo l' operazione così

Dim jro As JRO.JetEngine
jro = New JRO.JetEngine
jro.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Compatta db\AZIENDALE 2012.mdb;Jet OLEDB:Database Password=", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Compatta db\AZIENDALE 2012 compact.mdb;Jet OLEDB:Database Password=")


allora va bene, invece se faccio così

Dim jro As JRO.JetEngine
jro = New JRO.JetEngine
jro.CompactDatabase("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Compatta db\AZIENDALE 2012.mdb;Jet OLEDB:Database Password=", _
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Compatta db\AZIENDALE 2012 compact.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=")


mi dice

Impossibile eseguire l'operazione. Caratteristiche della presente versione non disponibili per database di formati precedenti.

evidenziandomi questa riga

jro.CompactDatabase("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Compatta db\AZIENDALE 2012.mdb;Jet OLEDB:Database Password=", _
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Compatta db\AZIENDALE 2012 compact.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=")


In giro avevo letto che ci stava qualche problema con Microsoft.ACE.OLEDB.12.0 rigurdo la compattazione ma non sò se hanno risolto, voi sapete dirmi qualcosa?

Distinti Saluti

Fabio Messina

0v3rCl0ck Profilo | Guru

ma per te è necessario utilizzare ACE? puoi compilare il tuo progetto in 32 bit o vorresti per forza compilare in 64 bit? sinceramente non credo cambi praticamente nulla se compili il progetto a 32 bit, solo poche applicazioni sfruttano davvero i 64 bit, il caso più semplice per cui un applicazione dovrebbe essere compilata in 64 anziche 32 è solo se supera i 3 GB di consumo memoria.

L'unica cosa che posso dirti è che sono riuscito a compattare un db anche a 64 bit importando la "Microsoft Office 14.0 Access database engine Object Library", ma non so se questa libreria può essere tranquillamente redistribuita e come, ad ogni modo l'ho inserita così:


723x209 25Kb


e poi con queste righe di codice ho compattato il db anche compilando in x64:

Dim dbEngine As New DBEngine dbEngine.CompactDatabase("C:\Compatta db\AZIENDALE 2012.mdb", _ "C:\Compatta db\AZIENDALE 2012 compact.mdb")

-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/

jekisi Profilo | Senior Member

Il discorso e che ho usato Microsoft.ACE.OLEDB.12.0 in tutto il mio progetto e volevo fare così anche questa cosa

0v3rCl0ck Profilo | Guru

a me su ace, compilando in x86, tenta di fare la compattazione ma mi da errore: Invalid Argument, e sinceramente non so perchè, forse c'è da lavorare sulla connection string:

System.Runtime.InteropServices.COMException was unhandled
ErrorCode=-2147467259
Message=Invalid argument.
Source=Microsoft Access Database Engine
StackTrace:
at JRO.JetEngineClass.CompactDatabase(String SourceConnection, String Destconnection)


-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/

0v3rCl0ck Profilo | Guru

ok forse ho trovato:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

va aggiunto: "Jet OLEDB:Engine Type=5"

a me ora funziona, ovviamente compilando in x86 per utilizzare JetEngine.


-------------------------------------------------------
Michael Denny
Lead Software Developer & Solutions Architect
http://blogs.dotnethell.it/Regulator/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5