2015-03-24 3 views
1

У меня есть метод Connect(), который имеет строковый параметр, этот параметр является входом от пользователя. У меня есть 2 базы данных: test и test2, но я могу подключиться только к тестированию db с пользовательского ввода. Должен ли я внести изменения на сервер, на котором размещается 2 dbs, чтобы иметь возможность подключаться к любой базе данных, которую пользователь пишет ???Подключиться к базе данных ввода пользователя

public void Connect(String DataBase) { 
      try{ 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase); 
       st = con.createStatement(); 
       System.out.println("Connected to " + DataBase + " !!!"); 
       con.close(); 
      }catch(SQLException se){ 
       System.out.println("Cannot connect to database " + DataBase); 
      } 
      catch(Exception ex){ 
       System.out.println("Error: " + ex); 
      } 
     } 

ОСНОВНОЙ МЕТОД

// DB1Connect connect = new DBConnect("test"); 
    //connect.getData(); 

    Scanner scanner = new Scanner(System.in); 
    System.out.println("Choose from these choices"); 
    System.out.println("-------------------------\n"); 
    System.out.println("1 - Connect to a specific DB schema"); 
    System.out.println("2 - List DB schema structure: tables, fields, types"); 
    System.out.println("3 - List table structure: fields, types"); 
    System.out.println("4 - Quit"); 
    int choice = scanner.nextInt(); 
    switch(choice) { 
     case 1: 
      System.out.println("Enter the Db's name:"); 
      String dbName = scanner.next(); 
      DBConnect connect = new DBConnect(); 
      connect.Connect(dbName); 
      break; 
     case 2: 

      break; 
     default: 
      System.out.println("Incorrect option"); 
    } 
} 

СТЕК TRACE:

Enter the Db's name: 
test2 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'test2' 
Cannot connect to database test2 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910) 
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031) 
    at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:718) 
    at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) 
    at java.sql.DriverManager.getConnection(DriverManager.java:664) 
    at java.sql.DriverManager.getConnection(DriverManager.java:270) 
    at medapp.DBConnect.Connect(DBConnect.java:19) 
    at medapp.MedApp.main(MedApp.java:29)
+0

Почему вы говорите, вы можете подключить только к 'test' базы данных? Что произойдет, если пользователь войдет в 'test2'? – RealSkeptic

+0

Исключение вызывается и вводится здесь catch (SQLException se) { System.out.println («Не удается подключиться к базе данных» + База данных); } –

+0

при вводе теста это печатает Подключается к тесту !!! –

ответ

1

Попробуйте подключиться к базе данных после установления соединения с сервером.

public void Connect(String DataBase) { 
      try{ 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/"); 
       st = con.createStatement(); 
       st.execute("USE " + "[" + DataBase + "]"); 
       System.out.println("Connected to " + DataBase + " !!!"); 
       con.close(); 
      }catch(SQLException se){ 
       System.out.println("Cannot connect to database " + DataBase); 
      } 
      catch(Exception ex){ 
       System.out.println("Error: " + ex); 
      } 
     } 

Требуется ли в базе данных аутентификация? Если это так, попробуйте следующее:

Properties connProperties; 
connProperties = new Properties(); 
connProperties.setProperty("user", getUsername()); 
connProperties.setProperty("password",getPassword()); 

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase, connProperties); 

Кроме того, это хорошая идея, чтобы проверить, если база данных существует

stat.executeQuery("SELECT * FROM sys.sysdatabases"); 
+1

Нет аутентификации, обе базы данных, запущенные на том же локальном сервере, пытались установить область текущей базы данных, но все же только тест проходит строку con = –

0

Трассировка стека говорит вам, что у вас есть ошибка SQLSyntax. Используя это, вы можете отследить ошибку. В этом случае, последние X2 линии в StackTrace:

«at medapp.DBConnect.Connect(DBConnect.java:19) at medapp.MedApp.main(MedApp.java:29)»

говорят вам, что есть ошибка с классом «medapp» с методами «основной» и «Connect».

Могу ли я предположить, что вы связываете соединение с базой данных с другим классом друг от друга? Альтернативой было бы закрыть все соединения с помощью метода .close() /.

Отличающиеся классы


Scanner decision = new Scanner(System.in); 
String choice = decision.next(); 

if(choice.trim().equals("test"); 
{ 
    //enter class to connect to "test" table 
} 
if(choice.trim().equals("test2") 
{ 
    //enter class to connect to "test2" table 
} 

Если вы планируете вернуться к основным или переключения таблиц во время выполнения, я бы рекомендовал добавить finally блок, чтобы закрыть соединение, прежде чем сделать переход.


Альтернатива выше будет иметь метод в вашем основном классе, посвященного каждое соединение, с помощью способа, чтобы закрыть соединение для повторного подключения.


EDIT

На основании ответа, я настоятельно рекомендую проверить состояние обеих таблиц. Установите MySQL Workbench (найдено here) и подключитесь к своим базам данных. Это должно помочь вам отладить проблемы с подключением.

Могу ли я также предложить, перейдите ваш код и убедитесь, что в вашем SQL-заявлении нет орфографических ошибок.

+0

Да, но это означает, что мне нужно поставить if stmt для каждого db, который у меня есть, я хочу, чтобы пользователь мог выбрать, с каким db он хочет подключиться ... –

+0

Я не думаю, что проблема потому что соединение не закрыто, я запускаю программу и ставил первый тест2, и ничего .. –

+0

Если вы можете подключиться к одной из баз данных, а не к другой, я бы предложил посмотреть в базу данных. Убедитесь, что аутентификация отсутствует (учтите, если она есть). Если базы данных подключены к сети, попробуйте (по окнам) Telnet , чтобы узнать, находится ли сервер в сети. Также посмотрите [Веб-сайт MySQL] (https://www.mysql.com/), чтобы узнать, поддерживает ли ваша версия одновременные подключения к серверу. –

Смежные вопросы