Link a vecchio file MDB

di il
15 risposte

Link a vecchio file MDB

Ho un programma compilato su Access 2019 a 32 bit o su 2021 a 64 bit, non mi si permette più di linkare un file Access 97.
La cosa invece era perfettamente fattibile da Access 2010 (che però sto cercando di dismettere).
Ho anche provato a farlo passando per un ODBC per Access ma anche quello mi è impedito.

Inutile che mi dicano di aprire l'MDB e convertirlo in una versione più recente, questo perché è il DB di un altro programma che gira su XP da cui devo importare periodicamente dei dati.
Qualche idea?

15 Risposte

  • Re: Link a vecchio file MDB

    Ciao, fammi capire, l'altro programma è quindi diviso FE/BE tutto access 2010 (mdb) ? o cmq si appoggia su un mdb vecchio come banca dati, giusto?
    Nel caso... hai modo di intervenire su quel FE? nel caso potresti abilitare una procedura di scarico di ciò che ti serve automatica e periodica, in modo che nei tuoi nuovi programmi tu possa caricare non direttamente da mdb ma da csv/txt/xls/xml (come vai meglio).
    Oppure potresti creare un piccolo programma esterno creato in altro linguaggio o con una versione di access abilitata al link su mdb vecchi che faccia solo quello senza necessità di intervenire mai + così da poter abbandonare poi la versione vecchia come hai detto

    EDIT: oppure fare copia dell'mdb ed aggiornarlo ... dipende chiaramente dalla frequenza dell'operazione
  • Re: Link a vecchio file MDB

    muttley005 ha scritto:


    Ciao, fammi capire, l'altro programma è quindi diviso FE/BE tutto access 2010 (mdb) ? o cmq si appoggia su un mdb vecchio come banca dati, giusto?
    A mio parere non è neanche un programma Access ma che salva su MDB.

    muttley005 ha scritto:


    Nel caso... hai modo di intervenire su quel FE?
    Magari!

    muttley005 ha scritto:


    EDIT: oppure fare copia dell'mdb ed aggiornarlo ... dipende chiaramente dalla frequenza dell'operazione
    Questa sarebbe una strada praticabile visto che vado in sola lettura e i DB sono piccoli.
    Dovrei fare un 'Convertitore' in Access 2010 che sposta da un DB all'altro (sperando che il Runtime lo faccia partire).
    Meglio sarebbe un 'convertitore' MDB su AccDB lanciabile a linea comandi.

    Insomma finirà che continuerò a tenerli in Access2010
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    Ho un programma compilato su Access 2019 a 32 bit o su 2021 a 64 bit, non mi si permette più di linkare un file Access 97.
    ...Qualche idea?
    Tempo fa, per curiosità ho affrontato una questione simile
    https://answers.microsoft.com/it-it/msoffice/forum/all/collegamento-access-97-access-16/df56b3e5-a005-4f27-a73c-2096cd1990c8
    e riporto qui la risposta che ho dato
    Usando ADO dovresti riuscire a leggere e scrivere nelle tabelle.
    Stringa di connessione: "Provider=Microsoft.jet.oledb.4.0;Data source=unita:\percorso\al\database.mdb"
    Come proprietà CommandText = "INSERT INTO [NomeTabella] (CampoTesto, CampoMemo) VALUES ('TestoDiProva', 'testolungodiprova')"
    Il primo campo era una chiave primaria, numerazione automatica, ed è stata valorizzata correttamente.
    Almeno io ci sono riuscito, in test molto veloce, fatto ad hoc perché di ADO non so praticamente nulla.
    (provato con Access di Office365 32 bit su un file mdb in formato A97)
  • Re: Link a vecchio file MDB

    Philcattivocarattere ha scritto:


    Usando ADO dovresti riuscire a leggere e scrivere nelle tabelle.
    Stringa di connessione: "Provider=Microsoft.jet.oledb.4.0;Data source=unita:\percorso\al\database.mdb"
    Ti ringrazio, per un attimo mi ero illuso.
    Il problema è che manca sulla macchina 'Microsoft.jet.oledb.4.0', ho provato a vedere di risolvere installando Microsoft Database Engine per Access 2010, ma non ha risolto.
    In pratica mi compila il codice per connettermi al DB ma poi va in errore per il formato di database vecchio se uso il 12.0 altrimenti per mancanza del driver.
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    Il problema è che manca sulla macchina 'Microsoft.jet.oledb.4.0', ho provato a vedere di risolvere installando Microsoft Database Engine per Access 2010, ma non ha risolto.
    Purtroppo non riesco a fare l'analisi della situazione come volevo e per non lasciarti troppo indietro ti dico a che punto sono arrivato.
    Fai ben attenzione quindi al fatto che è tutto ancora in divenire: già farlo in un ambiente di sviluppo potrebbe creare problemi.
    Il provider 'Microsoft.jet.oledb.4.0' praticamente c'è su tutti i sistemi operativi decenti e recenti a 32 bit. Anche su un attempato Windows XP con un minimo di aggiornamenti lo dovresti trovare senza problemi, anche se non c'è Access installato.
    Come avevo scritto sul thread riportato qui m'era riuscito di aggiornare una tabella su un file Access97, usando Access di office 365 a 32 bit, ovviamente con ADO. Non credo ci siano problemi a fare la stessa cosa da Access2016 o 2019.
    Il problema è quando si usa Access (o il file accdb o accde) a 64 bit. Non c'è verso di usare 'Microsoft.jet.oledb.4.0'
    Ho cercato in rete e chi ti trovo? Sempre lui, il buon caro vecchio Albert Kallal (che già mi ha tirato fuori da una grana che sembrava inspiegabile) che quando si tratta di 32 e 64 bit con Access e non solo le cose le spiega bene, oltre a saperle.
    Il post che mi ha dato lumi in merito ma soprattutto in cui si trova il link ad 2 file eseguibili che ha creato lui per una verifica che può venir buona in queste situazioni è questo
    https://stackoverflow.com/questions/65080477/x64-and-ms-ace-oledb-12-0-provider (scorri il thread per trovare l'intervento di Kallal)
    Ho preso una VM con Win10 a 64 bit base (quindi nessun prodotto Office presente)
    Usando il programma a 64bit di Kallal l'accesso al file Access97 ha dato esito negativo sia usando Jet sia ACE.
    Ho installato il Microsoft Database Engine 2010 a 64bit e usando ACE il collegamento al file Access97 è andato bene.
    Non sono riuscito ad aggiungere un record ad una tabella dalla sua interfaccia grafica ma non so se questo è voluto/possibile.
    Microsoft dice che il Database Engine non deve essere usato come sostituto di Jet eccetera eccetera, gli avvertimenti e quant'altro li lascio valutare a te, io sono uno sperimentatore e basta.
    Uno degli accorgimenti che invece mi sento di fare è che installare il Database Engine 2010 su un computer dove già c'è Access (o il runtime) 2016/2019/365 può far sballare qualcosa, è consigliato testare bene il tutto e in caso di grane anche nell'uso "ordinario" reinstallare o fare la riparazione del 2016/2019/365.
    Più di questo per ora (e forse anche dopo) non so dirti.
  • Re: Link a vecchio file MDB

    Philcattivocarattere ha scritto:


    Come avevo scritto sul thread riportato qui m'era riuscito di aggiornare una tabella su un file Access97, usando Access di office 365 a 32 bit, ovviamente con ADO. Non credo ci siano problemi a fare la stessa cosa da Access2016 o 2019.
    Intanto ti ringrazio per lo 'sbattimento'.
    Penso che il problema invece sia proprio lì, hanno disabilitato il supporto a questi vecchi formati (capisco esigenze di marketing, ma almeno permettessero di installarne il supporto con un plug-in all'occorrenza).
    Alla fine sono stato costretto a rinunciare alla dismissione di Access 2010.

    Oggi per sviluppare ho tre macchine di cui una virtuale.
    Una con Access 2021 per lo sviluppo a 64 bit, una con Access 2019 per ricompilare i programmi a 64 bit a 32 e per i programmi che devono restare a 32 (pochi), per via della versione Office del cliente.
    Una con Access 2010 per riconvertire i pochi residuali programmi adp, e a questo punto per il programma che opera sui DB preistorici.
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    Penso che il problema invece sia proprio lì, hanno disabilitato il supporto a questi vecchi formati (capisco esigenze di marketing, ma almeno permettessero di installarne il supporto con un plug-in all'occorrenza).
    Nel caso specifico si tratta di accedere, nel 2022, ad un formato del 1997, considerando che non si tratta di un semplice documento o file di testo con elementi base, non voglio dire che è "giusto" aver ritirato il supporto ma che è comprensibile che non si dedichino sforzi infiniti alla retrocompatibilità così spinta nel passato.

    paoloholzl ha scritto:


    Oggi per sviluppare ho tre macchine di cui una virtuale.
    Uh, le macchine virtuali sono la nostra salvezza. La mia per le prove infinite che agli inizi hanno messo ko il mio computer un po' troppe volte, ora perché ci fanno risparmiare un sacco di tempo nella preparazione di ambienti diversi per le varie esigenze.
    Il compilato a 32 bit è incompatibile con il compilato a 64 bit, non ci sono trucchi informatici che tengano, se hai piattaforme con diverso bitness è inevitabile dover avere le due versioni di Access installate in ambienti separati.
    Poi solitamente si sviluppa con la versione "più vecchia" tra quelle in cui si sa che si distribuirà e bisogna stare ovviamente accorti a non vincolarsi a particolarità che non sono presenti in qualcuna delle versioni.
    A titolo di "condivisione della frustrazione" (ma molto soft, io mi diverto e basta) mi sono imbattuto in Access 2013 che non supportava i file DBF e sui quali per motivi vari mi fa moooooolto comodo lavorare. Access 2016 era sulla stessa strada ma a gran voce è stato reintrodotto (cavoli... Microsoft che cambia idea su richiesta degli utenti, è una notizia). Però avevo ancora A2013 e ... mi sono lanciato in una cosa simile a quella che ho proposto a te: ho usato il database engine 2010 (che supporta appunto i DBF) con qualche trucchetto sul registro per farlo usare anche ad Access 2013. Non c'erano le voci del menù classiche a cui si era abituati ma... era comunque oro colato.
    Non per vantarmi ma ha avuto "risonanza mondiale" (o almeno è su internet come "idea originale" e l'hanno apprezzata)
    E' proprio in occasione di queste manovre che ho avuto qualche problema, quello che mi ha spinto ad evidenziare che installare il database engine 2010 DOPO che è stato installato Access, può causare qualche grana. Risolvibile comunque.
    Sui file adp non posso darti alcun suggerimento, mai usati.

    Tornando però al caso concreto, potresti dire in quali ambienti ti serve accedere al file creato con Access97, se in quelli c'è Access o il runtime, il sistema operativo, con specifica del bitness ovviamente, a meno che non sia quella situazione del file adp perché non saprei da che parte iniziare.
    Quando magari ho qualche respiro a disposizione provo a guardarci bene.
    (scritto senza rileggere, non è detto che le frasi siano di senso compiuto)
  • Re: Link a vecchio file MDB

    Philcattivocarattere ha scritto:


    Tornando però al caso concreto, potresti dire in quali ambienti ti serve accedere al file creato con Access97, se in quelli c'è Access o il runtime, il sistema operativo, con specifica del bitness ovviamente, a meno che non sia quella situazione del file adp perché non saprei da che parte iniziare.
    Ho il runtime praticamente dappertutto.

    Ci sono situazioni in cui l'Office Runtime non si installava, l'Access 2016 runtime si, per cui dove funzionava c'è quasi sempre Office 365 runtime.
    Se riuscirò a far andare il codice con Access 2021 a 64 bit bene, altrimenti lo farò andare con Access 2019 a 32 bit.

    Quello dei files adp è stato un incubo. In pratica è stato caldeggiato per l'uso con SQL Server come 'strumento ideale' in particolare per le modalità di dialogo con il back-end.
    Imparare a usarlo è stato complesso, ma poi si capiva che rendevi il sistema così interdipendente da SQL Server, che di fatto non potevi più fare link a DB di vario genere e generava scomodità di ogni tipo.
    Quindi alla fine tutti lo hanno abbandonato e hanno comiciato ad operare con gli ODBC.
    Il problema è che tornare indietro era estremamente complesso per soluzioni logiche da ristrutturare parecchio.
    Poi Microsoft dopo aver caldeggiato la soluzione pesantemente, ha fatto marcia indietro e lo ha dismesso.
    L'unica versione che ancora lo supporta è la 2010. I vecchi progetti ancora vivi li ho quasi tutti migrati.
    Certamente dovessi 'riesumare' un vecchio progetto Access 2010 diventa indispensabile.

    Recentemente (troverai il post) ho fatto il restore di una copia immagine di una macchina Access 2010 (che era attivata), mi ha richiesto l'attivazione che non è andata in porto (alla fine l'ho dovuto ricomprare).

    La cosa mi terrorizza, se fra qualche anno devo ripristinare un progetto ADP e la macchina con Access 2010 ciocca?
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    ...Se riuscirò a far andare il codice con Access 2021 a 64 bit bene
    Torno su questo thread perché avevo un tarlo che non mi dava pace.
    Windows 10 + Office ProPlus 2021 64bit (entrambi, ovviamente). Con i programmi di test di Albert Kallal nessun collegamento ad un file A97 andato a buon fine.
    Con il Database Engine 2010 a 64bit la lettura del file avviene regolarmente, usando ACE (e non Jet) come provider / data engine.
    In scrittura no, non funziona, ma potrebbe essere un limite del programma di Kallal, ho provato dalla sua interfaccia grafica.
  • Re: Link a vecchio file MDB

    Non è che magari esci da una serie di upgrade per cui il tuo componente originario è rimasto registrato?
    Prova su una macchina virtuale 'pulita' a vedere che succede.
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    Non è che magari esci da una serie di upgrade per cui il tuo componente originario è rimasto registrato?
    Prova su una macchina virtuale 'pulita' a vedere che succede.
    E' proprio (quasi) quello che ho fatto, nel senso che qualcosa magari d'altro c'era ma la differenza la fa il database engine 2010 a 64bit.
    Sono appena riuscito ad editare il recordset ADO, aggiungendo una riga e modificandone una esistente.
    Stringa di connessione
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\PaoloHolzl\Nwind97.mdb;"
    Il tutto con uno script vbs, perché per Office ProPlus 2021 64bit è ormai passato il termine per la prova, sicuramente eseguito da riga comandi a 64bit. Se lo lancio da una riga comandi a 32bit dà errore.
    Ho disinstallato il Database Engine 2010 a 64bit ed è subito andato in errore: "Impossibile trovare il provider. E' possibile che non sia installato correttamente", come da previsione. Ho messo mano ad un Northwind97.
    La VM è quanto più pulita possibile, non installata da zero ma quasi.
  • Re: Link a vecchio file MDB

    paoloholzl ha scritto:


    Prova su una macchina virtuale 'pulita' a vedere che succede.
    Siccome son cocciuto come... questa volta pulitissima, Win10 64bit. Tutto secondo previsione, sia con i programmi di test di Albert Kallal sia con lo script vbs: errori dove dovevano esserci, funzionamento solo se si chiama jet da un applicativo a 32bit (vbs compreso, che pubblico per completezza ma è un test stupido)
    OPTION EXPLICIT
    
    Dim strCnn
    'strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\PaoloHolzl\Nwind97.mdb;"
    strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test\PaoloHolzl\Nwind97.mdb;"
    Dim cn 'ADODB.Connection
    Set cn = CreateObject("ADODB.Connection")
    cn.Open strCnn
    
    Dim rsADO 'As Object
    Set rsAdo = CreateObject("ADODB.Recordset")
    
    With rsAdo
        .ActiveConnection = cn
        .Source = "SELECT * FROM [Categories]"
        .CursorLocation = 3 'adUseClient 'adUseServer di default
        .CursorType = 3 'adOpenDynamic 'adOpenForwardOnly
        .LockType = 3
        .Open
        .movenext
        'Wscript.Echo rsADO.RecordCount
        .Fields(1).Value = "OraLoSo9"
        .Update
    End With
    
    rsAdo.Close
    cn.Close
    
    Set rsAdo = Nothing
    Set cn = Nothing
    (ovviamente alternavo a mano la stringa di connessione, mettendo l'apice di commento su quella che non volevo usare)
    Installato OfficeProPlus2021 64bit. Nessuna modifica sul comportamento dei programmi precedenti. Ovviamente non apre il file in formato A97, lo si sapeva.
    Installato il DatabaseEngine2010 64bit.
    Lo script funziona solo se lanciato con la stringa di connessione ACE.OLEDB.12 da una finestra comandi e cscript indubbiamente a 64bit (non posso essermi sbagliato). Se dall'ambiente a 32 bit provo la stessa cosa non funziona (ed è giusto che sia così)
    Riepilogando
    DBEngine201064bit                JET     ACE.12
         Senza        Cscript 32bit   OK       KO
         Senza        Cscript 64bit   KO       KO
    
         Con          Cscript 32bit   OK       KO
         Con          Cscript 64bit   KO       OK
    Però non c'è verso di fargli fare la stessa cosa da Access 2021!!!
    Tadaaaan, indovinate cosa farò tra oggi e domani?
  • Re: Link a vecchio file MDB

    Nota dell'autore, che sono io: mi diverto e basta, chi lo fa per lavoro si assume la resposabilità e il rischio di applicare questi suggerimenti. Se una modifica al registro sistema 1 cosa e ne fa saltare 10 non lamentatevi con me.

    Philcattivocarattere ha scritto:


    Però non c'è verso di fargli fare la stessa cosa da Access 2021!!!Tadaaaan, indovinate cosa farò tra oggi e domani?
    Tadaaaaan 2, la vendetta.
    Forse ci sono.
    Copia di sicurezza del registro, rigorosamente.
    Dai un'occhiata a tutte le occorrenze nel registro di "ACE.OLEDB.12". Se c'è Visual Studio potresti trovarne qualcuna di troppo per quello che serve, ma è giusto per avere sotto controllo un po' la situazione.
    Nello specifico ora punta a queste chiavi e valori, guarda se sono come quelle che ho io sulla VM dove prima ho installato A2021 64bit e dopo DatabaseEngine2010 64bit (inserisco un ritorno a capo manuale, per facilitarne la lettura ma ovviamente è tutto dritto in un'esportazione della voce di registro)
    [HKEY_CLASSES_ROOT\CLSID{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32]
    @="C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\ACEOLEDB.DLL"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32]
    @="C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\ACEOLEDB.DLL"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRunREGISTRY\MACHINE\Software\Classes
    \CLSID{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32]
    @="C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\ACEOLEDB.DLL"
    Ne avevo avuto il vago sentore leggendo qua e là in cui si parlava di una installazione "fasulla" di ACE.OLEDB.12 da parte di Access versioni successive alla 2010 ed è anche il motivo per cui da uno script vbs funzionava ma da A2021 no: ci sono 2 versioni di ACE.OLEDB.12 che puntano a file diversi.
    La prima è quella "al di fuori" di Office (o almeno di Access, non ho provato da altri prodotti della suite) che usa il file
    C:\Program Files\Common Files\Microsoft Shared\OFFICE14\ACEOLEDB.DLL
    Se si lavora invece con Access, anche in latebinding, il programma quando è ora di cercare le informazioni del provider resta all'interno della sua "bolla" creata dall'installazione ClickToRun ed usa il file
    C:\Program Files\Common Files\Microsoft Shared\OFFICE16\ACEOLEDB.DLL
    che in realtà è il Provider di ACE.OLEDB.16. I due file ovviamente non sono uguali e una delle differenze sta proprio nella capacità del primo di leggere i file in formato A97 che il secondo non ha.
    Trucchetto sul registro, da OFFICE16 a OFFICE14 nella chiave che si trova in ClickToRun e Access 2021 a 64bit si comporta come ci si sarebbe aspettati all'inizio (o almeno come mi aspettavo io, anche se il programma ha fatto solo quello che gli hanno detto di fare).
    Sul web si trova anche che qualcuno ha avuto beneficio dall'installazione dei Data Connectivity Components 2007 ma non ho provato (già c'è bisogno di un prodotto di cui Microsoft non rilascia più gli aggiornamenti, non vado ad installarne un altro ancora più vecchio quando risolvo con un trucchetto sul registro)
    Non è da escludere che l'applicazione di qualche aggiornamento e/o operazioni di riparazione o altro possano ripristinare il riferimento al file "sbagliato" nel registro ma... che dire... si intercetta l'errore e si prova a correggerlo già dal codice VBA, se si ritiene utile fare questa cosa automaticamente.
    NB: io mi diverto e basta, chi lo fa per lavoro si assume la resposabilità e il rischio di applicare questi suggerimenti. Se una modifica al registro sistema 1 cosa e ne saltare 10 non lamentatevi con me.(repetita iuvant? no, mi paro il cosiddetto)
  • Re: Link a vecchio file MDB

    Chi ha fatto 30 può far 31 e non è né la versione di Access, né del Database Engine o del provider.
    Jet compact utility https://docs.microsoft.com/en-us/office/troubleshoot/access/jet-compact-utility-download utilizzabile anche da riga comandi converte i file supportati da Jet 3 a quelli di Jet 4. Risultato: il file A97 diventa A2002/XP o 2003 visto che Office365 lo apre, suggerendo ovviamente l'ulteriore conversione.
    Appena provato su una VM Win10 a 64bit spoglia di ogni applicativo.
    Ovviamente è un passaggio in più, si deve creare un file nuovo ma se gestito via codice non ha bisogno del Database Engine e del trucco sul registro.
    Il link di download presente in quella pagina Microsoft è questo.
    https://download.microsoft.com/download/access2000/utility/1.0/win98me/en-us/jetcu40.exe
    (in questo istante funziona, in futuro chi lo sa? Chiedo ad uno con gli occhiali tosti)
Devi accedere o registrarti per scrivere nel forum
15 risposte