2017-11-10 7 views
2

で既存のテーブルを見つけることができない私は、JavaでDerbyデータベースに接続しています:DatabaseMetaDataのは、#1のgetTablesはダービー

public EmbeddedDerbyDataConnection(String name) throws SQLException { 

    EmbeddedDataSource dataSource = new EmbeddedDataSource(); 
    dataSource.setDatabaseName(name); 
    dataSource.setCreateDatabase("create"); 

    this.connection = dataSource.getConnection(); 
    init(); 
} 

接続はOKのようです。そして、私はそれがまだ存在し、いくつかのデフォルトのデータで、この表を埋めていない場合は、テーブルを作成しますinit()メソッドを呼び出す:

private void init() throws SQLException { 
    DatabaseMetaData metaData = this.connection.getMetaData(); 
    ResultSet rs = metaData.getTables(null, null, "mytable", null); 
    if (rs.next()) { 
     System.out.println("Table already exists."); 
    } else { 
     Statement stmt = this.connection.createStatement(); 
     String query = "CREATE TABLE mytable (...)"; 
     stmt.executeUpdate(query); 
     stmt.close(); 

     stmt = this.connection.createStatement(); 
     query = "INSERT INTO mytable VALUES (...)"; 
     stmt.executeUpdate(query); 
     stmt.close(); 
    } 
} 

初めてEmbeddedDerbyDataConnectionのオブジェクトを作成した後、それはOKに見えました。私はSELECT * FROM mytableでそれをテストし、私はこのテーブルに入れたデフォルトデータを返しました。

2回目の呼び出しの後に、私はException in thread "main" java.sql.SQLException: Table/View 'mytable' already exists in Schema 'APP'.を取得します。init()メソッドのResultSet rsが空であるように見えます。しかし、SELECT * FROM mytableを呼び出した後、データが存在し、それらが正しい。

どうすればこの問題を解決できますか?どこに問題がありますか?

答えて

2

Derbyの実装.getTablesは大文字と小文字が区別されているように見えますが、Derbyは表名を大文字にするようにも見えます。

java.sql.SQLException:テーブル/ビュー 'MYTABLE'はすでにスキーマ 'APP'に存在します。

だから、あなたはおそらく試合を得るために

ResultSet rs = metaData.getTables(null, null, "mytable".toUpperCase(), null); 

のようなものを使用する必要があります。

+1

大文字と小文字の区別は、JDBC仕様で必要です(たとえば、パターンパラメータ_はデータベースに格納されているテーブル名と一致する必要があります)_ため、データベースが引用符で囲まれていないオブジェクト名を大文字で格納する場合、パターンは大文字でも一致するようにしてください。 –

関連する問題