Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB.NET] Execute reader non funziona

    Salve a tutti.
    Ho un database su Postgres e ci accedo tramite ado.net da un programma scritto in vb.net.
    Il programma in pratica è un calendario per gestire dei promemoria, che vengono salvati su di un database. All'avvio con una select volevo mettere in grassetto tutte le date sulle quali è presente almeno un promemoria. L'oggetto DateTimePicker non andava bene, quindi ne sto usando un altro che supporta il grassetto (non mi ricordo il nome..).
    Andiamo al dunque....
    l'oggetto Odbc.OdbcConnection è globale, lo inizializzo nel load del form principale, per poi utilizzarlo in seguito.
    La connessione avviene regolarmente perchè l'inserimento dei dati funziona
    codice:
    Private Sub NEWBUTTON_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NEWBUTTON.Click
            Dim selectedDate As Date = calendar.SelectionRange.Start
            Dim SQL As String
            SQL = "insert into promemoria (data,message,ora) values ('"
            SQL += selectedDate + "'"
            SQL += ",'" + MESSAGE.Text + "'"
            SQL += ",'" + H.Text + ":" + M.Text + ":00" + "')"
            'SQL string tested with postgres
            Dim insert As Odbc.OdbcCommand
            insert = New Odbc.OdbcCommand()
            insert.Connection = Conn
            Conn.Open()
            insert.CommandText = SQL
            If insert.ExecuteNonQuery() = 1 Then
                calendar.AddBoldedDate(selectedDate)
                calendar.Refresh()
                MessageBox.Show("inserimento riuscito", "SUCCESS", MessageBoxButtons.OK)
            End If
            Conn.Close()
        End Sub
    Il problema ce l'ho quando devo fare una select, con dei dati in output.
    la sinassi è pressochè la stessa, a parte il fatto che utilizzo executereader e non execute normale.
    eccovi il codice
    codice:
        Private Sub calendar_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles calendar.DateChanged
            Dim SQL As String = "select data from promemoria"
            Dim selectedDate As Date = calendar.SelectionRange.Start
            Dim conta As Odbc.OdbcCommand
            Dim read As Odbc.OdbcDataReader
            conta = New Odbc.OdbcCommand(SQL, Conn)
    
            Conn.Open()
            read = conta.ExecuteReader()
            Dim s As Object = read(0).ToString
            calendar.AddBoldedDate(s)
            read.Close()
            Conn.Close()
        End Sub
    ho provato a spostare la chiusura del reader e della connessione, ad utilizzare item(i) per accedere ai dati ed altro, ma il risultato è sempre lo stesso: solito errore che afferma che non esiste alcun oggetto per la riga/colonna


    Datemi una mano che è da un pò che ci batto la testa
    Grazie in anticipo. Cordiali saluti

  2. #2

  3. #3
    Originariamente inviato da gibra
    Riga dell'errore?
    Mettere un Try/Catch?
    la riga è
    Dim s As Object = read(0).ToString
    l'errore è quello della foto.
    L'idea del try catch è buona, come ho fatto a non pensarci?
    ho cambiato il codice nel seguente, aggiungendo il try catch
    codice:
        Private Sub calendar_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles calendar.DateChanged
            Dim SQL As String = "select data from promemoria"
            Dim selectedDate As Date = calendar.SelectionRange.Start
            Dim conta As Odbc.OdbcCommand
            Dim read As Odbc.OdbcDataReader
            conta = New Odbc.OdbcCommand(SQL, Conn)
            Conn.Open()
            read = conta.ExecuteReader()
            Dim s As Date
            Try
                s = read(0).ToString
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
    
            calendar.AddBoldedDate(s)
            read.Close()
            Conn.Close()
        End Sub
    lascia stare il fatto che che dichiaro s come data e oi lo uso come stringa, m'è rimasto da prima, non cambia l'errore qualunque sia il tipo...

    il messagebox da il seguente errore


    Grazie per il suggerimento del try catch.
    Qualche idea per la soluzione?
    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Ci sono alcune cosette da considerare:

    1) prima di tutto è consigliabile utilizzare nomi più 'logici'.
    read è il nome di un metodo, usarlo come nome di un oggetto è da temerari e può solo creare confusione.

    2) prima di accedere al DataReader è buona norma verificare che contenga righe,
    metti che un'altro utente abbia cancellato il record. Per cui:
    codice:
    If read.HasRows Then
        ' proseguo
    End If
    3) il metodo Read legge una riga del DataReader, quindi l'istruzione
    Dim s As Object = read(0).ToString
    è sbagliata sia perchè usa il metodo in maniera scorretta, sia perchè tenti di assegnare uno String ad un Object.
    Si dovrebbe usare uno degli appositi metodi, ad esempio:

    codice:
    Dim s As String = read.GetValue(0).ToString

  5. #5
    Grazie! si in effetti chiamare il reader read come il metodo per scorrere al record successivo è stata una pessima scelta... ho cambiato nome in List, ed ho aggiunto il controllo hasrows (non lo mettevo perchè sapevo che c'erano, ma quando finirò di sviluppare il programma all'inizio sarà vuoto)
    il codice aggiornato è
    codice:
        Private Sub calendar_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles calendar.DateChanged
            Dim SQL As String = "select data from promemoria"
            Dim selectedDate As Date = calendar.SelectionRange.Start
            Dim conta As Odbc.OdbcCommand
            Dim List As Odbc.OdbcDataReader
            conta = New Odbc.OdbcCommand(SQL, Conn)
            Conn.Open()
            List = conta.ExecuteReader()
            If List.HasRows Then
                For i = 0 To List.FieldCount
                    calendar.AddBoldedDate(List.GetValue(0))
                    List.Read()
                Next
            End If
            List.Close()
            Conn.Close()
        End Sub
    ed ora funziona! Grazie ancora gibra

  6. #6
    piccolissima modifica, nel ciclo for invece di fieldcount uso recordaffected, che fieldcount mi torna sempre 1... mentre recordaffected nel caso di una select del genere incloude tutte le righe

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Sprunk
    ho cambiato nome in List
    Perdona, ma dalla padella sei caduto nella brace!

    Così se altri dovranno manutenere il tuo codice, o fra un paio d'anni lo devi modificare tu stesso, sarà facile credere che List sia un oggetto ListBox, invece di un DataReader.
    Oltretutto, se non ti dai una regola sulla notazione, allora in futuro dovrai studiarti di nuovo tutto il codice solo per capire gli oggetti che hai usato, come e perchè.
    Non mi pare una bella prospettiva...

    Non capisco perchè non usi una notazione più 'chiara', ad esempio:

    drPromemoria oppure drMemo ...



Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.