Newsgroup: it.comp.lang.visual-basic
Titolo: Tabella di mdb troppo piena?

Devo travasare alcuni dati (molti per la verità) in un atabella di db
access.
 
Quando arrivo al rec 43.000.000 circa mi si blocca sulla riga
"Call RS.UpdateBatch"
errore:
"
2147217887
(80040e21)"
argomento non valido
 
se supero questa istruzione ed eseguo
call RS.Update
 
nella successiva addnew si ferma ugualmente.
 
 
E' un problema di troppo pieno??
 
Ditemi qualcosa grazie
Tommaso

Tommaso ha pensato forte :

Il perchè si blocchi non lo so, potrebbe essere l'esaurimento della Ram 
come del limite del filesystem (ad esempio in Fat o Fat32 ci sono 
limiti sui file).
Ma sicuramente non farei MAI, neanche sotto tortura, un'operazione del 
genere attraverso metodiche bound. A dire il vero non farei neanche un 
singolo insert in quel modo, figuriamoci un'operazione massiva da 43 
milioni di righe.
 
Esiste un motivo preciso per cui hai deciso di usare AddNew anzichè 
Insert?
 
Alberto
 
 

 Tommaso
 
Dai uno sguardo qua:
http://office.microsoft.com/it-it/access-help/specifiche-di-access-HP005186808.aspx
 
 
Ciao
Efisio


Non sono molto esperto.
Ho visto che così andava bene e ho continuato.
(devo arrivare a 85 milioni di righe)
 
Io eseguo:
per svuotare la tabella
Set RS = ModMain.RecordSetDati("DELETE * FROM Archivio")
 
 
Set = ModMain.RecordSetDati("SELECT * FROM Archivio")
 
 
ciclo:
RS.AddNew
(attribuisco i valori ai campi)
Call RS.UpdateBatch
Call RS.Update
 
 
 
Potresti indicarmi la procedura con la INSERT ?
per provare se è solo questo che mi procura errore.
Grazie
 
 
Come ho visto in rete (vedi altra mia risposta)
potrei dividere il file, ma come farlo in fase di esecuzione?
non vorrei che si trattasse di salvare in due files diversi con
scrittura e lettura indipendente
Vorrei realizzare un'unica gestione dei due files (almeno credo si
tratti di questo).
 
Ciao
Tommaso

 Efisio
 

 (devo arrivare a 85 milioni di righe)
eh eh eh....della serie "so na sega io...ho trovato sto codice va che 
me frega di sapere perchè....."va"......  "!
 
Rimane solo una piccola curiosità....
perchè ti serve?...per studio hobby scuola...o per produzione cliente 
attività?
 
Nel primo caso saresti parzialmente "scusato" e ti si potrebbe 
rispondere: ogni database (gran parte) è interrogabile gestibile da un 
linguaggio chiamato SQL.
Quel che stai usando per riempire il database è una metodica che 
"ricopre" l'sql sottostante con una serie di comandi alla Visual 
Basic....
Questa metodica ha i suoi pochi pregi e i suoi molti difetti!
 
Usi se ho capito bene
una connection (aduserServer o adUseclient?....presumo aduseclient 
vero?)
su cui apri un recordset
su cui fai addnew
 
il problema è che stai alla mercè di ado nell'aprire chiudere ed 
inviare i comandi al database!
 
CMQ
diciamo ogni milionata di record (che ci farai poi...la generazione 
delle estrazioni del superenalotto???)
PROVA....prova.....
A CHIUDERE e STACCARE....la connessione...cioè proprio un conn.close 
conn=nothing....in questo modo il pool di connessioni dovrebbe liberare 
la memoria RAM....e scrivere davvero le modifiche sul file....
se mi ricordo i trucchietti di ado
...sta cosa funzionava egregiamente anche con il trojaio del ado data 
control (che ad esempio non mostrava subito una insert in una grid)!
 
Saluti!
 
p.s.
nel secondo caso?
...nel secondo caso ....meglio che non mi esprima....son tutte cose che 
dovresti conoscere!
 
-- 
----- Italliaaaaa 3227! -----
Sa cosa mi disse a Roma il cardinale Poletti? "Lei fa del bene, perchè 
con il suo personaggio la gente si rilassa e sorride, riconciliandosi 
un poco con la vita." ...Fra poco mi venderanno in farmacia.
(Lino Banfi)
 
 

 PROVA....prova....
 
Perspicace...ma stupido  il superenalotto esiste dal '97
altro che MILIONI di Estrazioni....
 
Piuttosto lo sviluppo di un sistema del SUPERENALOTTO
che puo' arrivare a 622.614.630  colonne....
 
Tommy  ora Wodka   ti spella vivo ah ah ahahahha 
 
 

 Potresti indicarmi la procedura con la INSERT ?
 
C'è un Tommaso a cui il 11/12 hanno spiegato come costruire un'Insert, 
e questo Tommaso ha risposto "Ok, grazie".
 
