61 messaggi dal 13 giugno 2001
Buongiorno. Sto cercando di imparare .net utilizzando codice semplice per l'accesso ai dati.

Ho un problema con il datareader che mi restituisce un errore "System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto." proprio sul Reader.Read().

Spero vogliate aiutarmi :)

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Collections
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.Page
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.Data.SqlClient


Partial Public Class DataReader : Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

        Dim Reader As SqlDataReader = GetDataReader("SELECT top 10 * FROM informa")
        While Reader.Read
            Response.Write("<li>" & Reader.Item("id"))
        End While

    End Sub

    Public Function GetDataReader(ByVal query As String) As SqlDataReader

        Dim ConnectionString As String = ConfigurationManager.ConnectionStrings("SqlServer").ConnectionString
        Dim conn As New SqlConnection(ConnectionString)
        conn.Open()
        Dim cmd As New SqlCommand(query, conn)
        cmd.ExecuteReader(CommandBehavior.CloseConnection)
    End Function

End Class
Ma compila? Non so se sono ancora un po' addormentato io (probabile!) ma la tua funzione GetDataReader non mi sembra restituisca il datareader...

Inoltre verifica bene il codice che hai implementato perché non viene nè chiuso, nè rilasciato nessun oggetto (in particolare la connessione al database...)

Matteo Casati
GURU4.net
61 messaggi dal 13 giugno 2001
Mancava return!

   Dim cmd As New SqlCommand(query, conn)
        Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
aziendanet ha scritto:
Mancava return!


Quindi non ero così addormentato come pensavo!

Matteo Casati
GURU4.net
Ciao,

sarebbe comunque opportuno "Disposare" gli oggetti che implementano IDisposable.

Es. conn.Dispose(),Reader.Dispose()[Sottoposto a overload. Rilascia le risorse utilizzate dalla classe DbDataReader] e Reader.Close()

Fabrizio Canevali
non vorrei dire una castroneria ma non è necessario eseguire esplicitamente il disponse, chiuso il reader vengono rilasciate a cascata tutte le risorse.

ciao marco

p.s tra le altre cose ad esempio il Dispose di un SqlDataReader richiama il metodo close.

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
Sinceramente ho qualche dubbio anche io, però IMHO non userei mai una funzione "GetDataReader" come quella implementata da aziendanet. Mi ricorda un po' il vecchio approccio tanto usato (abusato) in classic asp: ne ho viste di pagine con un inlude in testa che apriva la connessione ed uno in fondo alla pagina che la chiudeva, lasciando per tutta la durata dell'esecuzione della pagina una bella connessione aperta e disponibile...

Insomma: si ha troppo poco controllo del codice eseguito e si generano un bel po' di problemi di gestione. Faccio degli esempi: come gestisco eventuali errori? E se mi servono delle transazioni (ok che il metodo è in lettura però mi sa che esiste il corrispondente in scrittura...)?

Non so, in generale credo sia ora (anzi, forse è già passata da un pezzo!) di approcciare le cose in modalità *realmente* OOP, applicando patterns e best practise e dimenticandoci un po' le tanto care librerie di funzioni generiche tipiche della programmazione procedurale.

Che ne dite?

Matteo Casati
GURU4.net
Ciao Marco,

qui entriamo in un mondo. Da MSDN:

È necessario chiamare in modo esplicito il metodo Close durante l'utilizzo dell'oggetto SqlDataReader per utilizzare l'oggetto SqlConnection associato per altri scopi.

Mediante il metodo Close vengono immessi i valori per i parametri di output, i valori restituiti e l'oggetto RecordsAffected, aumentando il tempo necessario per la chiusura di un oggetto SqlDataReader utilizzato per elaborare una query ampia o complessa. Quando i valori restituiti e il numero di record interessati da una query non sono significativi, il tempo necessario per chiudere l'oggetto SqlDataReader può essere ridotta chiamando il metodo Cancel dell'oggetto SqlCommand associato prima di chiamare il metodo Close.

Attenzione!
Non chiamare Close o Dispose su una connessione, un DataReader o qualsiasi altro oggetto gestito nel metodo Finalize della propria classe. In un finalizzatore, è necessario liberare solo le risorse non gestite possedute direttamente dalla propria classe. Se la classe non è proprietaria di alcuna risorsa non gestita, non includere un metodo Finalize nella relativa definizione di classe.

Close: Sottoposto a override. Chiude l'oggetto SqlDataReader.

Dispose: Sottoposto a overload. Rilascia le risorse utilizzate dalla classe DbDataReader

Dispose e Close agiscono in modo assolutamente differente, non avrebbe avuto senso implementare il metodo Close se Dispose avesse implicitamente chiuso l'oggetto SqlDataReader.

Fabrizio Canevali

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.