Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] eliminazione record tabella access con ADO

ciao a tutti, sto sviluppando con VB6 una applicazione basata su un db
access 2000 che uso tramite ADO. Mi sono trovato davanti a questo
problema: devo eliminare dei record (non pochi, circa 300) da una
tabella. Dato che non riesco ad usare in un normale RecordSource una
query DELETE ho pensato di fare una query SELECT e di eliminare uno
per volta i record del recordset in questo modo:
Dim Query As String
Query = "SELECT * FROM tabella WHERE campo = 1"
form.adodb.RecordSource = Query
form.adodb.Refresh
Dim RecordNum As Integer
RecordNum = 1
Dim RecordSet As ADODB.RecordSet
Set RecordSet = frmMainForm.adoCompetitors.RecordSet
Dim Recordcount As Integer
Recordcount = RecordSet.Recordcount
Do While (RecordNum <= Recordcount)
    RecordSet.Delete
    RecordSet.MoveNext
    RecordNum = RecordNum + 1
Loop
il problema è che ogni tanto il codice funziona alla perfezione, altre
volte mi dice una cosa tipo "Informazioni sulla colonna chiave
insufficienti o errate. Troppe righe interessate dall'aggiornamento".
Da ciò ho intuito che gli stavo facendo cancellare troppi record....
non è possibile, sono solo 9!!!! Non penso che 9 record da eliminare
si possano definire troppi...
dov'è che sbaglio??? Altri modi per ottenere ciò che mi serve???
grazie a tutti

 query DELETE
perche' ?


 
con:
while not recordset.eof
	recordset.delete
	recordset.movenext
wend
(o equivalente con do loop...)
Resta comunque valido l'interrogativo posto da j.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 Da ciò ho intuito che gli stavo facendo cancellare troppi record....
No, direi che non sapeva individuare con certezza la singola riga.
Ogni tabella, specialmente con ADO, deve avere almeno un indice con chiave
univoca, anche se la tabella fosse costituita, da progetto, da un singolo
record.

La soluzione al tuo problema dovrebbe essere questa:
cancellare i 300 record con un unica istruzione :
Set myDbDati = New adodb.Connection
myDbDati.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\PIPPO.mdb;Persist Security Info=False"
myDbDati.ConnectionTimeout = 30
myDbDati.Open
myDbDati.Execute "DELETE FROM Numeratori WHERE Cont='001'"
by da Andrea

La soluzione di andt funziona alla perfezione, grazie mille
per quanto riguarda il DELETE, non chiedetemi perchè ma se faccio
dim query as string
query = "DELETE * FROM tabella WHERE campo = 1"
form.adodb.recordsource = query
form.adodb.refresh
va tutto bene, le righe vengono eliminate ma sul refresh mi dice che
non è possibile fare il refresh se l'oogetto è chiuso... non so
spiegarmi il perchè. sono solo alle prime armi con VB
Allora smanettando ho provato ad usare al posto del refresh l'update
nello stesso modo
form.adodb.recordset.update
ma così non mi cancella nemmeno le righe...
Anche se ormai sono arrivato alla soluzione (quella di andt) mi
spiegate perchè mi succede ciò? Cosa devo cambiare???

 form.adodb.refresh
conosco poco ado e sql, ma a occhio per un delete userei un command, non un
recordset.
ciao, j.


Perchč le query di comando(cioč INSERT ..., UPDATE [tabella] SET...,DELETE
... ,  ecc. ecc.),
non possono essere eseguite con dei recordset, bensě attraverso l'esecuzione
o
con un oggetto Command, o con un oggetto Connection(o database che dir si
voglia).
Ma era la stessa cosa anche per DAO, cosě come per ADO.
ciao

spiegate perchè mi succede ciò? Cosa devo cambiare???
Fai a meno di usare il controllo data, e come andt usa una
ADODB.Connection o un ADODB.Command per eseguire query con Insert,
Update o Delete.
Ciao!