Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100

    JDBC e informazioni Catalogo

    Ho un problema...JDBC è rotto
    Battute ha parte, ho la necessita di ottenere una serie di informazioni (es: se la colonna di una tabella è chiave/indice) da diversi Db (es: Postgre, DB2, ecc..) e non conoscendo librerie particolari che facciano ciò, ho deciso di affidarmi alla vecchia e cara JDBC.
    Immagino che queste informazioni si trovino nel catalogo del Db in questione e la prima cosa che ho cercato di fare è ottenere la lista dei cataloghi presenti.
    Il problema è che non ci sto riuscendo

    Ho provato prima con:
    codice:
    ResultSet listaCataloghi = con.getMetaData().getCatalogs();       	
           while(listaCataloghi.next())
            	System.out.println("TABLE_CAT - " + listaCataloghi.getString("TABLE_CAT"));
    ..ma restituisce il nome dell'istanza del database..

    Allora ho provato con:
    codice:
    ResultSet listaCataloghi = con.getMetaData().getSchemas();
            while(listaCataloghi.next()) 		
            	System.out.println("TABLE_SCHEM - " + listaCataloghi.getString("TABLE_SCHEM"));   	
            while(listaCataloghi.next()) {	      		
            	System.out.println("TABLE_CATALOG - " + listaCataloghi2.getString("TABLE_CATALOG"));
            	}
    TABLE_SCHEM l'ho messo giusto per vedere se da getSchemas arivassero informazioni corrette, infatti arrivano i nomi degli Schema. Il dubbio mi è venuto perchhè invece da TABLE_CATALOG non ottengo nulla...nemmeno "null"... mi dice direttamente:
    org.postgresql.util.PSQLException: Colonna denominata «TABLE_CATALOG» non è presente in questo «ResultSet».
    Eppure mi sto basando sulle api corrette ovvero:
    http://download.oracle.com/javase/1....tSchemas%28%29

    Ho provato infine a passare da una tabella facendo:
    codice:
    ResultSet WSrs = con.getMetaData().getTables(null, schema, tableName, null);
            while(WSrs.next())
            	System.out.println("TABLE_CAT - " + WSrs.getString("TABLE_CAT"));
    ma questa volta dove mi aspetto le info del catalogo, mi arriva effettivamente null.

    Ora non so più che fare.....

    Potete darmi una mano????
    Grazie mille!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    dopo aver recuperato lo schema e il catalog, devi richiamare i metodi che ti interessano per recuperare le informazioni (getPrimarykeys, getColums ecc...) passando in input il nome dello schema, del catalog e della tabella.

    Se il catalog è null di solito significa che non è stato definito.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Se il catalog è null di solito significa che non è stato definito.
    Beh in realtà ce ne sono ben 2....ora sto facendo delle prove con un Db di Postgre e vedo:
    - information_schema
    - pg_catalog
    Credo siano quelli di 'default'.....ma siccome il metodo che sto creando deve essere usato su diversi Db, devo per forza riuscire a vedere anche i cataloghi di default e non solo quelli definiti apposta.


  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    fai una prova cosi:

    codice:
    ResultSet listaCataloghi = con.getMetaData().getCatalogs(); 
         
         while (listaCataloghi .next()) {
           String catalog = catalogs.getString(1);  
           System.out.println("catalog: "+catalog);
         }
    Se sai qual'è la tabella puoi provare anche cosi:

    codice:
    ResultSet rs = st.executeQuery("SELECT * FROM miatabella");
    
        ResultSetMetaData rsMetaData = rs.getMetaData();
    
        int numeroColonne = rsMetaData.getColumnCount();
    
        for (int i = 1; i <= numeroColonne; i++) {
          System.out.println(rsMetaData.getCatalogName(i));
        }
    edit: un altro modo che mi è venuto in mente potrebbe essere questo:

    codice:
    DatabaseMetaData dbmd = connection.getMetaData();
    
        ResultSet resultSet = dbmd.getTables(null, null, "%", String[]{ "TABLE" });
    
        while (resultSet.next()) {
          String nomeCatalog= resultSet.getString(1);
          String nomeSchema= resultSet.getString(2);
          String nomeTabella= resultSet.getString(3);
        }
    prova a smanettarci un po'.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    fai una prova cosi:
    codice:
    ResultSet listaCataloghi = con.getMetaData().getCatalogs(); 
         
         while (listaCataloghi .next()) {
           String catalog = catalogs.getString(1);  
           System.out.println("catalog: "+catalog);
         }
    Così avevo già provato ma, come avevo scritto, mi restituisce il nome dell'istanza del Db! Guarda l'immagine in allegato a questo messaggio.
    Mi restituisce: catalog: attuatore
    A me serve invece ottenere la lista dei cataloghi, ovvero:
    - information_schema
    - pg_catalog

    Intanto provo con le altre dritte....
    Immagini allegate Immagini allegate

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Intanto provo con le altre dritte....
    La seconda niente...non stampa proprio nulla.

    La terza invece...ho provato a fare un
    System.out.println(nomeCatalog + " " + nomeSchema + " " + nomeTabella) ;
    dentro il While e stampa:
    null public class
    null public class_instance
    null public class_instance_field_instance
    ...
    ...
    ...
    Nome Schema e nome tabella sempre corretto...invece il catalogo è a null.
    Evidentemente come dicevi, non riesci a vedere i Cataloghi nativi...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    per curiosità ho appena provato a collegarmi ad un db mysql in remoto con 4 catalog:

    codice:
    try {
    	Class.forName ("com.mysql.jdbc.Driver");
    		
    	String URL = "jdbc:mysql://10.249.18.148/";
    	Connection conn = DriverManager.getConnection(URL, "root", "root");
    	ResultSet listaCataloghi = conn.getMetaData().getCatalogs(); 
    		     
    	while (listaCataloghi .next()) {
    	       String catalog = listaCataloghi.getString(1);  
    	       System.out.println("catalog: "+catalog);
    	}
    } catch (ClassNotFoundException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    } catch (SQLException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }
    Questo è quello che mi ha stampato:
    catalog: information_schema
    catalog: capeople
    catalog: mysql
    catalog: test

    l'unico creato da me è il secondo quello denominato capeople.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Mi stai dicendo che potrebbe essere una non completa usabilità di Jdbc verso Postgre?

    Lo stesso identico codice su un db Postgre non restituisce niente.....mentre con MySql si...questo mi dà da pensare

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    no, non sto dicendo questo... quelli che io ho recuperato con la funzione getCatalogs sono nient'altro che gli schemi di default di mysql piu uno creato da me, usando invece la funzione getSchemas non trova niente... ora non conosoco Postgre, ma immagino che i dati che ti tornano dalla funzione getSchemas siano quelli che ti interessano. Cosa ti stampa usando questo metodo?

    codice:
    ResultSet listaCataloghi = con.getMetaData().getSchemas();
            while(listaCataloghi.next()) 		
            	System.out.println("TABLE_SCHEM - " + listaCataloghi.getString("TABLE_SCHEM"));
    Probabilmente i due db sono strutturati in maniera differente.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Cosa ti stampa usando questo metodo?
    Di seguito:
    codice:
    TABLE_SCHEM - information_schema
    TABLE_SCHEM - pg_catalog
    TABLE_SCHEM - pg_toast_temp_1
    TABLE_SCHEM - public
    In effetti guardando meglio, qua oltre agli Schema, trovo anche i Cataloghi O__O
    Evidentemente interpreta information_schema e pg_catalog come "degli schema del catalogo", mentre public è lo Schema classico (l'altro non so cosa sia...non lo vedo nemmeno nell'immagine)

    Questo però mi complica un po' le cose per il metodo generale che volevo fare....

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.