10

変更される可能性があるビューからデータをクエリしています。を実行する前に、列が存在するかどうかを知る必要がありますcrs.get******()

次のようにメタデータをクエリして、データを要求する前に列が存在するかどうかを確認できることがわかりました。

ResultSetMetaData meta = crs.getMetaData();
int numCol = meta.getColumnCount();

for (int i = 1; i < numCol + 1; i++) 
    if (meta.getColumnName(i).equals("name"))
        return true;

列が存在するかどうかを確認する簡単な方法はありますか?


編集

データベースに依存しない必要があります。そのためCachedRowSet、データベースではなく を参照しています。

4

7 に答える 7

8

列が CachedRowSet にない場合、findColumn() が InvalidColumName に対して SQLException をスローするという事実を使用するという、より短いアプローチを取ることができます。

例えば

 try {
     int foundColIndex = results.findColumn("nameOfColumn");
} catch {
  // do whatever else makes sense
}

例外処理の悪用の可能性があります (EffectiveJava 2nd ed item 57 による) が、メタデータからすべての列をループする代わりの方法です。

于 2011-01-26T22:54:31.723 に答える
1

どのデータベース?

Oracleには、列がリストされているテーブルがあると思います。

ビューでも機能するかどうかは覚えていませんが、機能していると思います。次のようなものでした。

select colum_name from all_views where view_name like 'myview'

また

select name from all_objects where object_name like 'myview' and object_type='view'

構文は正確には覚えていません。ただし、空間的な権限が必要です。

すべての RDBMS には、同様のものがあるはずです。

クエリを実行することもできます

select * from myView where 1 = 0 ; 

また、メタデータから列を取得します。列が存在するかどうかを知る前に、データのフェッチを回避したい場合。

于 2009-01-20T18:46:42.200 に答える
0

警告:次のコメントは、裏付けとなる事務処理のない純粋に記憶からのものです:)

私の記憶が正しければ、オラクルのキャッシュされた行セットの実装が接続プーリングで使用されると、非常に醜い頭をもたげる不思議な問題があります。キャッシュされた行セット オブジェクト内に保持されている接続への暗黙の参照があるように見えますが (切断されているはずですが)、その後ガベージ コレクションでプールから開かれた別の接続を閉じます。このため、私は最終的にあきらめて、独自のデータ オブジェクト レイヤーを作成しました (最近では、Spring と Hibernate に引き渡します)。

于 2009-10-08T18:34:40.987 に答える