- - PR -
SQL updateの質問
1
| 投稿者 | 投稿内容 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-30 21:16
今、施設予約のプログラムのDAOを作っていて、SQLのupdateで悩んでいます。Updateの条件が、施設IDとユーザーID,時間です。予約を行った人だけが更新可能です。 public void getRecords() throws SQLException { String sql = "SELECT * FROM FACILITY_RESERVATION_TABLE ORDER BY FACILITY_RESERVATION DESC"; ResultSet rs = stmt.executeQuery(sql); public TreeMap getRecords(FacilityVO3 record, Vector facility)throws SQLException { String date = record.getDate(); pstmt = conn.prepareStatement("SELECT * FROM FACILITY_INFO_TABLE WHERE DATE= ? AND ID = ?"); TreeMap tmap = new TreeMap(); for (int i = 0; i < facility.size(); i++) { FacilityBean facilityBean = (FacilityBean) facility.get(i); pstmt.setString(1, date); pstmt.setString(2, facilityBean.getId()); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { for (int j = 9; j < 21; j++) { String key = facilityBean.getId() + "_" + String.valueOf(j); String _hour = rs.getString("r" + j); if (_hour == null || _hour.equals("")) { tmap.put(key, null); } else { tmap.put(key, _hour); } } } rs.close(); } pstmt.close(); return tmap; } public int insertFacility(TreeMap record) throws SQLException { *ここにどのようにUpdateのコードをいれるか、どなたか教えてください!!! | ||||||||||||||||||||
|
投稿日時: 2005-05-31 09:58
と書いてあって、Javaのソースがかかれていますが、 テーブル構造や、どんなUpdateを発行したいのか Update文自体が分からないのか、やってみたけどエラーになるのか… updateの何で悩んでいるのかを明記していただけますか? SQLとは関係ないですが…
Updateのコードとかかれていて、メソッド名にinsertがつくんですか? | ||||||||||||||||||||
|
投稿日時: 2005-05-31 13:40
最初に、この部分はコピーミスだと思われますので、削除してください。
SQL 文に求める機能仕様として意味不明です。 施設ID、ユーザID、時間が条件を満たした時ということはわかりますが、どのテーブルのどのカラムを何で update したいのか明確にしましょう。
「予約を行った人」というのはどのように表現されるデータですか? それともあるセッション中でユーザが予約機能を実行した場合に限り、更新機能も実行できるという意味ですか? このあたりを明確にしてください。 (後者だったら、トランザクション管理をきちんとした上で、予約機能を実行した時にフラグを立てれば良い気もしますが) | ||||||||||||||||||||
|
投稿日時: 2005-05-31 22:30
返答してくださって、ありがとうございます。
昨日投稿した情報だけでは、不十分でした まずテーブルの構成は、施設ID,施設予約日,各時間帯の情報が1レコードになっています。予約をする場合、1.レコードが無い場合2.既にレコードが存在する場合の2とうりです。 a. 予約情報の取得:日付情報を指定して、キー: "施設ID" + "_" + "時間" 値 : 予約状況(社員ID or null or ""等) b. 予約情報の更新(こちらの処理で悩んでいます。)情報の更新に必要なデータが、日時、施設ID、予約ID。画面では複数施設の複数時間帯を選択可能です。 テーブルは、下記のようにつくりました。また、時間も別クラスでつくってあります。 ■施設情報テーブル(FACILITY_INFO_TABLE) -------------------------------------------------------------------- フィールド名 データ型 概要 -------------------------------------------------------------------- ld INT 施設ID Name VARCHAR(30) 施設名 ■施設予約者テーブル(FACILITY_USER_TABLE) -------------------------------------------------------------------- UserID INT(10) 社員ID User VARCHAR(30) 社員名 ■施設予約テーブル(FACILITY_RESERVATION_TABLE) -------------------------------------------------------------------- ld INT 施設ID Date DATE 施設予約日 r09 VARCHAR(10) 09:00〜10:00の予約者ID r10 VARCHAR(10) 10:00〜11:00の予約者ID r11 VARCHAR(10) 11:00〜12:00の予約者ID r12 VARCHAR(10) 12:00〜13:00の予約者ID r13 VARCHAR(10) 13:00〜14:00の予約者ID r14 VARCHAR(10) 14:00〜15:00の予約者ID r15 VARCHAR(10) 15:00〜16:00の予約者ID r16 VARCHAR(10) 16:00〜17:00の予約者ID r17 VARCHAR(10) 17:00〜18:00の予約者ID r18 VARCHAR(10) 18:00〜19:00の予約者ID r19 VARCHAR(10) 19:00〜20:00の予約者ID r20 VARCHAR(10) 20:00〜21:00の予約者ID r21 VARCHAR(10) 21:00〜22:00の予約者ID まだ、Javaの勉強を始めて4月半で、知識もあいまいなので、時間がかかっています。よろしくお願いします。 | ||||||||||||||||||||
|
投稿日時: 2005-05-31 23:33
予約日のレコードが無ければinsertして。 がんばってください # 以下追記 PrepareStatementを使うなら
[ メッセージ編集済み 編集者: taro 編集日時 2005-06-01 03:07 ] | ||||||||||||||||||||
|
投稿日時: 2005-06-01 10:03
taroさんありがとうございます。1件の更新はそうなり、画面で複数のデータが1回のリクエストでくるようにしたいのですが、それをDAOとビジネスロジクをどのように分ければいいか教えていだだけませんか?? | ||||||||||||||||||||
|
投稿日時: 2005-06-01 10:57
もう少し他人に読んでもらうということを意識して、整理して書きましょうよ。
a. 予約情報の取得: 施設ID、日付情報、予約時間を検索キーとして施設予約テーブルを検索する。 値として予約状況が得られる。 予約状況は以下のキーと値のペアを管理する TreeMap オブジェクトとして返される。 キー: 施設ID + "_" + 時間 値: 予約されていれば予約した社員ID、されていなければ null あと、本来独立した情報であるはずの施設IDと時間を結合した文字列として返すのは、もし受け取った側で再び解析するならばですが、プログラムの処理効率を悪くするため推奨しません。 せめて
くらいのクラスを作り、そのオブジェクトの集合を返すようにしましょう。 (蛇足ですが、最初の投稿の _hour 変数って、時間ではなくて予約者IDを保持するものですね。誤解を招くのでやめましょう。) で、ここまで来てようやく本題ですが、再び、最初の投稿の
の「予約を行った人」と更新を行おうとしている人の関係を整理してください。 一般的には、現セッション中で保持されているであろう操作者IDと予約者IDを比較して、完全に一致しなければ更新不可とするとは予想できます。 これが SS さんが書かれた意図と一致するとは限りませんので、今一度、ご自身の手と頭で要件を整理してください。 ここまで相当「鞭」を駆使したので、ここらで「飴」をば
以下同様。 以前の予約者と同じ人物が予約を取り消したい場合は、
のようになるのでしょうか。 個人的には施設予約テーブルのスキーマ自体に違和感を覚えます。 自分で作るとしたら facilityID integer 施設ID reservedDate date 予約日付 hourZone integer 時間帯 だけにして、 列制約: 9 <= hourZone <= 21 表制約: facilityID, reservedDate, hourZone の組が一意 あたりにするかな〜。 (でも組み始めてやっぱり違っていたら変える 連続性のある予約時間帯をわざわざ別カラムにするというのが、その後のテーブル操作性をまったく考えていない設計に見えます。 | ||||||||||||||||||||
1
