CAST NON VALIDO DALLA STRINGA 'NOME_STRINGA' AL TIPO 'INTEGER'

di il
2 risposte

CAST NON VALIDO DALLA STRINGA 'NOME_STRINGA' AL TIPO 'INTEGER'

Buongiorno a tutti, sono nuovo nel campo e mi scuso fin da subito se le mie domande sono da ignorante.

Vengo al dunque... sto creando un programma che è connesso ad un database in access. Ora mi sono imbattuto in un problema che mi crea un grattacapo.

Devo trasferire delle informazioni da dalle celle del database a delle textbox, ma al momento dell'esecuzione del codice viene fuori il messaggio "CAST NON VALIDO DALLA STRINGA 'MON1' AL TIPO 'INTEGER' ".
Ora... La stringa MON1 è la colonna del mio database da quale deve prendere il dato.
La colonna del database è formattata come testo breve e all'interno c'è scritto qualcosa come pippo(per provare).

Il codice incriminato è il seguente:

Private Sub Calendario_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim PercorsoDB As String = CurDir() & "\teacherclass.mdb; Encrypt Password=False;Mask Password=False"
Dim DBconnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & PercorsoDB
Dim database As New OleDbConnection(DBconnString)

Dim dr As OleDbDataReader
Dim cmd As OleDbCommand
Dim sql As String

database.Open()
Try

sql = "SELECT Mon1 FROM Login WHERE Username='" & Lbl_name.Text & "'"
cmd = New OleDbCommand(sql, database)

dr = cmd.ExecuteReader

Do While dr.Read()
Txt_mon1.Text = dr.GetString("Mon1")

Loop
Catch ex As Exception

End Try

database.Close()

End Sub
End Class


Se qualcuno mi aiuta gli sarò eternamente grato.

2 Risposte

  • Re: CAST NON VALIDO DALLA STRINGA 'NOME_STRINGA' AL TIPO 'INTEGER'

    Salve,
    come puoi vedere in https://docs.microsoft.com/it-it/dotnet/api/system.data.sqlclient.sqldatareader.getstring?view=netframework-4.8, GetString accetta un intero come parametro (quindi eventualmente l'ordinale della colonna) e non una string (il nome della colonna)... puoi pero' nel caso risolvere il problema con
    Txt_mon1.Text = dr.GetString(dr.GetOridnal("Mon1"))
    che fornisce al metodo appunto l'ordinale della colonna in base al suo "nome"...

    [edit] ovviamente, se la lettura deve essere effettuata in un ciclo, com nel tuo DO WHILE, e' meglio recuperare l'ordinal prima del ciclo e quindi usare quel riferimento numerale all'interno del ciclo:
    Dim iField as integer = dr.GetString(dr.GetOridnal("Mon1"))
    Do While dr.Read()
    Txt_mon1.Text = dr.GetString(iField)
    Loop
    pero' c'e' un altro problema in quel ciclo, in quanto Txt_mon1 viene sempre sovrascritto ad ogni ripetizione del ciclo, qundi, all'uscita del Do While, Txt_mon conterra' SOLO il valore dell'ultima riga recuperata dal Reader... in questo caso, se vuoi TUTTI i valori, oltre ad impostare Txt_mon come multiline, ti conviene concatenare i valori e valorizzare il texbox solo alla fine, ad esempio con uno StringBuilder (https://docs.microsoft.com/it-it/dotnet/standard/base-types/stringbuilder), quindi, ad esempio
    Dim iField as integer = dr.GetString(dr.GetOridnal("Mon1"))
    Dim builder As New System.Text.StringBuilder

    Do While dr.Read()
    builder.AppendLine(dr.GetString(iField))
    Next

    Txt_mon1.Text = builder.ToString
    saluti omnia
    --
    Andrea
  • Re: CAST NON VALIDO DALLA STRINGA 'NOME_STRINGA' AL TIPO 'INTEGER'

    Ciao andrea, grazie della risposta immediata!

    Ho provato la prima stringa che mi hai proposto e funziona benissimo.
    Per il problema della textbox sovrascritta, non ho avuto nessun tipo di riscontro, perché utilizzo più textbox.

    Sei stato comunque esaustivo nella tua spiegazione. Grazie.
Devi accedere o registrarti per scrivere nel forum
2 risposte