Lmiti del campo contatore in Access

sabato 22 aprile 2006 - 08.39

max1850 Profilo | Junior Member

Salve. Uso VB NET 2005.
Volevo terminare un mio vecchio programma che usa un database Access, ma mi è venuto un dubbio: i campi ID che inserisco in ogni tabella li avevo impostati a "contatore", cioè si autoincrementavano ad ogni inserimento di un record.
Ora, il problema è che anche quando cancello un record il campo ID non si decrementa, ma si incrementa sempre col nuovo inserimento di un record! Quindi, non vorrei che il campo "contatore" arrivi fino ad un numero massimo, oltre il quale poi il database si blocca (ad es. 65000)!
Che ne pensate?

Ciao
Max!

alextyx Profilo | Expert

Il campo contatore, se non ricordo male, ha come limite superiore il valore 2 elevato alla 32esima potenza. Dà come risultato alcuni miliardi, in genere sufficenti a garantire una certa tranquillità. Potresti comunque prevedere delle procedure di 'copiatura' dei record in tabelle clonate, a livello di struttura, così da far ripartire da '1' il contatore e recuperare i buchi dei record cancellati. Ovviamente dovresti preoccuparti di sistemare ogni riferimento sparso per le tabelle del DB....insomma un lavoraccio e anche abbastanza pericoloso!

max1850 Profilo | Junior Member

Ciao!
Il lavoro di "clonazione" delle tabelle, eliminando i "buchi" è veramente un lavoraccio!
Comunque se mi dici che può arrivare ad un paio di miliardi allora vado tranquillo!
Ma sei proprio sicuro? Oppure sai dove poterlo sapere con sicurezza (perchè mi serve saperlo con precisione)? Ho cercato in internet ma non ho trovato niente...

Ciao
Max!

alextyx Profilo | Expert

Te lo do al 99,9% in quanto il campo contatore è un intero Long (Int32 di VB.Net), cioè composto da 4 byte.

max1850 Profilo | Junior Member

OK!
Allora va bene!
Grazie dell'aiuto!
Ciao
Max!

Cteniza Profilo | Guru

Come ti ho già risposto in altro forum puoi reimpostare il valore iniziale del contatore e lo step tramite un semplice comando sql.
Il limite dei campi "contatore" è quello dei long (poco più di due miliardi), dipende dall'utilizzo che ne fai, personalmente a me non è ancora capitato di sentire che qualcuno abbia raggiunto tale valore su una tabella di access.
In ogni caso ti ricordo che secondo i principi della normalizzazione dei dati tali campi debbono essere utilizzati esclusivamente per fornire un campo chiave univoco per la tabella e NON per altri utilizzi come ad esempio "il codice fornitore", "il numero della fattura", ecc.
Ritornando alla questione "contatore" invece altra cosa è dare una soluzione definitiva al problema che a mio avviso passa tra due ipotesi ed un solo presupposto: togliere l'automatismo del contatore.
Ipotesi 1
Fai una query interna ad access che incrementa "lei" una tabella numeratore e ti restituisce il numero, numero che tu testi sulla tabella definitiva prima di utilizzarlo (ci fai una select sopra).
Ipotesi 2.
Utilizzare un valore "guid" per il numero progressivo.
I

alextyx Profilo | Expert

Non che cambi più di tanto quanto già esposto da Cteniza, che su questioni di database e simili, rimane per me un sicuro riferimento, ma, proprio per approfittare delle sua competenza, volevo conferma del limite superiore di cui si parla nel thread. Mi stavo chiedendo se effettivamente alla microsoft siano così spreconi da aver lasciato perdere 2 miliardi e spiccioli di combinazioni. Non credo che il contatore usi numeri negativi (o c'è un modo 'stravagante' per farlo?) e in questo caso, dato che 2^32 dà un risultato superiore ai 4 miliardi, siamo sicuri che il limite non sia quello? Giro la domanda a Cteniza che sicuramente ha l'esperienza e la documentazione, e speriamo anche il tempo, per fare una piccola verifica! Grazie in anticipo.

Cteniza Profilo | Guru

Parlando di Access (e anche di sql server) un campo contatore è fatto da 4 byte e ha i classici limiti del long:
(-2,147,483,648 to +2,147,483,647)
Venendo alla gestione del contatore NULLA VIETA di mettere un contatore che va in negativo, ho provato appena adesso sul mio access e funziona, non ho tempo di farlo per sql server non ho dubbi che funzioni ma se qualcuno lo confermerà è meglio.
Ho semplicemente inserito una nuova tabella con due campi Codice e Descrizione, codice naturalmente indicato come contatore.
Dalla gestione non ho visto come impostare il valore e lo step del contatore ma "da codice" scrivendo una semplice sql si può fare:
ALTER TABLE tabella5 ALTER COLUMN codice COUNTER (-1,-1)
(i due -1 sono rispettivamente dedicati al valore di partenza e all'incremento successivo).
Provato, funziona perfettamente

alextyx Profilo | Expert

Se capisco bene, dunque, si potrebbe partire da -2 miliardi e spiccioli, per arrivare, con incrementi '+1', a raggiungere i + 2 miliardi e spiccioli e avere quindi i 4 miliardi di combinazioni un po' in negativo e un po' in positivo, proprio come si ottengono sul long, giusto?
Quindi ci si troverebbe di mezzo anche lo zero.
Interessante.....almeno a livello accademico. Nella pratica i 2 miliardi penso siano già una buona 'dotazione'.
Grazie per la risp.

max1850 Profilo | Junior Member

Ciao!
Ho visto che il post si è sviluppato prima che io inserissi questo messaggio...con cose molto interessanti!
Cmq visto che è difficile raggiungere quella cifra di 2 miliardi per tabella allora non me ne preoccupo più di tanto!
Ho capito che la cosa migliore è usare come ID un valore numerico che inseriamo noi stessi durante l'Insert, ecc..
Poi ho visto la classe "guid" di .Net nella documentazione di help. Molto interessante...e anche facile da creare...

Grazie a tutti per le prove effettuate e per gli ottimi consigli!
Ciao
Max!
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5