Newsgroup: it.comp.lang.visual-basic
Titolo: [VB+ADO+MYSQL] Bug nei driver MyODBC? [Lungo ma importante]

Ciao, ho un problema capitato a molti (google ne è pieno)
ma non ho trovato una soluzione, per cui riposto il problema.
Usando ADO per accedere a MYSQL, si presenta un errore
quando provo a fare un update di un campo inserendo una stringa
più lunga di quella contenuta in quel campo. Mi spiego meglio:
L'errore è:
"Si sono verificati errori in un'operazione OLE DB composta
da più passaggi. Controllare i singoli valori di stato OLE
DB, se disponibili. Nessuna operazione eseguita."
Il sorgente:
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
' Il problema si presenta sia usando un DSN definito
' che senza DSN come in questo caso.
cn.Open "UID=x;PWD=y;Driver={MySQL};DSN=;Server=255.255.255.255;DB=x;"
' Il problema si presenta anche usando adUseClient.
rs.CursorLocation = adUseServer
' Il problema si presenta anche utilizzando diversi tipi
' di CursorType, LockType e Options (li ho provati tutti!)
rs.Open "select * from tabella where codice = 'X';", cn, _
    adOpenDynamic, adLockOptimistic
' Se la lunghezza di rs("descrizione") è >= 3, non da errori.
' Se la lunghezza di rs("descrizione") è < 3 c'è l'errore.
rs("descrizione") = "123"
rs.Update
rs.Close
cn.Close
In soldoni il problema è che rs("descrizione").ActualSize
è sempre uguale a rs("descrizione").DefinedSize.
Utilizzando direttamente una query per aggiornare i campi non
ci sono problemi, mentre utilizzando l'aggiornamento nella
maniera descritta, provoca l'errore. Ora io per varie ragioni
vorrei usare l'aggiornamento tramite il .update, evitiamo
quindi risposte del tipo "usa le query per aggiornare...".
Lo so come si fa, ma non voglio usarle. Qualche idea?
Grazie (ehi! finalmente posto anch'io un messaggio luuungo!).


Unica cosa possibile:
In Data entry impedisci all'utente di inserire più dati di quelli
contenibili.
Personalmente eseguo la connection dei controlli dati txt con codice tipo:
                With rsEdit
                    nType = .Fields(sDataField).Type
                    If nType = adVarWChar Or nType = adVarChar Then
                        nLen = .Fields(sDataField).DefinedSize
                    End If
                End With
                With ctr
                    If TypeOf ctr Is TextBox Then
                        .MaxLength = nLen
                    End If
                    Set .DataSource = rsEdit
                End With
dove:
rsEdit è il recordset in data entry
ctr è il txtfield da connettere alla fonte dati
Oppure in salvataggio dati devi eseguire un loop sui .fields per "tagliare"
i campi di tipo char/varchar alla definedsize
ciao
ugo

 Si verifica con qualunque database.
Ok, ma allora cosa l'hanno implementato a fare il .update?
Ogni volta che memorizzo una stringa, devo fare...
rs("descrizione") = _
    left$("testo" & space$(lunghezza_campo), lunghezza_campo)
La stessa cosa succede anche per RDO?


Non so se l'errore sia il medesimo, ma è probabile.
ciao
ugo

 Non so se l'errore sia il medesimo, ma è probabile.
Su 
msdn.micorsoft.com
 e su 
support.microsoft.com
 non ho trovato
molto riguardo a questo errore. Per caso sai se la M$ ha intenzione
di risolvere il problema? Ho provato a scaricare anche gli ultimi
aggiornamenti da 
www.microsoft.com/data
 ma l'errore persiste.


*********************
e con le griglie ??? (non esiste il MaxLength di una colonna!!!)
*********************



Ma puoi fare una validazione che tagli l'inserimento alla lunghezza giusta.
Fermo restando che una griglia non è affatto il posto più adatto per il data
entry...
ciao
ugo