Ti mando un esempio di due cicli con 2 datareader.
In pratica il primo ciclo fa la scansione delle provincie e, all'interno del ciclo, un ciclo annidato che fa la scansione dei comuni per la provincia appena scritta.
Nel mio codice sostituisci PrintLn con Response.write (xxx & "
")
e commenta This = Me
	codice:
	    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        This = Me
        ScansionaProvince()
    End Sub
    Private Sub ScansionaProvince()
        Dim StringaSql$ = "SELECT ID_PROVINCIA, NOME FROM PROVINCE ORDER BY NOME"
        Dim DataReader As OleDbDataReader
        Dim Connessione As New OleDbConnection(Application("connessione_access_prova").ToString)
        Connessione.Open()
        Dim Comando As New OleDbCommand(StringaSql, Connessione)
        DataReader = Comando.ExecuteReader(CommandBehavior.CloseConnection)
        Do While (DataReader.Read())
            PrintLn("<u>Provincia: " & DataReader.GetString(1) & "</u>")
            ScansionaComuniPerPrivincia(DataReader.GetDecimal(0))
        Loop
        DataReader.Close()
        Connessione.Close()
    End Sub
    Private Sub ScansionaComuniPerPrivincia(ByVal id_provincia As Decimal)
        Dim StringaSql$ = "SELECT NOME_COMUNE FROM COMUNI WHERE ID_PROVINCIA = " & id_provincia & " ORDER BY NOME_COMUNE"
        Dim DataReader As OleDbDataReader
        Dim Connessione As New OleDbConnection(Application("connessione_access_prova").ToString)
        Connessione.Open()
        Dim Comando As New OleDbCommand(StringaSql, Connessione)
        DataReader = Comando.ExecuteReader(CommandBehavior.CloseConnection)
        Do While (DataReader.Read())
            PrintLn(DataReader.GetString(0))
        Loop
        PrintLn("")
        DataReader.Close()
        Connessione.Close()
    End Sub