Problema in lettura database access

di il
10 risposte

Problema in lettura database access

Ciao a tutti, non capisco il perchè di questa cosa.
effettuo la lettura di dati in un database access che premetto, scrivo correttamente il problema si pone quando vado a recuperare i dati che sono oltre un certo punto.
myConnection.ConnectionString = connString
Dim leggi As OleDb.OleDbDataReader
Dim cmd As New OleDb.OleDbCommand("Select *from Clienti where @ID=@ID")
cmd.Parameters.AddWithValue("@ID", tbID.Text)
myConnection.Open()
cmd.Connection = myConnection
leggi = cmd.ExecuteReader
While leggi.Read
tbID.Text = leggi("ID")
tbCognome.Text = leggi("cognome")
tbNome.Text = leggi("nome")
TBcittaNascita.Text = leggi("citta_nascita")
TBdataNascita.Text = leggi("data_nascita")
CBstatoCivile.Text = leggi("stato_civile")
TBresidenza.Text = leggi("residenza")
tbProvincia.Text = leggi("provincia")
tbVia.Text = leggi("via")
tbNumero.Text = leggi("civico")
tbCap.Text = leggi("cap")
tbProfessione.Text = leggi("professione")
TBcodfiscale.Text = leggi("codice_fiscale")
TBtelcasa.Text = leggi("telefono_casa")
TBtelufficio.Text = leggi("telefono_ufficio")
TBcellulare.Text = leggi("cellulare")
tbEmail.Text = leggi("email")
tbNote.Text = leggi("note")
'CBtipoabbonamento.Text = leggi("abbonamento")
'tbScadenza.Text = leggi("scadenza_abbonamento")
'cbPagamento.Text = leggi("tipo_pagamento")
'tbCertificato.Text = leggi("scadenza_certificato_medico")
'tbTessera.Text = leggi("tessera")
' tbOperatore.Text = leggi("operatore")
End While
myConnection.Close()
End If
Ovviamente l'apice l'ho messo solo per far capire da dove in poi il codice si blocca. non mi sembra abbia senso il blocco, ho provato anche ad abilitarne uno alla volta, o tutti insieme ma sempre lo setto errore restituisce.

nella riga CBtipoabbonamento mi dice: SystemInvalidCastExcwption: Cast non valido dal tipo 'DBnull' al tipo 'String'

Cosa può essere?

