Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: controllo EOF

  1. #1

    controllo EOF

    ciao a tutti , ho intitolato la discussione "controllo eof" perchè magari risulta + familiare ...

    devo in sostanza controllare se un datareader restituisce o nò dei dati

    -----------------------------------------------

    Dim quSQL2 As String = "SELECT DISTINCT ripetitore, id_c FROM vista_1 WHERE username='" & User.Identity.Name & "' AND id_m=" & var & " AND id_can=" & ide_can & ""
    Dim estraz As New SqlCommand(quSQL2, cnx)

    cnx.Open()

    Dim rid As SqlDataReader
    rid = estraz.ExecuteReader()

    dd_ripe.DataSource = rid

    If rid.Read = False Then
    dd_ripe.Visible = False
    Else
    dd_ripe.DataTextField = "ripetitore"
    dd_ripe.DataValueField = "id_c"
    dd_ripe.DataBind()
    dd_ripe.Visible = True
    End If


    cnx.Close()
    ------------------------------------------------

    così facendo però mi manca sempre un valore nel mio dd list ! non sò come mai ma il controllo IF ... è come se venisse eseguito (quindi si sposta avanti di una riga) , ma io non voglio !

    io voglio solo che SE .... allora ....
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Tu hai un controllo DataList che è popolato da un DataReader.
    Non ti devi preoccupare se il DataReader restituisce dati o meno perché, se non ne restituisce, il sistema non scrive la griglia, cioè, è come scrivesse: dd_ripe.Visible = False.
    Altrimenti popola il controllo.

    Ma se proprio vuoi sapere quanti record restituisce l'istruzione sql usata dal DataReader, puoi costruirti una funzione generale riutilizzabile che fa ciò.

    Ciao

  3. #3
    no no, io con il datareader popolo una dropdownlist

    il problema è che dopo il controllo mi viene "bruciato" un record (il 1°) come confermato anche da questo intervento
    http://forum.aspitalia.com/forum/top...D=12169#149999

    ogni tanto asp.net mi sembra .........

    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    La risposta che ti hanno dato nel link che hai riportato è sostanzialmente sbagliata.
    Lasciami 10 minuti per recuperare qualche esempio dal mio computer.
    Ciao

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ho risolto.
    Dunque, nell'sql che popola il DataReader puoi aggiungere WHERE 1=0, oppure WHERE 1=1, per simulare una assenza di dati.

    Dopo che hai popolato il DropDownList ed hai chiuso il data reader, puoi nascondere il DropDown con:

    Me.DropDownList1.Visible = Me.DropDownList1.Items.Count <> 0

    Ciao

  6. #6
    "Ooooo spectacular ... show time by pietro09 !"

    adesso provo !

    ----------

    ho provato anche solo con visualstudio ed effettivamente (mi era sfuggito) si può intercettare quanti item ci sono nel dd_list

    a sto punto dovrebbe essere fatto.

    Resta comunque il fatto (curioso) che facendo il controllo sul datareader viene "bruciato" un record....

    mi piacerebbe sapere se ad esempio nella 1.1 del framew. il problema sia stato risolto... è assurdo che controllando non posso più disporre della situazione precedente al controllo ...

    grazie pietro !
    Frate Priore: "È Lucifero in persona!"
    Trinità: "Lo conosci?"
    Bambino: "Mai sentito nominare, deve essere un professionista dell'est"

  7. #7
    Utente di HTML.it L'avatar di Legnetto
    Registrato dal
    May 2002
    Messaggi
    1,419
    Da tenere presente!!!
    If datareader.read then '...il reader si posiziona sul primo dato.
    Ogni cosa fatta qui parte dal secondo dato e non dal primo!
    End if
    Ciao
    Legnetto

  8. #8
    io faccio cosi e non ho mai avuto problemi, questa funzione sta dentro ad una classe perciò regolati...
    codice:
    Public ConnectionString As String
    Dim objConn As New OleDbConnection()
    Dim objCmd As New OleDbCommand()
    
    public Function SelectSQL(ByVal strSelect As String) As OleDbDataReader
       Try
           objConn = New OleDbConnection(ConnectionString)
           objCmd = New OleDbCommand(strSelect, objConn)
           objCmd.Connection.Open()
           Return objCmd.ExecuteReader
           objCmd.Connection.Close()
       Catch ex As OleDbException
           Return Nothing
       End Try
    End Function
    
    praticamente io dalal pagina aspx gli passo le variabili pubblcihe e poi richiamo la quella funzione per poi controllare il contenuto restituito
    if not objReader is nothing then
    	'bravo è pieno
    else
    	Errore.Visible = True
    	Errore.Text = "ERRORE"
    end if

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da Trinità

    Resta comunque il fatto (curioso) che facendo il controllo sul datareader viene "bruciato" un record....

    mi piacerebbe sapere se ad esempio nella 1.1 del framew. il problema sia stato risolto... è assurdo che controllando non posso più disporre della situazione precedente al controllo ...
    Carissimo Trinità: non sono molto diplomatico e ti chiedo scusa, ma, il problema non è nel DataReader, che funziona benissimo, ma nel modo sbagliato di usarlo.
    Vediamo un poco. Se vogliamo più prestazioni possiamo usare il DataSet col DataAdapter, ma per popolare un DropDown è troppo pesante (secondo me è come affittare una gru per automotrice per sollevare una carriola! )
    Per snellire l'accesso ai dati è stato creato un nuovo oggetto, il DataReader che mantiene in memoria, non tutta la tabella, ma un record per volta. Questo oggetto non ci dice se la tabella è piena o vuota, perché non è stato creato per questo. L'unico modo di usarlo è fare una scansione della tabella con un ciclo:
    Do While DataReader.Read()
    'leggo i campi che interessano
    Loop
    Se voglio sapere se la tabella è piena o vuota, l'unico modo è sapere se il programma entra dentro il ciclo. Un modo è quello di creare una variabile NumeroRecord inizializzata a zero e aggiornarla dentro il ciclo.
    All'uscita basta controllare se il valore è zero o superiore.

    Poi un'altra considerazione. Il controllo DropDown viene popolato di solito con l'istruzione DataBind. Non so come funzioni, ma penso che sia un metodo che, passandogli il DataReader come DataSource, il DataTextField, il DataValueField, faccia una scansione del DataReader, e popoli di DropDown nella scansione. Se tu prima fai DataReader.Read, questa funzione non può saperlo perchè presume che il DataReader punti al record -1.

    Va bene, sono un cane a spiegare: ti mando un po' di codice per riempire il DropDown, vedi se ti può servire:
    codice:
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            BindData()
        End Sub
    
        Private Function ConnectionString() As String
            Return Application("connessione_access_prova").ToString
        End Function
    
        Private Function Query() As String
            Return "SELECT ID, TESTO FROM CAMPI WHERE 1=1"
        End Function
    
        Private Sub BindData()
            Dim Connection As New OleDbConnection(ConnectionString())
            Connection.Open()
            Dim Comand As New OleDbCommand(Query(), Connection)
            Dim DataReader As OleDbDataReader = Comand.ExecuteReader(CommandBehavior.CloseConnection)
            Dim NumeroRecord% = 0
            Do While DataReader.Read()
                NumeroRecord += 1
                Me.DropDownList1.Items.Add(New ListItem(DataReader.GetString(1), DataReader.GetInt32(0).ToString))
            Loop
            DataReader.Close()
            Connection.Close()
            Me.DropDownList1.Visible = (NumeroRecord <> 0)
        End Sub

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da Daniele80
    io faccio cosi e non ho mai avuto problemi, questa funzione sta dentro ad una classe perciò regolati...
    codice:
    Public ConnectionString As String
    Dim objConn As New OleDbConnection()
    Dim objCmd As New OleDbCommand()
    
    public Function SelectSQL(ByVal strSelect As String) As OleDbDataReader
       Try
           objConn = New OleDbConnection(ConnectionString)
           objCmd = New OleDbCommand(strSelect, objConn)
           objCmd.Connection.Open()
           Return objCmd.ExecuteReader
           objCmd.Connection.Close()
       Catch ex As OleDbException
           Return Nothing
       End Try
    End Function
    
    praticamente io dalal pagina aspx gli passo le variabili pubblcihe e poi richiamo la quella funzione per poi controllare il contenuto restituito
    if not objReader is nothing then
    	'bravo è pieno
    else
    	Errore.Visible = True
    	Errore.Text = "ERRORE"
    end if
    Anch'io utilizzo questa funzione, leggermente modificata, ma ti assicuro che restituisce nothing se si è verificato un errore, altrimenti restituisce un puntatore a OleDbDataReader e non mi dice assolutamente se la tabella è piena o vuota.

    Ciao

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.