- PR -

SQLでの検索結果をハッシュテーブルにセットすると、Exceptionで落ちてしまう。

1
投稿者投稿内容
りょうちん
ベテラン
会議室デビュー日: 2002/09/11
投稿数: 58
投稿日時: 2002-10-10 11:12
Access2000とサーブレット・JSPで在庫管理システムを作成しようとしているのですが、
SelectでSQLが走ったあとに、getDataでヒットしたものを取って、ハッシュテーブル格納して
JSPにフォワードするといった流れです。

whileの中でgetしたものを、ハッシュテーブルにsetしているのですが、


db.setData( "KUBUN"+Integer.toString(count), kubun_henkan( (String)sqlf.getData( "KUBUN" ) ) );
db.setData( "MEKA"+Integer.toString(count), meka_henkan( (String)sqlf.getData( "MEKA" ) ) );
db.setData( "NAME"+Integer.toString(count), (String)sqlf.getData( "NAME" ) );
db.setData( "SEIZOU"+Integer.toString(count) , (String)sqlf.getData( "SEIZOU" ) );

db.setData( "hidKUBUN"+Integer.toString(count), (String)sqlf.getData( "KUBUN" ) );
count++;

てな感じでsetしています。が、"SEIZOU"のセットまではうまくいって、
"hidKUBUN"のsqlf.getData("KUBUN")で、
SQLException:'0'No Data Foundで落ちてしまいます。

以前にも検索系のものを作った事があって、それはOralceを使用しましたが、
うまくいっています。
そのソースをリネームしなおしてみても、同じように例外が発生します。

sqlf.getDataはretValue = this.rs.getObject( key );を行いリターンで返していますが
一回getすると、もう取れなくなるのでしょうか。

良いアドバイスお願いします。


[ メッセージ編集済み 編集者: りょうちん 編集日時 2002-10-10 11:14 ]

[ メッセージ編集済み 編集者: りょうちん 編集日時 2002-10-10 14:25 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2002-10-10 22:10
 APIドキュメントを引用すると、「移植性を最大限に引き出すため、各行内の結果セットの列は左から右の順に読み込まれ、各行は 1 回だけ読み込まれるようにします。」とあります。

 またちょっと古い本ですが、Graham Hamilton等の『JDBCによるデータアクセス』アスキーの13.1.2 列の値の取りだし の最初のほうにも、「それぞれの行の中の列の値は任意の順序で取り出すことができるが、移植性を高めるためには、左から右へ値を取りだし、列の値を一度だけ読み取るべきである。」と書かれています。

 ということは、実装によってはランダムに何度でも読めるものと、そうでないものがあるということだと思われます。 同じAccess2000でもJDBCのドライバを交換できれば、結果は変わる可能性があると思いますが、移植性を考慮すれば依存しないほうが良いでしょう。 最初に読んだものをキャッシュしてください。

あと、「状況が許せば」ですが EJBの使用とか、市販されてる在庫管理パッケージそのものも探してみてはいかがでしょうか?
りょうちん
ベテラン
会議室デビュー日: 2002/09/11
投稿数: 58
投稿日時: 2002-10-15 08:54
ありがとうございます。

>同じAccess2000でもJDBCのドライバを交換できれば、結果は変わる可能性があると思いますが

と言う事ですが、ドライバーを作り直すと言う事ですか?
また、別にAccessとかOracleとかで同じように2度getしたりしているのですが、
このサーブレットで違うDBに接続してもだめで、違うサーブレットだといけたりするんです。
こういう事はよくあるんですか?

それと、キャッシュをとるとはどうすればよいのですか、
そしてキャッシュから値をgetするという事なんですか?

[ メッセージ編集済み 編集者: りょうちん 編集日時 2002-10-15 09:07 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2002-10-15 23:13
私の書き方が悪かったです。「他のドライバが入手できるなら」という意味です。
例えば,今 SDK付属のODBC-JDBCドライバを使ってるなら、他のものにしてみるとか。
(JDK1.1の時代にはSunの以外に Microsoftのとかあったはずですが、SDK以外のものが入手できるかは分かりません。JDBCのドライバを自分たちで作り直す事は大変ですし、DBのバージョンが変わったときの保守を考えると現実的でありません。)
★いずれにせよ、できればドライバには依存しないほうが良いです。

キャッシュと書きましたのは特別な仕組みのことを指しているわけではなく、アプリケーションプログラムの中でローカル変数などに一時的に保存して再利用するということです。例えば先の例を、

String kubun = (String)sqlf.getData("KUBUN"); //区分のキャッシュ

db.setData( "KUBUN"+Integer.toString(count), kubun_henkan(kubun) );
db.setData( "MEKA"+Integer.toString(count), meka_henkan( (String)sqlf.getData( "MEKA" ) ) );
db.setData( "NAME"+Integer.toString(count), (String)sqlf.getData( "NAME" ) );
db.setData( "SEIZOU"+Integer.toString(count) , (String)sqlf.getData( "SEIZOU" ) );
db.setData( "hidKUBUN"+Integer.toString(count), kubun );
count++;

のようにできないでしょうか?
これでマズかったらごめんなさい。
(あと余計な事ですが Integer.toString(count) も沢山あるので一度変数に入れたほうがスッキリするかもしれません。)
りょうちん
ベテラン
会議室デビュー日: 2002/09/11
投稿数: 58
投稿日時: 2002-10-16 08:52
詳しい説明ありがとうございました。

キャッシュをとる事でうまくいきました。
ありがとうございました。

「count」も変数にして見やすくするようします。
1

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