Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Lmiti del campo contatore in Access
sabato 22 aprile 2006 - 08.39
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
max1850
Profilo
| Junior Member
142
messaggi | Data Invio:
sab 22 apr 2006 - 08:39
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
668
messaggi | Data Invio:
sab 22 apr 2006 - 09:06
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
142
messaggi | Data Invio:
sab 22 apr 2006 - 09:18
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
668
messaggi | Data Invio:
sab 22 apr 2006 - 15:48
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
142
messaggi | Data Invio:
sab 22 apr 2006 - 17:29
OK!
Allora va bene!
Grazie dell'aiuto!
Ciao
Max!
Cteniza
Profilo
| Guru
1.509
messaggi | Data Invio:
dom 23 apr 2006 - 11:40
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
668
messaggi | Data Invio:
lun 24 apr 2006 - 10:41
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
1.509
messaggi | Data Invio:
lun 24 apr 2006 - 10:55
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
668
messaggi | Data Invio:
lun 24 apr 2006 - 11:38
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
142
messaggi | Data Invio:
lun 24 apr 2006 - 12:42
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!
Torna su
Stanze Forum
Elenco Threads
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 !