Adesso, non ho voglia di controllare gli ip, ma mi auguro tu non sia lo 
stesso Tommaso, altrimenti ti prendi anche qualche parola.
 
Perchè un conto è non sapere, e ci può stare.
Un altro conto è non cercare su google, e qua già ci può stare meno.
Un altro conto ancora è skippare le risposte e richiedere nuovamente.
 
Comunque, siccome stai sviluppando per diletto o per imparare (e 
sicuramente non per lavoro, viste le domande), magari inizia da 
qualcosa di meno pesante.
Cioè, prima impara a inserire e modificare record sulle tabella, 
facendo dei programmini di test che ti permettano di creare le tue 
funzioncine ben fatte.
Dopodichè, potrai fare dei test anche pesanti per evidenziare problemi 
di ram o performance.
 
Alberto
 
 

 e questo Tommaso ha risposto "Ok, grazie".
 
Scusami Alberto, ma l'11/12 a quale anno si riferisce?
Per controllare, perchè potrei essere stato io, ma non mi ricordo
qualcosa del genere.
In ogni caso io sono un dilettante nel vero senso della parola, ossia
mi diletto a fare programmi per me e non un dilettante che tende a
diventare programmatore professionista.
La eventuale mia ripetizione non credo comunque offenda nessuno e se
qualcuno si sente infastidito ha sempre al possibilità di rifiutare
una possibile risposta.
 
Per chiudere, ho risolto il problema compattando prima il DB.
Grazie comunque dell'attenzione e scusate se involontariamente con il
mio intervento o con il mio scritto ho offeso qualcuno.
Saluti
Tommaso


 Per chiudere, ho risolto il problema compattando prima il DB.
 
Ma quindi hai capito qual'era il problema?
Io ipotizzavo Ram o FileSystem.
Se "hai risolto" compattando, mi viene da pensare al filesystem. E 
siccome sono sempre assetato di conoscenza, mi piacerebbe avere 
feedback sui miei post.
 
 
Alberto
 
 

Ti avevo dato una soluzione: costruirti tante INSERT INTO in un ciclo ma, a parte, l'"Ok, grazie" non sei andato molto ad approfondire... e questo, per un programmatore, è un male.
 
Ti voglio però dare un nuovo consiglio: per quelle moli di dati lascia perdere Access. Tienitene lontano chilometri!
Vai piuttosto su SQL Server o qualcosa di simile. La versione Express è gratuita ed è estremamente performante.
Ti do un pò di parole chiave che, se cercate su google ti possono aiutare: "File CSV", "Bulk Insert" e "SQL Server".
 
Nicola

Io vi ringrazio tanto per la volontà di aiutarmi anche se forse non lo
merito, non come persona ma per coem mi relaziono con gli altri.
 
E' vero il discorso del post precedente. Scusatemi, forse perche avevo
risolto in modo diverso avevo poi chiuso il discorso ringraziando per
l'aiuto offertomi.
 
Vedete, è vero tutto quello che voi dite riguardo a come dovrei
seguire l'apprendimento, ma io non programmo per apprendere ma solo
per ottenere quello che mi serve. Ecco perchè una volta raggiunto il
risultato non mi preoccupo più di tutte le altre soluzioni
probabilmente migliori.
Probabilmente questo attirerà altre vostre argomentazioni, ma io con i
miei anta,anta ,anta,anta cosa volete che faccia? che impari ora
l'SQL? Via, faccio quello che riesco e mi fermo li.
 
Alla fine devo pur dire grazie o no?
Saluti,
Tommaso

mah, non sono assolutamente esperto...
però ti butto lì, se hai tempo  da perdere...
io sostituirei
Set = ModMain.RecordSetDati("SELECT * FROM Archivio")
con
Set = ModMain.RecordSetDati("SELECT * FROM Archivio where Campo1='NON
ESISTE' ")
non conoscendo il tuo tracciato ho indicato un campo qualsiasi
(CAMPO1)
impostando una condizione che non si verifichi mai...
in questo modo il recordset dati per l'add new è sempre vuoto...
al primo insert è sempre vuoto, avendo tu deletato prima il tutto...
ma, da ignorante, mi domando:
non è che magari il select * from archivio dopo avere fatto 1.000
add.new contiene 1.000 record?
Magari qualcosa a che fare con cursore... tipo lock optimistic/
pessimistic, ecc....
provare non costa nulla.
se poi ho detto una sciocchezza solenna, perdonami
(e speriamo che altri non si scatenino in insulti....)

 al primo insert è sempre vuoto, avendo tu deletato prima il tutto...
 
 
Come dicevo la mia difficoltà si è risolta con la compattazione del
DB.
Il tuo suggerimento potrebbe essere logico ma perchè l'errore si
verifica solo DOPO avere inserito molti altri rec?
 
Grazie dell'attenzione ,
saluti
Tommaso

Set = ModMain.RecordSetDati("SELECT * FROM Archivio")