10 Risposte

  • Re: Problema in lettura database access

    Beh, mi sembra che il messaggio di errore sia abbastanza chiaro
    nel database, nel campo "abbonamento" c'è il valore null, e questo valore tenti di assegnarlo a CBtipoabbonamento.Text che invece è una proprietà di tipo String e non puoi assegnare un null a una variabile di tipo String
  • Re: Problema in lettura database access

    orione1976 ha scritto:


    nella riga CBtipoabbonamento mi dice: SystemInvalidCastExcwption: Cast non valido dal tipo 'DBnull' al tipo 'String'
    Il tipo DBNull identifica il valore "nullo" all'interno dei campi, come ti è stato detto.

    Si tratta di un valore che ha solo un'istanza attiva (DBNull.Value) e di cui non puoi fare il "cast" al tipo String in quanto appartengono a gerarchie diverse.

    Devi verificare l'appartenenza del campo al tipo DBNull, ad esempio
    If leggi("abbonamento") Is DBNull Then
    oppure confrontare direttamente il valore del campo con l'istanza di DBNull
    If leggi("abbonamento") = DBNull.Value Then
    Questo in linea generale.

    Se invece ti accontenti di ottenere una stringa vuota in caso di campo nullo, puoi anche seguire questa strada:
    
    CBtipoabbonamento.Text = leggi("abbonamento").ToString()
    
    Il metodo ToString() invocato su una istanza di DBNull restituisce una stringa vuota.

    Per tutti gli altri tipi di dati diversi da String però, il confronto suindicato è d'obbligo.

    Ciao!
  • Re: Problema in lettura database access

    Ciao, avevo pensato a quella cosa ma non è vera, nel senso che il campo è popolato non è vuoto.
    Oltretutto perchè nei campi precedenti se la textboxe d'inserimento è vuota mette un campo vuoto e lo rilegge correttamente ma da "abbonamento" in poi fa questa cosa? Ripeto, il campo non è vuoto nel database, ho anche ricontrollato
  • Re: Problema in lettura database access

    orione1976 ha scritto:


    Ciao, avevo pensato a quella cosa ma non è vera, nel senso che il campo è popolato non è vuoto.
    E allora hai pensato bene, ma hai controllato male.

    orione1976 ha scritto:


    Oltretutto perchè nei campi precedenti se la textboxe d'inserimento è vuota [...]
    Il contenuto della TextBox non ha importanza se stai mettendo al suo interno un nuovo valore preso da un campo.

    orione1976 ha scritto:


    Ripeto, il campo non è vuoto nel database, ho anche ricontrollato
    L'errore è chiaro: Cast non valido dal tipo 'DBnull' al tipo 'String'.
    Quindi se il campo non è vuoto, in qualche modo arriva vuoto (NULL).

    Ricontrolla il tutto, e alla peggio fai un progetto demo da distribuire e verificare (ma vedrai che durante questo processo trovi il punto dell'errore).

    Ciao!
  • Re: Problema in lettura database access

    Guarda, ho provato di tutto, anche a cambiare il metodo di scrittura anche se sinceramente non ne vedevo la necessità visto che i dati sono presenti nel database, ho cambiato il metodo di lettura e funziona senza errori... però mi piacerebbe capire il motivo perchè ok, funziona, problema risolto... ma perchè con il ciclo while faceva così?
    myConnection.ConnectionString = connString
    myConnection.Open()
    Dim leggi As OleDbDataReader
    Dim trova As String
    trova = "Select *from Clienti where ID = " & tbID.Text & ""
    Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
    cmd.ExecuteNonQuery()
    leggi = cmd.ExecuteReader()
    If leggi.Read = True Then
    tbID.Text = leggi("ID")
    tbCognome.Text = leggi("cognome")
    tbNome.Text = leggi("nome")
    con il codice sopra ripeto che legge tutto...
  • Re: Problema in lettura database access

    Nella query estrai i dati con ID = @ID, per cui quanti record ricaverai dalla tabella ??
    Secondo me uno solo, per cui la domanda successiva è: perchè hai bisogno di un WHILE per estrarre i dati ??
    Se devi leggere un solo record non ti serve un ciclo
  • Re: Problema in lettura database access

    orione1976 ha scritto:


    ma perchè con il ciclo while faceva così?
    Probabilmente perché nel primo codice la condizione del WHERE era [@ID = @ID] mentre con la seconda scrittura ha modificato con [ID =
    tbID.Text]

    Prima la condizione era sempre vera, quindi tirava fuori tutti i record e in qualcuno devi avere l'errore. Per come era scritto il ciclo, scorrevi praticamente tutta la tabella. Puoi provare a ritornare un momento al vecchio codice e al sollevamento dell'eccezione verificare se l'ID in esame corrisponde a quello che effettivamente avevi impostato.
  • Re: Problema in lettura database access

    orione1976 ha scritto:


    Guarda, ho provato di tutto, anche a cambiare il metodo di scrittura anche se sinceramente non ne vedevo la necessità visto che i dati sono presenti nel database, ho cambiato il metodo di lettura e funziona senza errori... però mi piacerebbe capire il motivo perchè ok, funziona, problema risolto... ma perchè con il ciclo while faceva così?
    [...]
    con il codice sopra ripeto che legge tutto...
    E' molto semplice: hai riscritto la query che inizialmente (non ci abbiamo fatto caso) era sbagliata.

    La query iniziale era così:
    Select *from Clienti where @ID=@ID

    In pratica, hai selezionato tutti i record dove il valore del parametro @ID è uguale al valore del parametro @ID: la query ti restituisce pertanto tutti i record della tabella!

    Usando il ciclo while(), effettuavi la scansione di tutti i record della tabella fino ad arrivare a quel record in cui il campo in questione era nullo, provocando l'errore.

    Adesso hai tolto il ciclo while(), ma in realtà il problema si è risolto cambiando la query, che è diventata così:
    "Select *from Clienti where ID = " & tbID.Text & ""

    In questa versione, pur togliendo (sbagliando) il parametro @ID, fai corretto riferimento al campo ID della tabella nella clausola WHERE, quindi ti viene di fatto restituito uno e un solo record, ossia quello che stai effettivamente cercando.

    A questo punto, che tu usi il ciclo while() oppure no, se nel campo incriminato è presente un valore come dici, il codice avrebbe funzionato in ogni caso.

    Riepilogando meglio in conclusione, è sufficiente che tu torni alla versione originale del tuo codice e correggi la query così:
    Select *from Clienti where ID=@ID
    eliminando quindi il carattere "@" di troppo.

    Va da sè comunque che quel campo su cui viene segnalato l'errore, per almeno un record contiene un valore nullo, e questa condizione rimane.

    Ciao!
  • Re: Problema in lettura database access

    Ok effettivamente avevo messo quella @ di troppo hai ragione (ovviamente) l'unica cosa che non capisco è che in quel campo non c'è un valore nullo (vuoto) ma è popolato con un testo, questo non capisco... e quindi mi dici che se uno dei campi rimane vuoto poi va in errore... e questo è strano perchè alcuni campi scritti prima sono vuoti e non lo segnala ma lascia la textbox vuota come vorrei.
    capisco che anche se funziona non è proprio corretto mettere ID= "textbox.text" e lo sistemerò.

    Faccio qualche altro test boh...
  • Re: Problema in lettura database access

    Attenzione che una stringa vuota e un NULL non sono la stessa cosa. Il campo "abbonamento" su qualche record è per forza NULL altrimenti non solleverebbe l'eccezione. Prova a fare una [Code]Select id from Clienti where abbonamento is null e lo scopri subito...
Devi accedere o registrarti per scrivere nel forum
10 risposte