Newsgroup: it.comp.lang.visual-basic
Titolo: VB + mysql

Ciao a tutti, ho un problemino con VB.
Ho creato un piccolo programma in vb che dovrebbe manipolare alcuni dati
sulle tb del mio database.
Il tutto funziona se le tabelle hanno pochi record, ma con una tabella di
circa 300 record mi da errore. Qualcuno può spiegarmi?
Aggiungo il codice che uso per connettermi al db
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Integer
Set Conn = New ADODB.Connection
Conn.ConnectionString = "mysql_connection-Letizia"
Conn.Open
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "select * from tb_titoli", Conn, adOpenDynamic, adLockOptimistic
rs.MoveFirst
For i = 1 To 2
    rs.Fields.Item(0) = i
    rs.MoveNext
    Next i

 rs.Open "select * from tb_titoli", Conn, adOpenDynamic, adLockOptimistic
Visto il codice e se il database contiene almeno un record con due campi,
escludo che il problema sia così semplicemente descrivibile.
La prima ipotesi (l'unica che ci consenti con le informazioni che ci dai) è
che l'apertura con modalità dynamic dimostri, qui più di ogni altro esempio
mai pubblicato, quanto sia "potente" e insieme drammatico il cursore
dinamico.
Evidentemente la tabella prevede un indice basato su uno (o più d'uno) dei
campi che vai a modificare. Anche se non fosse previsto alcun indice, una
certa "logica" di ordinamento può giustificare il problema. Effettuando la
modifica di un campo di ordinamento, il record corrispondente può essere
spostato in su, e non stare più dove stava.
Più probabilmente, ma la tua descrizione lascia ulteriormente a desiderare
perchè condizioni il problema in funzione del numero dei record, è che basta
controllare la fine del file (e correggere quel for):
If rs.bof=0 or rs.eof=0 then
    rs.MoveFirst
    do
        if rs.eof then exit do
        For i = 1 To 2
            rs.Fields.Item(0) = i
        Next i
        rs.MoveNext
    loop
end if

Chiedo scusa per la poca comprensibilità del post precedente.
Allora l'erroe che mi da è:
 - 
2147467259
 con la dicitura impossibile trovare la riga da aggiornare.
spero di essermi spiegato meglio adesso

Ermanno ha scritto:

Anch'io, credo a maggior ragione...
In subordine al codice che ti ho mostrato, prova a cambiare quel
adOpenDynamic in adOpenStatic
Facci sapere, per favore.

ho provato come hai detto, ma mi da sempre lo stesso errore

 ho provato come hai detto, ma mi da sempre lo stesso errore
Puoi postare il codice, connessione e ciclo compresi? Grazie.

Allego di seguito il codice come richiesto.
Ho anche provato a mettere rs.cursorlocation = asUseClient, ma niente da
fare.
Il fatto è che questo codice funziona benissimo se la tb ha pochi record. Ma
con la tb in questione, che ne ha 300 non va.
Private Sub cmdAggiorna_Click()
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Integer
Set Conn = New ADODB.Connection
Conn.ConnectionString = "mysql_connection-Letizia"
Conn.Open
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "select * from tb_titoli", Conn, adOpenStatic, adLockOptimistic
rs.MoveFirst
If rs.BOF = 0 Or rs.EOF = 0 Then
    rs.MoveFirst
    Do
        If rs.EOF Then Exit Do
        For i = 1 To rs.RecordCount
            rs!id_titolo = i
            rs.Update
        Next i
        rs.MoveNext
    Loop
End If
End Sub

         Next i                                            'Questa (vedi
sopra) toglila!


ho provato ma non funziona, ti riposto il codice pulito:
Private Sub cmdCategoria_Click()
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Integer
Set Conn = New ADODB.Connection
Conn.ConnectionString = "mysql_connection-Letizia"
Conn.Open
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "select * from tb_titoli", Conn, adOpenStatic, adLockOptimistic
If rs.BOF = 0 Or rs.EOF = 0 Then
    rs.MoveFirst
    Do
        If rs.EOF Then Exit Do
            rs.Fields.Item(0) = i
            i = i + 1


 End Sub
Ok, ricominciamo da capo:
- Il primo campo del recordset (quello riferibile con rs.fields(0)) di che
tipo è?
- Nel caso fosse un Long è per caso autoincrementante? In questo caso non
puoi (!) assegnarlo
- Quanto vale "i" inizialmente?
- L'errore è sempre quello?
- Che database è?
- Che versione di VB usi? con che SP?
- Che versione di ADO usi?
- Che sistema operativo è? Con che SP?

A proposito, hai cambiato il codice 3 volte (i tuoi post lo dimostrano),
pensi che possiamo ragionare su di un codice che si ferma giusto 30 secondi?
O no?

Ok, ricominciamo da capo:
- Il primo campo del recordset (quello riferibile con rs.fields(0)) di che
tipo è?
Integer (4)
- Nel caso fosse un Long è per caso autoincrementante? In questo caso non
puoi (!) assegnarlo
non è autoincrementante
- Quanto vale "i" inizialmente?
 i = 0
- L'errore è sempre quello?
- Che database è?
mysql 3.5
- Che versione di VB usi? con che SP?
vb6 sp5
- Che versione di ADO usi?
2.7 credo
- Che sistema operativo è? Con che SP?
win98

 win98
Spero win98 Seconda Edizione!
Non posso, come dicevo , che gettare la spugna per l'assoluta ignoranza di
MySQL, il codice mi sembra assolutamente a posto.
Ti consiglierei, giusto per evitare dubbi, di far riferimento al campo col
suo nome (rs!id_titolo, per esempio).
Mi spiace.

senti è dalle 5.00 di questa mattina che ci sono dietro, ho provato di
tutto.
Si l'errore è sempre quello, ed i non è una variabile globale che vale 2^32.
Cmq sul primo post avevo scritto che uso MySql. Ti ringrazio lo stesso.

 Cmq sul primo post avevo scritto che uso MySql. Ti ringrazio lo stesso.
Hai ragione, ma raramente presto attenzione ai subject. Me ne scuso.

Ooopsssss, siamo cotti in due:
Prova a mettere rs.Update prima del rs.MoveNext
:-((((

 Prova a mettere rs.Update prima del rs.MoveNext
Preciso che ADO dice che un record viene messo automaticamente in Edit
quando se ne varia un campo, per cui non è più previsto il metodo Edit che
invece è obbligatorio in DAO.
Sempre ADO dice che quando un record viene abbandonato per un'altro le
variazioni effettuate vengono automaticamente scritte, quindi rs.Update non
sarebbe necessario. Personalmente lo metto sempre, ma non so come si
comporti questo automatismo (o, meglio, la sua assenza) con MySQL.