2015-01-13 4 views
0

Я делаю Java MySQL CLI, и у меня возникают проблемы с выбором базы данных. При подключении к серверу баз данных, не включают в себя базу данныхСвязать базу данных с существующим подключением JBDC

Console console = System.console(); 
String host = console.readLine("MySQL Host: "); 
host = "jdbc:mysql://"+host+":3306/"; 

Потому что я хочу, чтобы пользователи могли выбрать базу данных самостоятельно. У меня есть listDatabases функцию, которая отлично работает нормально, но если я хочу, чтобы запросить таблицу, я получаю следующую ошибку:

Jan 13, 2015 4:06:40 PM com.user.package.MySQL listTables 
SEVERE: No database selected 
java.sql.SQLException: No database selected 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484) 
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1446) 
    at com.user.package.MySQL.listTables(MySQL.java:92) 
    at com.user.package.MySQL.select(MySQL.java:81) 
    at com.user.package.Main.main(Main.java:52) 

Когда пользователь выбирает таблицу следующая функция запускается на выполнение:

public void useDatabase() { 
    Statement useStatement = null; 
    ResultSet use = null; 
    String database = this.getDatbase(); 
    try { 
     useStatement = this.getCon().createStatement(); 
     use = useStatement.executeQuery("USE "+database); 
    } 
    catch (SQLException ex) { 
     Logger lgr = Logger.getLogger(MySQL.class.getName()); 
     lgr.log(Level.SEVERE, ex.getMessage(), ex); 
    } 
} 

Функция getCon просто возвращает текущее соединение с базой данных.

Но это, по-видимому, не делает трюк. Есть предположения?

+0

см редактировать мой ответ – Alnitak

+0

@Alnitak Он работал! Спасибо: D –

+0

FWIW, я бы использовал функцию 'useDatabase()' имя DB в качестве параметра, и только при успешном заполнении поля базы данных вашего класса. – Alnitak

ответ

2

В общем случае команда USE является специфичной для подключения - если вы запросите новое соединение с методом getCon, и затем оно будет удалено, то следующее (новое) соединение вернется к отсутствию выбранной схемы.

Альтернативной функция JDBC, чтобы выбрать схему, которая будет использоваться на существующую связи заключается в следующем:

connection.setCatalog(databaseName); 
+0

getCon - это функция, которую я создал сам, которая возвращает текущий объект Connection. Такое же соединение используется везде –

+0

@RoemerBakker достаточно справедливо - без реализации 'getCon()' было невозможно сказать. – Alnitak

+0

Вы правы. Я отредактирую свой вопрос –

0

Строка соединения с DB должна содержать также имя схемы:
«jdbc: mysql: // localhost: 3306/test» - test - это имя схемы.

В одном экземпляре Mysql может быть несколько баз данных, обратите внимание на это.

+0

Можете ли вы объяснить, как таблица схем помогает мне выбрать другую базу данных? –

+0

Я отредактировал свой вопрос – roeygol

+0

Я вижу, но, как описано, это именно то, чего я пытаюсь избежать. Проблема в том, что я не могу изменить базу данных на существующем объекте подключения –

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