Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204

    Visualizzare un indice argomenti di libro da DB

    Salve a tutti,

    ecco il mio problema: sto costruendo una pagina ASP.NET che visualizzi
    un indice tipo quello della "Guida ASP.NET 2.0" http://aspnet.html.it/guide/leggi/98/guida-aspnet-20/ su HTML.it.
    L'indice mostra i nomi dei capitoli come semplice testo mentre i nomi delle
    lezioni sono link.
    Tanto per intenderci:

    MASTER PAGE E NAVIGAZIONE (Nome del Capitolo1 - semplice testo -)
    - Creare una Master Page (Lezione1 del Capitolo1 - Link -)
    - Master Page Annidate (Lezione2 del Capitolo1 - Link -)
    - Modifiche runtime alle Master Page (Lezione3 del Capitolo1 - Link -)

    Riprendendo l'esempio della guida qui di ASP.NET ho realizzato due tabelle
    "Capitoli" e "Lezioni" ed ho scritto la query che vedete anche nell'immagine:

    SELECT Lezioni.ID_Lezione, Lezioni.Nome_Lezione, Lezioni.Ordine_Apparizione_Lezione
    FROM Lezioni INNER JOIN
    Capitoli ON Lezioni.ID_Capitolo = Capitoli.ID_Capitolo
    ORDER BY Capitoli.Ordine_Apparizione_Capitolo, Lezioni.Ordine_Apparizione_Lezione

    Questa inserita in un SqlDataSource collegato ad un DataList mi permette di visualizzare
    l'elenco delle lezioni ordinate in base "Ordine_Apparizione_Capitolo" ed all'interno
    di questo in base a "Ordine_Apparizione_Lezione".
    La cosa che non riesco a fare è scrivere il nome del Capitolo prima delle rispettive lezioni.

    Qualche suggerimento ?
    Grazie. RobyUA.
    Ho bisogno di ferie !!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204
    Ops dimenticavo l'immagine
    Immagini allegate Immagini allegate
    Ho bisogno di ferie !!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204
    Neanche un aiutino ???
    Accidenti non credevo di aver toccato
    un argomento così difficile
    Dove sono i GURU ASP.NET di HTML.it ????
    Please help !!!
    Ho bisogno di ferie !!!

  4. #4
    io non userei un SqlDataSource, non saprei come farlo con quello.

    Non puoi farlo via codice annidiando due cicli?
    Uno che ti legga i capitoli e te li scriva volta per volta a video e un'altro, quello interno, che scriva tutti i link di quel capitolo prima di passare al successivo?.

    Il risultato sarebbe quello che cerchi. Come li fai scrivere a video adesso? Dentro che cosa?

  5. #5
    Prova questo codice:
    codice:
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.OleDb" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        Protected Sub btnIndice_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            lblIndice.Text = "" 'Svuoto la label per generare un nuovo indice
            Dim cn As OleDbConnection
            Dim cmd As OleDbCommand
            Dim drTitoli As OleDbDataReader
            Dim drLezioni As OleDbDataReader
            Dim str As String = ConfigurationManager.ConnectionStrings("TuaConnectionString").ConnectionString
            cn = New OleDbConnection(str)
            cn.Open()
            Dim strQuery As String = "SELECT * FROM Capitoli ORDER BY Ordine_Apparizione_Capitolo"
            cmd = New OleDbCommand(strQuery, cn)
            drTitoli = cmd.ExecuteReader()
            While (drTitoli.Read())
                lblIndice.Text += "titolo:" & drTitoli("Nome_Capitolo") & "<hr>"
                lblIndice.Text += "
    1. " ' Apro elenco numerato strQuery = "SELECT * FROM Lezioni" strQuery += strQuery & " WHERE IDcapitolo = " & drTitoli("ID_Capitolo") strQuery += strQuery & " ORDER BY Ordine_Apparizione_Lezione" cmd = New OleDbCommand(strQuery, cn) drLezioni = cmd.ExecuteReader() While (drLezioni.Read()) lblIndice.Text += "
    2. " & drLezioni("Nome_Lezione") & "" End While drLezioni.Close() lblIndice.Text += "
    " 'Chiudo elenco numerato End While drTitoli.Close() cn.Close() End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Indice del libro</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btnIndice" runat="server" OnClick="btnIndice_Click" Text="Genera indice" /></div> <asp:Label ID="lblIndice" runat="server" Text="Label"></asp:Label> </form> </body> </html>
    Dovrai metterci la stringa di connessione giusta, se non ne hai una inseriscila direttamente nel web.config che fa sempre comodo:
    codice:
    <connectionStrings>
        <add name="TuaConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\wwwroot\tuaCartellaProgetto\App_Data\tuoDatabase.mdb" providerName="System.Data.OleDb"/>
    </connectionStrings>
    Questo codice l'avevo già pronto, funziona, ho solo rinominato i campi

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204
    Ciao BSOD,

    ti ringrazio per aver risposto e per il codice che hai scritto,
    dopo mangiato provo subito ad implementarlo. Il sistema a due cicli
    annidati è quello che utilizzavo in ASP 3, pensavo che in ASP.NET
    si potesse fare in altri modi "più automatizzati" e non riuscivo a capire
    come specialmente in relazione con il DataList.
    Grazie ancora, ti faccio sapere come va.

    RobyUA
    Ho bisogno di ferie !!!

  7. #7
    Anche io sono appena migrato da classic ASP a .NET quindi considera che potrebbero esistere 10.000 metodi migliori per farlo che io, semplicemente, ignoro

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204
    Ciao BSOD,

    ho provato il tuo codice adattandolo alla mia necessità
    di connettermi ad un DB SQL Server 2005 Express Edition
    importando i namespace e modificando la query interna
    sostituendo il segno "+=" con un semplice "=").
    Ecco il codice:
    codice:
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.Sql" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        Protected Sub btnIndice_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            lblIndice.Text = "" 'Svuoto la label per generare un nuovo indice
            Dim cn As SqlConnection
            Dim cmd As SqlCommand
            Dim drTitoli As SqlDataReader
            Dim drLezioni As SqlDataReader
            Dim str As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            cn = New SqlConnection(str)
            cn.Open()
            
            Dim strQuery As String = "SELECT * FROM Capitoli ORDER BY Ordine_Apparizione_Capitolo"
            cmd = New SqlCommand(strQuery, cn)
            drTitoli = cmd.ExecuteReader()
            
            While (drTitoli.Read())
                lblIndice.Text += "titolo:" & drTitoli("Nome_Capitolo") & "<hr>"
                lblIndice.Text += "
    1. " 'Apro elenco numerato strQuery = "SELECT * FROM Lezioni" strQuery = strQuery & " WHERE ID_Capitolo = " & drTitoli("ID_Capitolo") strQuery = strQuery & " ORDER BY Ordine_Apparizione_Lezione" cmd = New SqlCommand(strQuery, cn) drLezioni = cmd.ExecuteReader() While (drLezioni.Read()) lblIndice.Text += "
    2. " & drLezioni("Nome_Lezione") & "" End While drLezioni.Close() lblIndice.Text += "
    " 'Chiudo elenco numerato End While drTitoli.Close() cn.Close() End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Indice del libro</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btnIndice" runat="server" onClick="btnIndice_Click" Text="Genera indice" /></div> <asp:Label ID="lblIndice" runat="server" Text="Label"></asp:Label> </form> </body> </html>
    Purtroppo però si verifica un errore: mandando in esecuzione il codice
    e facendo clic sul pulsante che dovrebbe generare l'indice, l'esecuzione si
    ferma e all'altezza di drLezioni = cmd.ExecuteReader() mi viene detto che
    al comando è associato un DataReader aperto che deve essere chiuso.



    Hai un'idea di come risolvere la faccenda ???
    Grazie in anticipo per la pazienza e l'aiuto.

    RobyUA.
    Immagini allegate Immagini allegate
    Ho bisogno di ferie !!!

  9. #9
    Ciao e scusa la tardiva risposta.

    Il codice l'ho testato prima di passartelo, parola di lupetto che funziona perfettamente.

    Se ti segnala quell'errore probabilmente in quella pagina includi un'altra connessione che, restandoti aperta, ti va in conflitto con quella del codice.

    Prova a cercare in quella direzione perchè il codice che hai postato dovrebbe essere a posto così com'è

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    204
    Originariamente inviato da BSOD
    Ciao e scusa la tardiva risposta.
    Il codice l'ho testato prima di passartelo, parola di lupetto che funziona perfettamente.
    Se ti segnala quell'errore probabilmente in quella pagina includi un'altra connessione che, restandoti aperta, ti va in conflitto con quella del codice.
    Prova a cercare in quella direzione perchè il codice che hai postato dovrebbe essere a posto così com'è
    Ciao BSOD
    grazie per la risposta e non preoccuparti per il ritardo avrai sicuramente avuto
    di meglio da fare.
    Per quanto riguarda il doppio ciclo ho risolto utilizzando (mi vergogno a dirlo) il
    tool grafico di Visual Web Developer inserendo all'interno di un DataList un altro DataList
    ed il tutto viaggia che è una meraviglia.
    Per quanto riguarda poi il messaggio "DataReader aperto che deve essere chiuso"
    ho risolto impostando il Multiple Active Results Set (MARS che da la possibilità
    di aprire contemporaneamente più Result Set nell'ambito della stessa connessione)
    a true nel web.config (non lo avevo fatto perchè in SQL 2005 è impostato a true
    di default ma si vede che nella documentazione si sono dimenticati di dire che
    nella versione express è impostato a false - o, con più probabilità, sono io
    che non ho cercato bene -).

    Ti ringrazio comunque della disponibilità,
    buona giornata
    RobyUA

    P.S. La tua soluzione rimane comunque molto valida !
    Ho bisogno di ferie !!!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.