我正在制作Java MySQL CLI,而且我遇到了数据库选择问题。当我连接到数据库服务器时,我没有包含数据库
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 :(得分:2)
通常,USE
命令是特定于连接的 - 如果您使用getCon
方法请求新连接,然后将其处理掉,则下一个(新)连接将恢复为no选定的架构。
用于选择要在现有连接上使用的模式的备用JDBC函数是:
connection.setCatalog(databaseName);
答案 1 :(得分:0)
数据库连接字符串还必须包含模式名称,如:
" JDBC:MySQL的://本地主机:3306 /测试" - test是模式名称。
在一个Mysql实例下,可以有几个数据库,请注意。