Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 32
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    50

    Mostrare a video le tabelle di un Database

    Salve,
    sto creando una piccola applicazione che si connette a mysql o sqlserver mediante driver JDBC.
    Le query riesco ad eseguirle correttamente memorizzando il suo risultato su su un vettore.. ma quello che vorrei fare adesso è, una volta avvenuta la connessione ad un database, mostrare a video ( su un JtextPane, Jtable o non so cosa) tutte le tabelle di quel determinato db, compresi i nomi dei campi.

    Come potrei fare ciò? :master:

    Grazie ciao

  2. #2
    Bhe dovresti fare delle query al catalogo di sistema in particolare al DB interessato tramite JDBC
    dai un occhiata alle api http://java.sun.com/javase/6/docs/api/index.html

    costruirti un jtree con alla radice il nome del Db e poi i sui figli sono le tabelle view ecc.
    Sucessivamente quando clicchi ad esempio su una tabella carichi in un jtable le caratteristiche della tabella sempre interrogando il catalogo di sistema.


  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    50
    Grazie per il suggerimento, avevo pensato anche io al Jtree ma purtroppo non ho familiarità con questi.. qualcuno può postare un codice d'esempio?? ho letto quei documenti ma non ho capito come fare a recuperare i nomi e i campi delle tablle del database

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da luca_87
    non ho capito come fare a recuperare i nomi e i campi delle tablle del database
    I valori li ottieni dal ResultSet con i vari getTipo(), le informazioni sui campi ovvero i "metadati" del ResultSet (numero di colonne, tipo, nome ecc...) li ottieni da ResultSetMetaData, fornito dal ResultSet con getMetaData().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    50
    Ho iniziato a scrivere questo come prima prova
    codice:
    DefaultMutableTreeNode root=new DefaultMutableTreeNode("NOME DB");
    
    Statement stmt = db.createStatement();        
    ResultSet rs=stmt.executeQuery("select * from libri");
    ResultSetMetaData rsmd = rs.getMetaData();
    
    int colonne= rsmd.getColumnCount();
    
    for (int i=0; i<colonne; i++)  {
    
       while (rs.next())  { 
            DefaultMutableTreeNode nome_campo = new DefaultMutableTreeNode(rsmd.getColumnName(i));
            DefaultMutableTreeNode valore_campo = new DefaultMutableTreeNode(rs.getString(rsmd.getColumnName(i)));
         
          nome_campo.add(valore_campo);
         root.add(nome);
         
                             }
     }
            
    JTree tree=new JTree(root);
    Ma in fase di esecuzione mi dà
    GRAVE: null
    java.sql.SQLException: Column index out of range.


  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da luca_87
    codice:
    for (int i=0; i<colonne; i++)  {
    
       while (rs.next())  {
    Prima chiarisci cosa vorresti fare! Il tuo result set può avere N righe e M colonne. Come vuoi rappresentarle nell'albero??

    Es. hai un result set di 3 righe di 2 colonne:
    A B
    C D
    E F

    Come le rappresenti sull'albero??? Perché è solo qui la questione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    50
    Originariamente inviato da andbin
    Es. hai un result set di 3 righe di 2 colonne:
    A B
    C D
    E F

    Come le rappresenti sull'albero??? Perché è solo qui la questione.

    In questo modo ad esempio

    codice:
    -NomeDatabase
       -NomeTabella1
          -Campo A
                C, E 
          -Campo B
                 D, F
       -NomeTabella2
             -
             -
             -
    Il nome del DB è la radice, dell'albero, i suoi figli sono i Nomi delle Tabelle, i figli di quest'ultimi sono i nomi dei campi ed i figli di quest'ultimi i valori dei campi

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da luca_87
    Il nome del DB è la radice, dell'albero, i suoi figli sono i Nomi delle Tabelle, i figli di quest'ultimi sono i nomi dei campi ed i figli di quest'ultimi i valori dei campi
    Ok, ammesso che tu abbia un 'tableNode' (il nodo che contiene il nome della tabella, che hai già inserito), devi fare in modo molto diverso.

    Perché se ci pensi, tu con next() passi da una riga all'altra e ogni riga ha N campi in blocco mentre tu vuoi prendere prima la colonna 1 di tutte le righe, poi la colonna 2 di tutte le righe ecc... Capisci? In teoria dovresti scansionare il result set più volte. Ma in realtà si può evitare.

    Te lo spiego a parole: prima devi creare N nodi per i nomi dei campi (li metti in un array), poi scansioni il result set. Per ogni riga, hai le N colonne e fai un ciclo for interno per aggiungere il valore della colonna i-esima al corrispondente nodo del nome del campo.

    Alla fine aggiungi come figli del 'tableNode' i nodi dei campi.

    Te lo spiego meglio con un esempio: una tabella con 3 righe e 3 colonne:

    codice:
    Col1 Col2 Col3
    1    2    3
    4    5    6
    7    8    9
    Dai metadati scopri che il result set ha 3 colonne. Istanzi un array di 3 reference a DefaultMutableTreeNode e ovviamente istanzi i singoli DefaultMutableTreeNode con il nome della colonna che poi assegni nell'array (lo chiamo arrColNodes).

    Ora scansioni il result set. Prendi la prima riga con next().
    Per i tre valori 1 2 3 istanzi un DefaultMutableTreeNode e ognuno lo aggiungi rispettivamente a arrColNodes[0], arrColNodes[1], arrColNodes[2].
    E così via ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    50
    Grazie mille per l'aiuto, cosi funziona
    codice:
    DefaultMutableTreeNode root=new DefaultMutableTreeNode("NOME DB");
    Statement stmt = db.createStatement();
    ResultSet rs=stmt.executeQuery("select * from libri");
    ResultSetMetaData rsmd = rs.getMetaData();
             
    DefaultMutableTreeNode tab=new DefaultMutableTreeNode(rsmd.getTableName(1));        
             
    int colonne= rsmd.getColumnCount();
    DefaultMutableTreeNode[] arrColNodes = new DefaultMutableTreeNode[colonne];
             
    for (int i=0; i<colonne; i++)  {             
       arrColNodes[i]= new DefaultMutableTreeNode(rsmd.getColumnName(i+1));
       tab.add(arrColNodes[i]);
    }
      
    while (rs.next()) {                 
       for (int j=0; j<colonne; j++) {
           DefaultMutableTreeNode campo = new DefaultMutableTreeNode(rs.getString(rsmd.getColumnName(j+1)));
            arrColNodes[j].add(campo);
       }
    }
    root.add(tab);
    Adesso però mi chiedo come fare a recuperare il nome del database e quello delle varie tabelle, senza dover specificarlo io come ho fatto in
    codice:
    DefaultMutableTreeNode root=new DefaultMutableTreeNode("NOME DB");
    DefaultMutableTreeNode tab=new DefaultMutableTreeNode(rsmd.getTableName(1));

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da luca_87
    cosi funziona
    Esatto, concettualmente proprio come pensavo io.
    Solo una piccola nota. Tu fai:

    rs.getString(rsmd.getColumnName(j+1))

    Cioè passi dal nome del campo. Ma basterebbe anche solo l'indice!

    rs.getString(j+1)

    Originariamente inviato da luca_87
    come fare a recuperare il nome del database e quello delle varie tabelle
    Nota che esiste un java.sql.DatabaseMetaData. Un DatabaseMetaData te lo fornisce la Connection con getMetaData().
    DatabaseMetaData contiene una quantità immane di metodi .... non ti spaventare. getSchemas()
    ritorna un ResultSet che descrive gli schemi (tabelle) disponibili. La struttura è spiegata nel javadoc.

    Il nome del database non mi sembra che te lo fornisce DatabaseMetaData. Se ci pensi, il nome del database, se necessario, lo si passa nel URL di connessione. Ma a seconda del database ... potrebbe anche non esistere un "nome" di database.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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