+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Tipi di dati non corrispondenti nell'espressione criterio

  1. #1
    rashid non  in linea Novello
    Buongiorno a tutti.

    Ho questo frammento di codice che mi crea problemi:

    codice HTML:
                For i = 0 To righe - 1
                    dbcomm1.CommandText = "SELECT Disponibile, Ordinato, D, O FROM Prodotti WHERE (Codice = '" + DGVPrev.Rows(i).Cells(6).Value + "')"
                    reader1 = dbcomm1.ExecuteReader
                    While reader1.Read
                        dbcomm.CommandText = "UPDATE Prodotti set Disponibile=@disponibile, Ordinato=@ordinato, D=@d, O=@o WHERE (Codice ='" + DGVPrev.Rows(i).Cells(6).Value + "')"
                        dbcomm.Parameters.AddWithValue("@disponibile", reader1(0) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@ordinato", reader1(1) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@d", reader1(2) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@o", reader1(3) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.ExecuteNonQuery()
                        dbcomm.Parameters.Clear()
                    End While
                Next
    Dal debug esce "Tipi di dati non corrispondenti nell'espressione criterio". Non capisco quale possa essere il problema dato che tutti i dati sono numeri decimali ad eccezione di quello inserito nella clausola WHERE che String.

    Dove sbaglio?

  2. #2
    L'avatar di _alka_
    _alka_ non  in linea Very Important Person
    Quote Originariamente inviato da rashid Visualizza il messaggio
    Ho questo frammento di codice che mi crea problemi [...]
    Qual l'istruzione sulla quale ti viene segnalato il problema?

    Indicativamente, pare che tu vada ad assegnare valori di tipo C# diverso da quelli richiesti nel DB: se non ricordo male, se usi AddWithValue() senza indicare il tipo, non viene effettuata una conversione automatica e la tipologia di dato viene acquisita in base al valore passato, che potrebbe essere diverso.

    Ciao!
    ℹ️ Leggi di pi su _alka_ ...

  3. #3
    Sgrubak non  in linea Scribacchino
    Aggiungerei anche che pulire la collection Parameters, mi sembra un dispendio inutile di calcolo. A gusto, dichiarerei i parametri fuori dal ciclo e nel ciclo cambierei i valori.

    Utilizzerei anche gli opportuni metodi "Get..." per evitare che al parametro venga assegnati un Object con relative complicazioni di cast.

  4. #4
    rashid non  in linea Novello
    Grazie ragazzi per la vostra disponibilit!
    Quote Originariamente inviato da _alka_ Visualizza il messaggio
    Qual l'istruzione sulla quale ti viene segnalato il problema?
    Il problema veniva segnalato su
    dbcomm.ExecuteNonQuery
    
    Ma ho risolto. Utilizzando un parametro anche per la clausola WHERE, cos:
               For i = 0 To righe - 1
                    dbcomm1.CommandText = "SELECT Disponibile, Ordinato, D, O FROM Prodotti WHERE (Codice = '" + DGVPrev.Rows(i).Cells(6).Value + "')"
                    reader1 = dbcomm1.ExecuteReader
                    While reader1.Read
                        dbcomm.CommandText = "UPDATE Prodotti set Disponibile=@disponibile, Ordinato=@ordinato, D=@d, O=@o WHERE (Codice=@codice)"
                        dbcomm.Parameters.AddWithValue("@disponibile", reader1(0) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@ordinato", reader1(1) + DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@d", reader1(2) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@o", reader1(3) - DGVPrev.Rows(i).Cells(9).Value)
                        dbcomm.Parameters.AddWithValue("@codice", DGVPrev.Rows(i).Cells(6).Value)
                        dbcomm.ExecuteNonQuery()
                        dbcomm.Parameters.Clear()
                    End While
                    reader1.Close()
    
    Solo che adesso spuntato un altro problema.

    Sul Database l'istruzione UPDATE non mi aggiorna i dati, ad eccezione dell'ultimo.
    Cerco di spiegarmi meglio...
    Se sul datagridview ho 10 righe l'istruzione UPDATE mi lascia intatte le prime nove e mi aggiorna solo la decima.

  5. #5
    Sgrubak non  in linea Scribacchino
    Quote Originariamente inviato da rashid Visualizza il messaggio
    Se sul datagridview ho 10 righe l'istruzione UPDATE mi lascia intatte le prime nove e mi aggiorna solo la decima.
    E la variabile [righe] quanto vale ad inizio ciclo For?

  6. #6
    rashid non  in linea Novello
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    E la variabile [righe] quanto vale ad inizio ciclo For?
    La variabile righe la ricavo cos:
    righe = Ordini_cli.DGVOrd_Cli.Rows.Count
    

  7. #7
    Sgrubak non  in linea Scribacchino
    Ok, ma non risponde alla mia domanda.

    Quanto vale ad inizio ciclo? Riformulando, sei sicuro che il ciclo For venga eseguito il numero di volte atteso?

  8. #8
    rashid non  in linea Novello
    Dunque, se per esempio in DGVOrd_cli vi sono due righe la variabile [righe] vale sempre 2, la variabile [i] parte da zero e si ferma a 1 e il ciclo For viene eseguito due volte, esattamente come mi aspetto. Ho verificato col Debug. Solo che per qualche motivo a me ignoto l'istruzione UPDATE sembra ignorare la prima riga.

  9. #9
    Sgrubak non  in linea Scribacchino
    A questo punto verificherei che il reader venga correttamente valorizzato. Magari il caso di assegnare il parametro [@codice] anche alla SELECT di [dbcomm1]?

    Ed in ogni caso, l'assegnazione
    dbcomm.CommandText = "UPDATE Prodotti set Disponibile=@disponibile, Ordinato=@ordinato, D=@d, O=@o WHERE (Codice=@codice)"
    
    andrebbe fuori dai cicli. Anche fuori dal For...

  10. #10
    rashid non  in linea Novello
    Sgrubak buongiorno. Ho appena verificato i valori di reader1, ma sono corretti.


    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Ed in ogni caso, l'assegnazione
    1
    dbcomm.CommandText = "UPDATE Prodotti set Disponibile=@disponibile, Ordinato=@ordinato, D=@d, O=@o WHERE (Codice=@codice)"
    andrebbe fuori dai cicli. Anche fuori dal For...
    Ho provato ad assegnare i comandi fuori dai cicli, ma facendo cos il reader non viene valorizzato correttamente.

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 3
    Ultimo Post: 01-09-2015, 08:03
  2. Risolto: [VB2010 EE] Errore : tipi di dati non corrispondenti nell'espressione criterio
    Da antonello74 nel forum Visual Basic .Net
    Risposte: 10
    Ultimo Post: 03-09-2014, 12:52
  3. Funzione 'Concatena' non definita nell'espressione
    Da Ale Monza nel forum Microsoft Word
    Risposte: 4
    Ultimo Post: 12-06-2011, 23:49
  4. errore di sintassi nell'espressione update
    Da mattoneo nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 11-11-2008, 18:08
  5. Tipi di dati non corrispondenti
    Da massimo74rn nel forum ASP 3, ASP .Net
    Risposte: 2
    Ultimo Post: 26-07-2008, 15:23