- PR -

データがないカラムの検索について

1
投稿者投稿内容
ひびき
会議室デビュー日: 2004/11/09
投稿数: 18
投稿日時: 2004-11-11 09:40
お世話になっております。

SQLの検索結果をVectorオブジェクトとして返そうとしています。
Vectorクラスの要素として、Hashtableオブジェクトを格納する形でデータを保持したいのですが、
検索したカラムの中にデータがないものがある場合、返したVectorオブジェクトのサイズが
0になってしまい、結果が表示できません。
データがないカラムは検索できないのでしょうか?
















山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-11 10:18
Vector または Hashtable の使い方がわからないのでしょうか?
それとも SQL の投げ方がわからないのでしょうか?
問題をもう少し切りわけましょう。
ひびき
会議室デビュー日: 2004/11/09
投稿数: 18
投稿日時: 2004-11-11 11:03
説明がきちんとできていなくて申し訳ありません。

例えば、DBのデータでCOLUMN_NAME,DATA_TYPEはNOTNULL制約で必ずデータが入っているが、CHAR_LENGTH は入っていないこともある場合に、

select COLUMN_NAME,DATA_TYPE, from USER_TAB_COLUMNS
というSQLをなげて結果をResultSet型のrsetに入れ、

Vector v = new Vector();
ResultSetMetaData meta = rset.getMetaData();
int cols = meta.getColumnCount();
while ( rset.next() ) {
 Hashtable hash = new Hashtable();
 for(int i=1; i <= cols; i++) {
  hash.put(meta.getColumnName(i), rset.getObject(i));
 }
 v.add(hash);
}
を実行すると、
rset.size();の値は検索結果件数になるのですが、

select COLUMN_NAME,DATA_TYPE,CHAR_LENGTH from USER_TAB_COLUMNS
というSQLを投げて同じように実行すると、
rset.size();の値が0になってしまいます。

JSP側ではrsetをVector型のresultで受け取って
<%
for( int i = 0; i < result.size(); i++) {
Hashtable hash = (Hashtable)result.get(i);
%>
<%= hash.get("COLUMN_NAME") %>
<%= hash.get("DATA_TYPE") %>
<%= hash.get("CHAR_LENGTH") %>
と実行し、検索結果を表示したいのですが、結果が表示されません。
なにか解決策などありますでしょうか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-11 11:18
推測ですが、良くあることなので一応。
Hashtableへのnull値のput()を行うと、NullPointerExceptionが発生します。

そちらのプログラムで、Hashtableへのput()が何らかの例外を発生した場合に、
何も対処せずにそのまま処理を続行するようなプログラムであった場合、
結果的に空のHashtableが返されることになりかねないと思います。

対処方法は、Hashtableを使うのをやめて、HashMapにしてみるとよいです。
こちらは、値にnullを挿入することが可能です。

HashtableおよびVectorは古いAPIの名残だと思っておいて、基本的には使わな
い方がよいですよ。これらを利用することによる実質的なメリットはほぼ0ですし。
ひびき
会議室デビュー日: 2004/11/09
投稿数: 18
投稿日時: 2004-11-11 11:27
お返事ありがとうございます。

> ashtableへのput()が何らかの例外を発生した場合に、
> 何も対処せずにそのまま処理を続行するようなプログラムであった場合、
> 結果的に空のHashtableが返されることになりかねないと思います。
例外対策の処理をなにも行っていませんでした。
こういう場合は空のHashtableが返されるんですね。。。
HashMapを使ってもう一度試してみたいと思います。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)