检查数据库及其表中是否存在:`java.sql.SQLException:未选择数据库`

时间:2017-11-28 14:56:03

标签: java mysql jdbc

当使用jdbc for mysql时,我想首先检查数据库及其中的表是否都存在,然后将一些元组插入表中。以下代码是我的尝试。

  1. conn.setCatalog("STUDENTS")是否将当前数据库设置为数据库STUDENTS

  2. 如果我已将当前数据库切换为STUDENTS,为什么运行st.executeUpdate("CREATE TABLE student")抛出java.sql.SQLException: No database selected

  3. 我检查数据库和表格存在的方法是否正确?还有更好的方法吗?

  4. 感谢。

    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...");
    }
    

1 个答案:

答案 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...");
}