Campi autoincrementanti che stranamente si duplicano

di il
24 risposte

Campi autoincrementanti che stranamente si duplicano

Buongiorno a tutti.
Ho un applicazione VB6 piuttosto corposa e utilizzata da diversi clienti che legge e scrive su un db Access 2000.
Uno di questi clienti, dopo aver utilizzato il programma per circa 8 anni senza problemi ad un certo punto ha dei problemi: all'avvio il database non viene riconosciuto. Gli faccio fare la procedura di compattazione e ripristino, ma poi, ripristinato il database su diverse tabelle trovo questa situazione:

1-Campi chiave ID di tipo long, auto incrementanti, ripetuti, due o più volte. Cioè record diversi con la stessa chiave.
2-Sulla struttura delle tabelle vedo che questi campi da "Indicizzato: SI (Duplicati non ammessi)" sono diventati "Indicizzato: SI (Duplicati ammessi)" . Mi domando, tra parentesi, se i campi sono auto incrementanti, anche se sono ammessi duplicati, come possono ripetersi?

Sanata a mano la situazione eliminando tutte le duplicazioni e riportando i campi a "Indicizzato: SI (Duplicati non ammessi)" il problema continua a presentarsi. Io allora elimino nuovamente le duplicazioni, ma poco dopo il problema si ripresenta.

Il cliente usa il programma in rete da tre postazioni. Gli ho fatto escludere a turno tutte le postazioni ed il problema continua a verificarsi, dunque non credo sia un problema causato da uno dei computer in particolare.

Il database risiede su un NAS.

Escludo, o meglio escluderei, che il problema dipenda da un difetto di programmazione perchè il meccanismo di incremento dei campi è gestito da Access: io inserisco un record e dopo ne recupero l'ID attribuitogli da Access.
Utilizzo sempre lo stesso sistema su decine e decine di tabelle e non ho mai avuto problemi. Decine e decine di clienti poi utilizzano il programma da anni e questo problema non c'è mai stato.

Ho quindi creato un database nuovo, pensando che quello vecchio fosse ormai "corrotto" e ho importato tutte le tabelle: stesso problema. Appena dato il database al cliente, dopo pochi click è stato necessario effettuare una nuova procedura di compattazione e ripristino ed ho trovato due record duplicati su una tabella X.

Il meccanismo utilizzato dal programma è sufficientemente testato. Il programma esiste dal 2002 ed è in vendita dal 2007.
Ho scritto degli automi di test all'interno del programma che richiamano le procedure coinvolte nella creazione dei record, e li ho mandati in esecuzione ininterrottamente per più giorni consecutivi creando centinaia di migliaia di record, mai nessun problema.

Il programma utilizza ADO per leggere e scrivere e DAO per aggiornare la struttura del DB quando necessario nelle nuove versioni.
Lo sviluppo con Visual Studio su una macchina virtuale XP, creo un pacchetto di installazione con NSIS che poi viene mandato in esecuzione dagli utenti, ormai soprattutto su Windows 10, come nel caso in questione.

A qualcuno è mai capitato qualcosa di simile?

Grazie mille.

