2016-07-24 6 views
2

MySQL接続からUbuntu 14とJavaおよびNetBeansを使用してメタデータを取得する際に問題が発生します。私はDatabaseMetaDataオブジェクトのgetColumnsメソッドから空のResultSetを取得します。DatabaseMetaData#getColumnsが空のResultSetを返す

コードは以下の通りです:

private static HashMap getColumnsFromDB(Connection con, String dbSchema, String tableName) throws SQLException 
{ 
    HashMap Columns = new HashMap(); 

    DatabaseMetaData metadata = con.getMetaData(); 

    ResultSet rsColumns = metadata. getColumns(null, dbSchema.toUpperCase(), tableName.toUpperCase(), "%"); 

    while (rsColumns.next()) 
    { 
     ColumnClass col = new ColumnClass(); 
     col.column_name = rsColumns.getString("COLUMN_NAME"); 
     col.mw_type = UtilClass.toClass(rsColumns.getInt("DATA_TYPE")); // Convert to java type 
     col.is_nullable = rsColumns.getString("IS_NULLABLE"); 
     col.column_default = rsColumns.getString("COLUMN_DEF"); 

     Columns.put(col.column_name, col); 
    } 

    return Columns; 
}  

私は通常、データベースへのクエリを行うことができ、ユーザーはDBAで、テーブルには列があり、私はそれは少しトリッキーなことができることを他の人の質問に見てきました症例などがありますが、私はさまざまな方法で試してみましたが、期待される結果はありませんでした。

答えて

1

MySQLでは、「スキーマ」と「データベース」という用語は同じことを意味します。テストでは、MySQL   Connector/Jは、DatabaseMetaData#getColumnsメソッドのschemaPatternパラメータには何の注意も払わないことが示されています。だから、

、あなたが

jdbc:mysql://localhost/db1 

のように接続文字列を使用して、

DatabaseMetaData metadata = con.getMetaData(); 
ResultSet rsColumns = metadata.getColumns(null, "db2", "mytable", "%"); 
db2という名前の「スキーマ」(「データベース」)内のテーブルの列に関する情報を取得しようとした場合

データベースdb1mytableという名前のテーブルがない場合、空のResultSetが得られます。第二引数– schemaPattern –がnullであることをdb2にテーブルの情報を取得するためには、あなたのいずれかがcatalogパラメータに

DatabaseMetaData metadata = con.getMetaData(); 
ResultSet rsColumns = metadata.getColumns("db2", null, "mytable", "%"); 

を使用するか、setCatalog

con.setCatalog("db2"); 
DatabaseMetaData metadata = con.getMetaData(); 
ResultSet rsColumns = metadata.getColumns(null, null, "mytable", "%"); 

注意して現在のデータベースを変更する必要があります上記の2つの作業例では、実際には何でも構いません。単純に無視されます。

編集再:コメント

をOPはcatalogパラメータを設定することは確かに必要なアプローチであることを報告し、そのテーブル–と、おそらく、列–名は、Linuxの下で大文字と小文字を区別するように見えます。 (私のテストでは、このような名前がない大文字と小文字を区別し、Windowsであることを示している。)

+0

それは動作しません。私はそれが何らかの互換性の問題を知っている場合には、Ubuntu 14.04、mysql 5.5、jdbc 5.1.35、jdk 1.8、およびnetbeans 8.0.2を使用しています。 – Checho

+0

'con.getCatalog()'は何を返しますか?予想されるデータベース名ですか?空の文字列ですか? 'ヌル'? –

+0

メソッド呼び出しでは空の文字列です。 con.setCatalog()の後、指定された値(この例では "Users")を取りますが、まだ空のセットを返します。私が情報スキーマデータベースを照会すると、すべてのテーブルはTABLE_CATALOGカラムに "def"という値を持ちます(これは 'デフォルト'のような意味です)。これを回避策として使用しています。 – Checho

関連する問題