Newsgroup: it.comp.lang.visual-basic
Titolo: commandbuilder prima del suicidio

Salve,
 
sto ancora tentando di updatare un record su un database Access, 
stavolta inserendo il commandbuilder come suggerito (l'altra volta ha 
funzionato, or non pi�).
 
Allora la tabella che devo leggere (si chiama neurotest) � definita cos� 
  (in Design View):
 
Id_esame   	Long integer
Id_visita  	Integer
Patologia  	String(6)
Professione  	String(20)
 
.... etc.  (altre 11 variabili)
 
 
Tento di fare un test di update in questo modo :
 
  Private Sub bUpdate_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles bUpdate.Click
 
 
   	Dim ds As New DataSet
         Dim cb As OleDbCommandBuilder
         Dim da As OleDbDataAdapter
         Dim connecNpaz As OleDbConnection
         Dim cnStringNpaz As String
 
         Dim sqlNpaz As String
         cnStringNpaz = "Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=D:\XDAT\neuropstat.mdb;"
         connecNpaz = New OleDbConnection(cnStringNpaz)
 
         sqlNpaz = "SELECT * FROM Neurotest ORDER BY Id_visita, Id_esame"
 
         Try
             connecNpaz.Open()
             da = New OleDbDataAdapter(sqlNpaz, connecNpaz)
             da.Fill(ds)
 
             cb = New OleDbCommandBuilder(da)
 
             For i = 0 To 2
 
                 ds.Tables(0).Rows(i).Item(11) = "123"
                 ds.Tables(0).Rows(i).Item(13) = "124"
 
 
             Next
 
             da.Update(ds)
 
 
             connecNpaz.Close()
 
         Catch ex As Exception
             MsgBox(ex.ToString)
         End Try
 
End Sub
 
----------------------------
Dov'� che sbaglio ??? Ho copiato tale e quale da un esempio
( su Home & Learn)
 
Grazie dei feedback.
 
John.


 
e oltre a questo errore, non fa nessun update del database, nonostante 
il commandbuilder....  :-((
 
 


EH EH EH.....
codesto è un classico errore di quando ficco rape nei bulloni!
 
Te lo spiego in termini terra terra....quello che ti da noia sono i 
dettagli che non ci dici
 
esempio
 
Tabella Persona
Nome
Cognome
Indirizzo
etc etc
 
tu ci dici questo....
poi ci dici....
Nome="pippo"
Cognome="pluto"
 
update....cazzo non va!
 
 
Quando fa l'update il command builder (che ti aiuta ma RIPETO....non è 
indovino...l'iterfaccia neuronale che capisce quello che si vuol fare ce 
la dovete sviluppare voi neurodottori!)...si crea anche le query di update!
 
se uno dei dettagli non è imputato
 
ad esempio tu hai impostato
NUMTESSERASANITARIA 20 cifre obbligatorie
e NOn gli fornisci un valore....la query fallisce! Per vincoli del database
 
O ancora peggio se è scritta male...si aspetta numeri e gli dai lettere!
 
 
Oppure
un po più sofisticato e non credo sia il caso tuo ...ma ti fa bene 
saperlo...
se la query di select
contiene vincoli di integrità referenziale o campi calcolati....
la SELECT viene bene...ma i vari update vanno gestiti a mano casomai cn 
una transaction e più query!
 

>
 
 
ho ricontrollato tutto venti volte. Il codice è poco e semplice.
 
faccio un test cretino, assegnando due stringhe a dei valori che sono 
dichiarati
Patologia =  Text (length 6)
Professione  = Text (legth 20)
 
anche assegnando dei campi più corti, come "123" non ho mai avuto problemi.
Comunque per maggior sicurezza, ho fatto anche quello : o messo campi 
lunghi esattamente per tutta la lunghezza. Stesso problema.
 
C'è una cosa che non ho detto ma che è proprio l'unica che potrebbe 
influenzare :  la tabella "neurotest" l'ho copiata da un'altra tabella, 
che si chiamava "neuropaz" che però conteneva solo quattro campi.
 
Ebbene ho copiato quella tabella, e l'ho 'rieditata' in 'Design mode' 
con Access.
Cioè ho aggiunto altri 11 campi. Il contenuto è rimasto intatto.
La nuova tabella l'ho chiamata 'Neurotest' ed è quella su cui faccio il 
test.
 
In effetti, il tutto in 'Design View'ha funzionato perfettamente, senza 
errori visibili.
 
Ma penso che questa sia una operazione lecita no?
 
Volevo evitare di 'copiarmi' tutti i 46000 record da una tabela 
all'altra.  Mi veniva meglio  integrare le informazioni riempendo i 
nuovi campi in un secondo tempo.
 
Tu dici che questa operazione potrebbe aver causato questi problemi ???
 
 

                 ds.Tables(0).Rows(i).Item(13) = "124"
 
prova cambiando l'istruzione For cos� :
 
 For i = 1 To 3
 
 
 
 


� cambiato il messaggio di errore :
 
 
"The UpdateCommand affected 0 of the expected 1 records"
 
sempre pi� misterioso, ma almeno qualcosa si � mosso.... :-(
 
Grazie comunque.
 

> On 13/06/2012 00:18, john wrote:
 
Il messaggio di errore è chiaro!
tipo di dato sbagliato nei criteri della query!
 
 
ORA l'errore spesso è stupido
 
 
esempi
 
Campo PINCOPALLINO TIPO numero
e
nell'update c'è '123' invece di 123 ...se metti gli apici è un valore 
testuale!
 
oppure
 
UPDATE
bla bla bla
WHERE IDscheda="141414"
o idscheda=""
o idscheda=
 
EBBENE
il dataadapter per aggiornare ti fa una query di aggiornamento LEGATA ad 
un campo chiave primaria (per aggiornare SOLO quello che hai modificato 
e non tutto!)
 
Prova a mettere uno STOP...esegui passo passo....
e GUARDA che tipo di query esegue per AGGIORNARE....
se guardi bene ti dice CHE query sql esegue per aggiornare....vedrai che 
ci sarà una condizione....where tipicamente...BENE QUELLA LI viene 
imputata male!!!

 imputata male!!!
 
Da diverse righe di errore...Tutte hanno 
DBDataAdapter...UpdatefromDataTable... ma non c'é nessuna menzione a 
Query....
Dice solo OLeDbException 'Data Type mismatch in criteria expression'.
 
Comunque ho visto che se ritorno al record layout originale mi funziona.
Quindi ne desumo che il codice è corretto.
D'altronde è talmente cretino che é impossibile che abbia fatto un 
errore in due righe di codice, soprattutto per quello che riguarda il 
Type match....
 
Comunque  grazie del feedback.