複数PCで自動採番を行う場合 重複しない値取得するには

解決


にもにも  2008-07-23 16:49:05  No: 140119  IP: 192.*.*.*

VB6で複数PCで番号を自動採番する場合に番号の重複チェックをしたいのですが
現在は自動採番で同じ値が表示してしまいます。
思いつく方法だと
自動採番したときにDBにその番号を登録し
他のPCで自動採番が行われたらDBに同じ番号がないかチェックすると言う方法です。DBには登録しないでって言われてしまい困っています。

一時的に保存できて複数のPCから参照できる方法を知りたいです。

編集 削除
ひで  2008-07-23 17:02:39  No: 140120  IP: 192.*.*.*

自動番号を振るだけならば、
DBにも寄るけれど、ROWID型でもいいのでは?

編集 削除
 2008-07-23 17:05:13  No: 140121  IP: 192.*.*.*

>DBには登録しないでって言われてしまい困っています
また無茶な…

DBのかわりにテキストファイルを使って、Lockしながらでも
不可能では無いかもしれないが、かなり不安が残る気がする

ちなみに、基本的には自動採番する場合は
>他のPCで自動採番が行われたらDBに同じ番号がないかチェックする
というより、
採番したいアプリが採番制御情報(現在の最終番号)をLockしながら取得して、
さらに番号を1つ上げて書き込み、正常に書けたら、その番号(上げた番号)を
使う、とかするのが王道だと思う
これだとレコード件数も少なくて済むし
(採番中、他からは、ロックされているので更新等ができないので矛盾は生じないはず
  MDBなんかだと ちょっと怖い気もするが…)

編集 削除
にもにも  2008-07-23 17:10:31  No: 140122  IP: 192.*.*.*

DBはオラクル9iです。
複数PCで同時に登録作業を行う事が多いので自動採番時に番号がかぶると
入力しなおしというのを回避したかったのです。
番号を変更すると他の入力情報が画面から消えてしまうという仕様があるので
番号を手入力で修正できないのも参ってます。

ROWID型の使い方を調べてみます。

編集 削除
NIMONIMO  2008-07-23 17:23:21  No: 140123  IP: 192.*.*.*

lockするのは思いつきませんでした。今採番している時にLOCKしていないのでlockする方法を考えてみます。自動採番されたらlockして他のPCで自動採番が行われたらlockしている番号より+1した値を取得。登録完了時にLOCKをはずす。という方向でがんばってみます。ありがとうございました。>ひで さん,あ さん

編集 削除
魔界の仮面弁士  2008-07-23 19:42:14  No: 140124  IP: 192.*.*.*

Oracleなのですよね。「DB への登録は不可」の理由にもよりますが、
単純に SEQUENCE から NEXTVAL するのは駄目なのでしょうか?

編集 削除
 2008-07-24 09:46:31  No: 140125  IP: 192.*.*.*

確かにOracleならSequence使うのが常套手段かもですね
私が書いた方法はRDBでなくても使えるけど面倒だし

編集 削除
にもにも  2008-07-24 10:27:38  No: 140126  IP: 192.*.*.*

シーケンスを使用する方向で解決しました。みなさんありがとうございました。

編集 削除