3

databasemetadataそこに存在するすべてのテーブルを取得する ためにアクセスしようとしています。10 列のgetTablesを返す必要があります。ResultSet

を反復処理してResultSetすべての列データを取得しようとすると、

Exception in thread "main" java.sql.SQLException: Invalid column index

最初の行から最初の 5 列のデータを取得すると、6 列目を印刷するときに例外が発生しますTYPE_CAT

関連コード:

DatabaseMetaData dbmd = connection1.getMetaData();
    ResultSet rs = dbmd.getTables(null, null, null, new String[]{"TABLE"});
        while(rs.next()){
            for(int i=1;i<11;i++){
                System.out.print(rs.getString(i)+"  ");
            }
            System.out.println("");
        }
4

2 に答える 2

1

非常に古い JDBC 2 ドライバーを使用しているか、仕様で必要なすべての列がないため、ドライバーが JDBC 3.0、4.0、および/または 4.1 に準拠していないようです。

JDBC は (少なくとも) 結果セットが返す列を指定しますが、実際にResultSetとその値を正しく定義するのはドライバーの実装者次第です。JDBC は「単なる」仕様であり、インターフェイスのセットであるため、実行時に、すべてのドライバーが指定されたすべての列を返すことを実際に確認することはできません。認定テストはありますが、これらには官僚的なハードル (オープンソース) または多額の費用 + 官僚的なハードル (商業的) が必要なため、すべての JDBC ドライバーの実装者がわざわざ準拠をテストするわけではありません。

JDBC 2 (Java 1.3) DatabaseMetaData.getTables(Java 1.3 apidoc へのリンク) では、5 つの列のみが返されます。

  1. TABLE_CAT文字列 => テーブル カタログ (null の可能性あり)
  2. TABLE_SCHEM文字列 => テーブル スキーマ (null の可能性あり)
  3. TABLE_NAME文字列 => テーブル名
  4. TABLE_TYPE文字列 => テーブルの種類。典型的なタイプは、「TABLE」、「VIEW」、「SYSTEM TABLE」、「GLOBAL TEMPORARY」、「LOCAL TEMPORARY」、「ALIAS」、「SYNONYM」です。
  5. REMARKS文字列 => 表に関する説明コメント

一方、JDBC 3.0 ( Java 1.4 / Java 5 )、JDBC 4.0 ( Java 6 )、および JDBC 4.1 ( Java 7 ) では、さらに 5 つの列が定義されています。

  1. TABLE_CAT文字列 => テーブル カタログ (可能性がありますnull)
  2. TABLE_SCHEM文字列 => テーブル スキーマ (可能性がありますnull)
  3. TABLE_NAME文字列 => テーブル名
  4. TABLE_TYPE文字列 => テーブルの種類。典型的なタイプは、「TABLE」、「VIEW」、「SYSTEM TABLE」、「GLOBAL TEMPORARY」、「LOCAL TEMPORARY」、「ALIAS」、「SYNONYM」です。
  5. REMARKS文字列 => 表に関する説明コメント
  6. TYPE_CAT文字列 => タイプ カタログ (可能性がありますnull)
  7. TYPE_SCHEM文字列 => タイプ スキーマ (可能性がありますnull)
  8. TYPE_NAME文字列 => タイプ名 (かもしれませんnull)
  9. SELF_REFERENCING_COL_NAME文字列 => 型指定されたテーブルの指定された「識別子」列の名前 (かもしれませんnull)
  10. REF_GENERATION String => SELF_REFERENCING_COL_NAME の値の作成方法を指定します。値は「SYSTEM」、「USER」、「DERIVED」です。(かもしれませんnull

データベースで使用できる新しいドライバーがあるかどうかを確認することをお勧めします。

于 2013-04-03T17:18:12.923 に答える
0

値 11 を使用するのではなく、ResultSetMetaDataを取得して列数を決定し、列が取得されたことを確認してください。

ResultSetMetaData rsMetaData = rs.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();

そこから、列の名前と値を取得し、getColumnName(int)メソッドを使用して取得しているものを確認できます。

于 2013-04-03T14:11:11.307 に答える