6

頭痛の種になるコードは次のとおりです。

  public List<String> listColumnsForTable(String tableName) throws SQLException {
    List<String> columns = new ArrayList<String>();
    DatabaseMetaData metadata = _connection.getMetaData();
    ResultSet resultSet = metadata.getColumns(null, null, tableName, null);
    while (resultSet.next())
      columns.add(resultSet.getString("COLUMN_NAME"));
    return columns;
  }

このコードは SQL Server で正常に動作します(MySQL、Oracle などでは確認していません) が、インメモリ データベースでいくつかの統合テストを実行する必要があります。私が試したすべてのデータベース (h2、hsqldb、および derby)は失敗しました。

ここに github のリンクがあります。

完全なプロジェクト(h2、hsqldb、derby、および sql サーバーのテストを含む) が必要な場合は、次の手順を実行します。

git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew

すべての依存関係が自動的にダウンロードされます。ライブラリのバージョンを確認したい場合は、build.gradleスクリプトを参照してください。

お気に入りの IDE (eclipse または idea) にプロジェクトをインポートします。

テストは、DatabaseMetadataCheckerTestsクラス (canListColumnsForTableおよびcanCheckIfColumnsExistInTable) で使用できます。

通常、これらは変更しないでください。インメモリデータベースごとに接続の詳細を提供する4つのテストクラスを作成しました。それらを実行する必要があります(これDatabaseMetadataCheckerTestsは抽象的であるため、実行しません)。

注: 特定のデータベースのテストに合格するよりも解決策が見つかった場合。クラスを拡張して接続の詳細を提供するだけで、Oracle や MySQL などの他のデータベースを簡単に試すことができますDatabaseMetadataCheckerTests(他のテストを確認してください)。

問題が解決しました

テーブル名と列名UPPERCASEにする必要があります。詳細については、このコミットを確認してください。

4

1 に答える 1

7

H2、HSQLDB (および Oracle と DB2) は SQL 標準に準拠しているため、引用符で囲まれていないオブジェクト名は大文字に変換されます (SQL Server はこれを行いません。使用した大文字と小文字を区別しません。文字列比較)。

create table foo (id integer)FOO列名と同じようIDにシステム カタログに格納されます。

そのため、テーブル名を大文字で JDBC API 呼び出しに渡す必要があります。

これを他の DBMS に移植する際の注意:

Postgres はここの標準に準拠しておらず、すべてを小文字に変換します

MySQL の場合、これがどのように行われるかについて明確な答えはありません。さまざまな構成設定 (およびストレージ エンジン、ファイルシステム) に依存するため、引用符で囲まれていないテーブル名が実際にシステムにどのように格納されるかはわかりません。

于 2013-05-03T12:41:06.617 に答える