Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VB6] eliminazione record tabella access con ADO

325 views
Skip to first unread message

Claudio Venturini

unread,
Apr 13, 2004, 5:37:45 PM4/13/04
to
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

javalab

unread,
Apr 13, 2004, 6:24:15 PM4/13/04
to

"Claudio Venturini"

> 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

perche' ?

emmexx

unread,
Apr 14, 2004, 2:58:58 AM4/14/04
to
Il 13/04/2004 23.37, Claudio Venturini scrisse:

> 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

Non so se il problema sia qui, ma perche' non sostituisci:

> Dim Recordcount As Integer
> Recordcount = RecordSet.Recordcount
> Do While (RecordNum <= Recordcount)
> RecordSet.Delete
> RecordSet.MoveNext
> RecordNum = RecordNum + 1
> Loop
>

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!

Lupo

unread,
Apr 14, 2004, 3:06:58 AM4/14/04
to
[Claudio Venturini = circa_cl....@virgilio.it in
9f93ec15.04041...@posting.google.com] ha scritto:

> 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....

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.

andt

unread,
Apr 14, 2004, 3:26:49 AM4/14/04
to
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


Claudio Venturini

unread,
Apr 14, 2004, 3:34:33 PM4/14/04
to
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???

javalab

unread,
Apr 14, 2004, 7:44:28 PM4/14/04
to

"Claudio Venturini"

> 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

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

andt

unread,
Apr 15, 2004, 3:35:43 AM4/15/04
to
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


ErPotenza

unread,
Apr 15, 2004, 4:13:51 AM4/15/04
to
On 14 Apr 2004 12:34:33 -0700, cl.ven...@virgilio.it (Claudio
Venturini) wrote:

>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...

A quanto pare stai usando un Data Control ... e ciò è male! :-)
Solitamente un Data Control viene usato per caricare record.
Col metodo Refresh di fatto stai dicendo al controllo Data di riaprire
il proprio Recordset e farsi restituire da capo dei record. Ma dato
che stai usando una query di cancellazione, il refresh esegue il
delete causando la successiva chiusura del recordset.

Di fatto hai spiazzato il Data Control. :-)

> 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???

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!

0 new messages