2014-04-25 14 views
5

Questa è l'uscita del programma indicato di seguito:JDBC: connessione che restituisce NULL, cosa fare?

Connection made! 
Schema Name:null 

Successfully connected to null 
Releasing all open resources ... 

All'interno EstablishConnection(), conn viene inizializzata come nullo. Quindi la prima istruzione all'interno del blocco try deve stabilire una connessione con il database e la terza istruzione stampa il nome dello schema corrente di conn.

In base allo API, getSchema() restituisce il nome schema corrente o null se non ce n'è.

Ciò significa che non esiste uno schema (penso che il nome dello schema sia uguale al nome del database) associato a conn? Qualcuno può suggerire se sono corretto nella mia previsione, e anche suggerire perché non esiste uno schema o null associato a conn?

public class ConnectDB { 

    private Connection establishConnection() throws SQLException { 
     Connection conn = null; 
     try { 
      conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/test_final1", "root", "password"); 
      System.out.println("Connection made!"); 
      System.out.println("Schema Name:"+conn.getSchema()+"\n"); 
     } catch (SQLException sqle) { 
      System.err.println("SQL Exception thrown while making connection"); 
      printSQLException(sqle); 
     } 
     return conn; 
    } 

    public static void main(String[] args) { 
     ConnectDB cdb= new ConnectDB(); 
     Connection myconn=null; 
     try{ 
      myconn=cdb.establishConnection(); 
      if(myconn!=null) System.out.println("Successfully connected to " + myconn.getSchema()); 
     }catch (SQLException e) { 
       ConnectDB.printSQLException(e); 
     } catch (Exception e) { 
      e.printStackTrace(System.err); 
     } finally { 
      ConnectDB.closeConnection(myconn); 
     } 

    } 
+2

questa domanda non è un duplicato. L'altra domanda riguarda Android, molto sul driver JTD (non l'ho usato). Sto postando questo commento per chiarimenti, dal momento che avevo ricevuto un commento che diceva che si tratta di un duplicato, che è stato cancellato dopo la mia spiegazione. – Solace

+0

Dov'è il codice in cui è stato caricato il 'driver MYSQL' –

+1

People! Il problema non è di ottenere una connessione 'nullo' ma di un valore di ritorno' null' dall'esecuzione del metodo 'Connection # getSchema'. –

risposta

6

MySql non supporta il concetto di schema. Per MySQL, lo schema è in effetti il ​​database. Da MySQL Glossary:

schema

Concettualmente, uno schema è un insieme di oggetti di database correlati, ad esempio tabelle, colonne di tabelle, i tipi di dati delle colonne, indici, chiavi esterne, e così via. (...)

Sulla base di this answer from MySQL forums, non è possibile ottenere il database corrente (o banche dati) attraverso Connection#getSchema il metodo (che è stata aggiunta dal Java 7 con JDBC 4), ma utilizzando Connection#getCataloga meno di utilizzare l'ultima driver JDBC vaso:

Il driver JDBC (a causa di eredità, mysql non chiamarli "schemi" fino 5.0, e JDBC non aveva un modo per selezionare gli schemi fino JDBC4), chiama i database cataloghi" ", quindi è necessario chiamare getCatalogs() per ottenere l'elenco dei database

Mi sono sporcato rapidamente per provare la frase in corsivo sopra (a meno che non si usi l'ultimo driver jar JDBC). Utilizzando getCatalog() lavorato utilizzando Java 6:

public class DirtyQuickTest { 
    private static final String url = "jdbc:mysql://localhost:7841/test"; 
    private static final String user = "lmendozaj"; 
    private static final String password = "s3cr3t"; //I won't show you my password 
    public static void main(String[] args) throws Exception { 
     Connection con = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection(url, user, password); 
      //commented since doesn't exists in Java 6 
      //System.out.println(con.getSchema()); 
      System.out.println(con.getCatalog()); 
     } finally { 
      con.close(); 
     } 
    } 
} 

uscita:

test 

Poi ho eseguito lo stesso codice in Java 8 e commentata la dichiarazione contenente getSchema usando mysql-connector-java-5.1.31-bin .jar (attualmente l'ultimo driver Java Connector per MySQL).Questo è stato l'output:

null 
test 

Il che significa che ancora non supportano getSchema metodo.

correlati:

-1

creare una classe seprate e definiscono metodo statico getConnection. Penso che possa aiutare u

public class ConnectionManager { 
private static String url = "jdbc:mysql://localhost:3306/myDB";  
private static String driverName = "com.mysql.jdbc.Driver"; 
private static String usernsme = "root"; 
private static String pasword = "root"; 
private static Connection con; 
private static String url; 

public static Connection getConnection() { 
    try { 
     Class.forName(driverName); 
     try { 
      con = DriverManager.getConnection(url, username, password); 
     } catch (SQLException ex) { 

      System.out.println("Failed to create the database connection."); 
     } 
    } catch (ClassNotFoundException ex) { 

     System.out.println("Driver not found."); 
    } 
    return con; 
} 
} 

quindi ottenere la connessione in un codice come segue:

private Connection con = null; 
private Statement stmt = null; 
private ResultSet rs = null; 
con = ConnectionManager.getConnection(); 
stmt = con.createStatement(); 
rs = stmt.executeQuery(sql); 
+0

L'ho provato, non ha aiutato. In secondo luogo, puoi chiarire cosa intendi con "definizione della classe statica"? – Solace

+0

È necessario creare una classe seprata per la propria connessione JDBC. Nel mio caso faccio classe ConnectionManager. e definire il metodo come statico in questa classe. come faccio in questa risposta. – Vishal16

+0

L'ho già provato. Non ha aiutato. Ma solo per farmi capire, per favore chiarisci perché lo suggerisci? Come potrebbe aiutare la tua soluzione? – Solace

Problemi correlati