当使用jdbc for mysql时,我想首先检查数据库及其中的表是否都存在,然后将一些元组插入表中。以下代码是我的尝试。
conn.setCatalog("STUDENTS")
是否将当前数据库设置为数据库STUDENTS
?
如果我已将当前数据库切换为STUDENTS
,为什么运行st.executeUpdate("CREATE TABLE student")
抛出java.sql.SQLException: No database selected
?
我检查数据库和表格存在的方法是否正确?还有更好的方法吗?
感谢。
Class.forName("com.mysql.jdbc.Driver");
//Open a connection
System.out.println("Connecting to database...");
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
//Execute a query
Statement st = conn.createStatement();
// check existence of database STUDENTS
DatabaseMetaData dbm = conn.getMetaData();
ResultSet databases = dbm.getCatalogs();
boolean hasDB = false;
while (databases.next()){
String databaseName = databases.getString(1);
if (databaseName.equals("STUDENTS")){
hasDB = true;
break;}
}
if (!hasDB){
st.executeUpdate("CREATE DATABASE STUDENTS");
System.out.println("Database created successfully...");
}
conn.setCatalog("STUDENTS"); // Can this set the current database to STUDENTS?
// Check existence of table `student` in database `STUDENTS`
ResultSet tables = dbm.getTables(null, null, "student", null);
if (! tables.next()){
st.executeUpdate("CREATE TABLE student"); // java.sql.SQLException: No database selected
System.out.println("Table created successfully...");
}
答案 0 :(得分:0)
我能够重现你的问题。一个问题是CREATE DATABASE STUDENTS
正在创建一个名为"学生" (小写)代码块找不到
while (databases.next()){
String databaseName = databases.getString(1);
System.out.println(databaseName);
if (databaseName.equals("STUDENTS")) {
hasDB = true;
break;
}
}
因为.equals
执行区分大小写的比较。当我将其更改为.equalsIgnoreCase
while (databases.next()){
String databaseName = databases.getString(1);
System.out.println(databaseName);
if (databaseName.equalsIgnoreCase("STUDENTS")) {
hasDB = true;
break;
}
}
然而,这并不是导致错误的原因。之所以发生这种情况,是因为您使用的是在Statement
来电之前创建的st
对象setCatalog
,所以它仍然没有'#34;指向"到数据库(目录)。如this comment to another question
在调用
Connection.setCatalog()
之前创建的语句仍将访问早期数据库。
(在这种情况下,没有数据库)。
修复是在尝试st
CREATE TABLE
对象
if (! tables.next()) {
// create a new Statement object that recognizes the setCatalog change
st = conn.createStatement();
st.executeUpdate("CREATE TABLE student (id INT PRIMARY KEY)"); // now no error
System.out.println("Table created successfully...");
}