24 Risposte

  • Re: Campi autoincrementanti che stranamente si duplicano

    Credo che il tuo problema derivi dalla vetustità dei prodotti utilizzati rispetto a Win10 e credo che tu faccia le prove (e lo sviluppo) usando solo WinXP.
    Nella fattispecie credo il problema possa esser ricercato nella diversa versione del motore Jet in Win10 rispetto a WinXP (e direi Win7).
    Mi sento di consigliarti di creare una macchina virtuale Win10 con installato VB6 (o VisualStudio che comprende VB6) e fare le prove con quella VM. Preparati a penare un pochino per riuscire ad installare VB6 in Win10 ma in rete trovi come fare.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Ti ringrazio. I prodotti sì, sono senz'altro vetusti. Lo sviluppo lo faccio su una macchina virtuale XP, le prove le faccio sia lì che su Windows 7 e Windows 10.
    Su Windows 7 e 10 questo problema non si è mai manifestato. E come ho scritto nel post iniziale ho degli automi che pilotano automaticamente le stesse operazioni eseguite dagli utenti che eseguiti su Win 10 per giorni e giorni hanno creato centinaia di migliaia di record senza che il problema si manifestasse.
    Certo, l'ipotesi della diversa versione delle librerie da te avanzata ha senso, ma è strano però che il problema, se così fosse, non si manifesti sistematicamente o almeno sporadicamente anche presso altri clienti o durante i miei test su Win 10.
    L'ipotesi di installazione del VB per lo sviluppo su una macchina virtuale Win10 invece non mi trova d'accordo, mi sembrerebbe inutile. L'importante credo sia verificare come gira l'eseguibile su WIN10 non svilupparlo su WIN10.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Io ho avuto problemi con un applicativo in VB6, sviluppato originariamente sotto WinXP, poi migrato in Win7 (ovvero compilato tramite VB6 in Win7) e successivamente migrato tal quale in Win10. L'applicativo sotto Win10 dava gli errori più disparati accedendo al DB (che a dire il vero nel mio caso era MySQL).
    L'unico modo che ho trovato per farlo funzionare è stato quello di installare VB6 sotto Win10 e poi ricompilare il progetto. La differenza riscontrata era la versione della libreria DAO (diversa tra Win7 e Win10).
    Forse non è il tuo caso ma io verificherei le versioni delle librerie DAO e ADO nei vari sistemi operativi (e nelle varie versioni di Win10).
    Di più non mi sento di dire ...
  • Re: Campi autoincrementanti che stranamente si duplicano

    Si, in effetti questo aspetto dovrei approfondirlo. Grazie.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Ciao.

    Ultimamente gli ultimi aggiornamenti di win hanno creato qualche problema ai data base access, anche ai più recenti.

    Quando dici che non viene riconosciuto, che errore genera?

    Fammi capire.
    Il database gira su una macchina virtuale xp, quindi presumo che gli altri tre pc abbiano semplicemente il front end e che girano su un sistema operativo diverso.
    Escluderei che il problema sia della macchina virtuale. A meno che non sia stata aggiornata, in teoria dovrebbe funzionare come sempre.
    Il problema potrebbe sorgere dai front end che magari hanno fatto qualche aggiornamento che crea qualche problema. Soprattutto se usi ocx.
    Altra cosa. Ma il database non è compilato?
    Da come ne parli sembra che sia un accdb e non un accdbe.
    Purtroppo le vecchie versioni di access hanno il brutto vizio di salvare da sole alcune istruzioni sui comandi delle maschere, soprattutto quando gli vengono passate tramite vb. Di solito si risolveva distribuendo la versione compilata.
    Però non penso che questo sia il tuo problema, visto che se è un programma in vendita, non penso che tu distribuisca versioni in chiaro. Quindi escludo che il problema derivi da modifiche accidentali degli operatori. Come escludo che il problema derivi dalla macchina virtuale. Sempre se non è stata aggiornata.

    Quindi a naso, il problema non risiede nella struttura del database, ma in uno dei comandi dei front end. Magari ti salva qualche query, qualche istruzione in qualche oggetto, come un command button, una combo box, che gli invii tramite vb per fare qualche operazione che poi lui salva nelle proprietà dell'oggetto e che successivamente genera questo problema.
    Infatti come hai visto, generando automaticamente nuovi record, il problema non si pone. Quindi deriva da una singola azione manuale.

    Devi andare per esclusione.
    Il problema si presenta in tutte le tabelle?
    Il problema si presenta dopo l'uso di una determinata maschera, determinato inserimento, determinata ricerca? O dopo che un determinato operatore ha usato il db? C'è anche questa opzione. Molte volte accade che dopo anni, qualcuno pensi di aver scoperto delle scorciatoie per fare determinate operazioni, senza rendersi conto invece che sfrutta un potenziale bug o imprecisione nel codice.
    Anni fa mi successe una cosa del genere. Lamentavano una perdita di dati e non riuscivo a capire il perchè. Praticamente un operatore, per comodità teneva aperte una marea di maschere senza chiuderle. Su una di esse c'era un errore sul lost focus, che creava questo problema.

    Secondo me inoltre, non devi usare le tue copie, ma devi farti una copia esatta dei front end e del database che usano dopo che hanno generato l'errore e testarli sulle tue macchine e vedere se ti generano l'errore.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Ciao fratac, grazie per la tua dettagliata risposta.

    Mi spiego meglio:

    La mia applicazione è creata con VB6, è composta da un mio eseguibile e da alcune mie DLL e utilizza alcuni altri componenti COM esterni o di sistema (ocx per listview, treeview, griglie varie, ecc) e dll (ADO per l'accesso al DB e altre)

    Il database access è utilizzato semplicemente come archivio, non ho maschere, report e nemmeno query o altro, faccio tutto dal programma tramite ADO.

    Nel caso in questione il database risiede su un NAS, non su una macchina virtuale (la macchina virtuale XP la uso solo per sviluppare il programma e compilarlo).

    I tre client girano su tre PC con Windows 10.

    Quest'architettura, peraltro semplice, composta da più client che accedono al DB su rete LAN è più che sperimentata con il mio programma e semmai potrei avere problemi di tipo meramente applicativo derivanti da una mia eventuale errata gestione dell'accesso concorrente sugli stessi dati.

    Quando dico che il DB non viene riconosciuto intendo dire che il programma nel tentativo di connettersi al DB ottiene un errore, che io intercetto e gestisco avvertendo l'utente.
    Nel caso in questione provando poi ad aprire il DB con Access, Access stesso dice che il DB è in uno stato incoerente e che è necessario eseguire la procedura di compattazione e riparazione database.
    Eseguita la procedura io poi mi accorgo dell'esistenza di questi ID duplicati. La duplicazione comunque non sembra essere una conseguenza dello stato incoerente del DB perchè avviene prima, e dopo qualche giorno, o dopo due minuti il DB va in questo stato incoerente.

    Il problema si presenta su tabelle a caso.

    Gli operatori possono lavorare con il DB esclusivamente attraverso la mia applicazione.

    A proposito del test da effettuare sulle mie macchine, non posso fare una copia esatta dei front end, perchè i front end sono rappresentati da interi computer del cliente. L'unica cosa che posso fare è farmi spedire il database ed il file di log che genera la mia applicazione.

    Grazie!
  • Re: Campi autoincrementanti che stranamente si duplicano

    Empedocle ha scritto:


    Nel caso in questione il database risiede su un NAS...
    Hai preso in considerazione l'ipotesi che il NAS possa avere dei problemi hai dischi ? Oppure che possa avere dei problemi alla porta ETH?
  • Re: Campi autoincrementanti che stranamente si duplicano

    Sì, ho detto al cliente di provare a spostare il DB e metterlo su una cartella condivisa di uno dei tre PC.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Ciao.
    L accesso utente come la gestisci?
    In sessioni, oppure uno stesso account può accedere contemporaneamente da due pc diversi, oppure, peggio dallo stesso pc si possono aprire contemporaneamente più frontend?
    Nel mio vero lavoro il gestionale scritto in delphi permetteva di aprire più di un front end sullo stesso pc. Era comodo, perché mi permetteva di gestire più spedizioni in contemporanea, fino a quando non abbiamo scoperto che lavorando sulla stessa spedizione, con li stesso account si creavano duplicati.
    Non è il tuo caso, perché per noi si trattava di record, ma con chiave diversa.
    A questo punto, dai una occhiata alle tabelle nascoste di access e vedi se c e qualche anomalia nell archiviazione della struttura interna del database. Anche se non saprei nemmeno cosa cercare. Visto che di solito non si ha mai la necessità di visualizzare le tabelle system di access. Comunque i componenti che usi, purtroppo sono veramente vetusti. È già un miracolo che continuino a funzionare.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Gli utenti li gestisco solo a livello applicativo, ovvero ho dei miei utenti definiti concettualmente tramite la mia applicazione e non ho utenti definiti nel database. Mi connetto al database senza specificare l'utente, quindi uso l'unico utente già esistente di default.
    Quindi lo stesso utente access, l'unico che esiste, può accedere contemporaneamente da più postazioni. Sullo stesso computer consento l'esecuzione di una sola istanza dell'eseguibile.
    Non credo però che il problema sia questo.
    Nel tuo caso la duplicazione dei record mi sembra dovuta ad un problema applicativo, non ad un malfunzionamento di qualche componente di gestione del database o del database stesso.
    Nelle tabelle di sistema di Access non saprei neanche io cosa controllare.
    I componenti che uso certo, sono vetusti, perchè vetusto è il linguaggio di programmazione che uso e quindi non potrei usare componenti più moderni.
    Sul fatto che sia un miracolo che continuino a funzionare non sono d'accordo. Microsoft ha gestito la coesistenza tra nuove e vecchie tecnologie, la compatibilità con i componenti COM c'è.
    Le librerie ADO e simili devono funzionare.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Ciao.
    Mi è venuta in mente una cosa.
    E se crei una funzione che vada a controllare lo stato della chiave primaria, prima e dopo l inserimento del record?
    In teoria dovresti intercettarla quando passa da univoca duplicati non ammessi a univoca duplicati ammessi ed avere almeno un idea approssimativa del momento in cui accade. Certo può essere un lavoro da adolescente che scopre il porno, ma sempre meglio di andare avanti a tentoni. Anche perché da quel che sembra è l unica situazione certa che accade. Ad un certo punto access va a modificarla.
    Anzi potresti inserire una funzione vuota di controllo anche sui nuovi progetti, da poter utilizzare nel caso ne abbia bisogno, popolandola di volta in volta con il codice che ti occorre per il debug. Se non ti serve sta li, non da fastido, ma avresti una via veloce per poter intercettare errori anomali che la gestione degli errori tradizionale non intercetta,.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Sì, potrei tentare questa strada. Il fatto è che le tabelle su cui succede non sono sempre le stesse e non ho una funzione centralizzata che inserisce i nuovi record e ne recupera l'id assegnatogli da Access.
    Dovrei prima fare questa funzione, in particolare quella che recupera l'id, e chiamarla da tutte quelle che inseriscono i nuovi record.
    Poi devo vedere anche come verificare se il campo ha cambiato stato e comunque tutto ciò potrebbe anche influire sulle prestazioni.
    Non capisco poi perchè Access abbia questa spiccata tendenza alla "corruzione" del database, a parte il mio strano problema.
    Più volte è capitato che i miei clienti siano incappati nella corruzione del proprio database, tanto che poi ho aggiunto nel programma una funzione che esegue la procedura di riparazione e compattazione e che l'utente può eseguire autonomamente.
  • Re: Campi autoincrementanti che stranamente si duplicano

    È per questo che ti dicevo che è un operazione da 14enne arrapato

    In realtà io intendevo una cosa piu terra terra.
    Controlli solo lo stato della chiave primaria. Prima e dopo il salvataggio del record. In teoria il nome della tabella la prendi dalla stringa di connessione. Per quanto riguarda le prestazioni, sarebbe una soluzione temporanea. Una volta capito l errore la dovresti togliere. E se proprio non riesci a capire il problema la potresti usare per eliminare i record doppi.

    Comunque non vorrei che questi problemi derivino dall uso di vb6 e ocx vari che non vengono aggiornati da 20 anni e che alcuni avevano già grossi problemi dall inizio.
  • Re: Campi autoincrementanti che stranamente si duplicano

    Il VB6 poveraccio fa solo il suo lavoro, che è quello di eseguire le istruzioni che gli ho impartito.
    I vari ocx con il database non c'entrano niente.
    Gli unici indiziati secondo me sono la libreria ADO, Access stesso, qualche grave problema di sistema e qualche diabolico errore di programmazione da me commesso che improvvisamente si manifesta dopo diversi lustri.
    Il nome della tabella non potrei prenderlo dalla stringa di connessione perchè io faccio una connessione quando parte il programma e uso sempre quella.
    Ho introdotto un controllo inziale che verifica la presenza di eventuali chiavi duplicate per avvertire l'utente ed evitare ulteriori casini da sanare a mano.
    I record non sono "duplicati", perchè sono record diversi, con informazioni diverse, che però, per disgrazia, hanno la stessa chiave, la qual cosa comporta la totale inaffidabilità dell'informazione registrata. Se due pagamenti, uno del signor Rossi di 10 euro e uno del signor Bianchi di 20 euro hanno come chiave lo stesso ID , come posso distinguerli uno dall'altro?
    E' un problema gravissimo e per il momento inspiegabile, se non con ipotesi generiche. Purtroppo.
    Il mancato incremento automatico di un campo definito come autoincrementante è una casistica che proprio non avevo preso in considerazione durante lo sviluppo. Del resto su qualche certezza bisognerà anche fare affidamento quando si scrive un programma.
    Mah, sono senza parole.
Devi accedere o registrarti per scrivere nel forum
24 risposte