C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: ユニークコードの生成について教えて下さい


(過去ログ 41 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■21211 / inTopicNo.1)  ユニークコードの生成について教えて下さい
  
□投稿者/ 青雉 (6回)-(2008/06/27(Fri) 10:02:47)

分類:[.NET 全般] 

こんにちわ。

ASP.NET C#でWEBアプリケーションを作成しています。

フォーム上に記載されているTextBox等を「登録」ボタンによってテーブルにレコード
追加される仕組みなのですが、追加の際に「依頼番号」というカラムにユニークなコードを振りたいと思っています。

(例)
BS-20080627-0001
の様な感じです。

コード振るまではできるのですが、このWEBアプリケーションを大人数で使う予定なので
複数の人が同時に登録ボタンを押下した際に同じコードが重複してしまいます。

重複しないユニークなコードを生成したいのですが分からず行き詰っております。

いい方法がありましたらご教示下さい。

よろしくお願い致します。
引用返信 編集キー/
■21213 / inTopicNo.2)  Re[1]: ユニークコードの生成について教えて下さい
□投稿者/ επιστημη (1122回)-(2008/06/27(Fri) 10:12:39)
επιστημη さんの Web サイト
> 重複しないユニークなコードを生成したいのですが分からず行き詰っております。

コード振り分け機がいくつもの要求に"同時に対応しちゃう"のがいかんのですよね。
semaphoe/mutexの類で排他できんのですか?

引用返信 編集キー/
■21214 / inTopicNo.3)  Re[2]: ユニークコードの生成について教えて下さい
□投稿者/ 青雉 (7回)-(2008/06/27(Fri) 10:20:52)
No21213 (επιστημη さん) に返信

επιστημηさま
ありがとうございます。

> コード振り分け機がいくつもの要求に"同時に対応しちゃう"のがいかんのですよね。
おっしゃる通りです。

> semaphoe/mutexの類で排他できんのですか?
ちょっと分からないので調べてみます(^ ^;
引用返信 編集キー/
■21215 / inTopicNo.4)  Re[3]: ユニークコードの生成について教えて下さい
□投稿者/ 青雉 (8回)-(2008/06/27(Fri) 10:24:27)
No21213 (επιστημη さん) に返信

>>semaphoe/mutexの類で排他できんのですか?
> ちょっと分からないので調べてみます(^ ^;

分かりました!
コードを実行できるスレッドの個数を制限するといった感じですね?

できれば全員でやりたいのですが...
難しいお話なのでしょうか。
引用返信 編集キー/
■21217 / inTopicNo.5)  Re[1]: ユニークコードの生成について教えて下さい
□投稿者/ いしだ (138回)-(2008/06/27(Fri) 10:33:59)
テーブルのコード列にユニーク制約をつけて、挿入時に重複エラーが
発生したらコードを生成しなおせば良いんじゃないでしょうか。
または、テーブルロック機能を組み込むとか。
引用返信 編集キー/
■21218 / inTopicNo.6)  Re[2]: ユニークコードの生成について教えて下さい
□投稿者/ 青雉 (9回)-(2008/06/27(Fri) 10:48:36)
No21217 (いしだ さん) に返信

いしだ さま
ありがとうございます。

> テーブルのコード列にユニーク制約をつけて、挿入時に重複エラーが
> 発生したらコードを生成しなおせば良いんじゃないでしょうか。
> または、テーブルロック機能を組み込むとか。
なるほど!
重複エラー時の生成プログラムを組んでおくという事ですね?
テーブルロック機能はイメージが湧きませんが...

1度作ってみたいと思います。
ありがとうございました!
解決済み
引用返信 編集キー/
■21220 / inTopicNo.7)  Re[3]: ユニークコードの生成について教えて下さい
□投稿者/ nbmyou (9回)-(2008/06/27(Fri) 11:24:16)
2008/06/27(Fri) 11:37:07 編集(投稿者)
2008/06/27(Fri) 11:32:36 編集(投稿者)

解決した話に割り込んですみません^^

ユニークなコードというのは、連番でもいいのでしょうか?

もし連番でいいのであれば、
プログラム側で重複エラー処理なんてしなくても
DB側の処理(SQL文など)でユニーク連番の生成・使用は可能です。

使用するDBによってちょっとずつ扱い方が違いますが、
「シーケンス(SEQUENCE)」で調べてみるとわかると思います。
(確かSQLServerなら、もっと簡単にできたはず)

<編集時に追記>
あ!よく質問を読んでませんでした(汗)
単純な連番ではなく、(分類-年月日-連番)のようなものなのですね。

ならば、重複エラー処理の方法がいいのかもしれません。。。
失礼しました。
解決済み
引用返信 編集キー/
■21223 / inTopicNo.8)  Re[4]: ユニークコードの生成について教えて下さい
□投稿者/ 青雉 (10回)-(2008/06/27(Fri) 11:43:02)
No21220 (nbmyou さん) に返信

nbmyou さん
ありがとうございます!

そうなんです。
単純な連番ならオートナンバーでやってしまいたかったのですが...

1つ伺ってよろしいでしょうか?

> ならば、重複エラー処理の方法がいいのかもしれません。。。

これって例外処理で行えばいいのでしょうか?
やった事なかったので(^ ^;
引用返信 編集キー/
■21267 / inTopicNo.9)  Re[5]: ユニークコードの生成について教えて下さい
□投稿者/ DELI (1回)-(2008/06/29(Sun) 17:42:13)
[επιστημηさんが出したmutexについての補足になります]

mutexを使えば「該当処理は同時に1スレッドしか実行されない」事を保障出来ます。
つまり、mutexで囲った箇所に生成する処理を入れてやれば良いと言うことです。

例えば、次に2が生成されるべきタイミングで同時に2つの生成要求が来た場合は、片方がmutexによって
待たされます。で、先に実行された方が処理を抜けてから待たされた方の処理が実行されます。
mutexで囲った範囲内で「次は3になるよ♪」という処理を入れてやってれば、先に実行された方は2が
与えられて、待たされた方は3が与えられます。


という話から、「全員でやりたいのですが・・・」という回答への繋がりが読み取れませんでした(^^;

まぁ、あくまでプログラム上で特殊な生成をしたいときの話です。DB内の情報であり、さらにシンプルな
値の生成ならDBに任せた方が良いです。
引用返信 編集キー/
■21310 / inTopicNo.10)  Re[6]: ユニークコードの生成について教えて下さい
□投稿者/ 青雉 (11回)-(2008/06/30(Mon) 17:34:23)
No21267 (DELI さん) に返信

DELI さん
ありがとうございます。


> [επιστημηさんが出したmutexについての補足になります]
>
> mutexを使えば「該当処理は同時に1スレッドしか実行されない」事を保障出来ます。
> つまり、mutexで囲った箇所に生成する処理を入れてやれば良いと言うことです。
>
> 例えば、次に2が生成されるべきタイミングで同時に2つの生成要求が来た場合は、片方がmutexによって
> 待たされます。で、先に実行された方が処理を抜けてから待たされた方の処理が実行されます。
> mutexで囲った範囲内で「次は3になるよ♪」という処理を入れてやってれば、先に実行された方は2が
> 与えられて、待たされた方は3が与えられます。
>
>
> という話から、「全員でやりたいのですが・・・」という回答への繋がりが読み取れませんでした(^^;
「mutex」というものの概要を理解しないまま回答してしまいました。
申し訳ありませんでした。

> まぁ、あくまでプログラム上で特殊な生成をしたいときの話です。DB内の情報であり、さらにシンプルな
> 値の生成ならDBに任せた方が良いです。
多重起動防止がいいのか自分がやりやすい方法で試してみたいと思います。
ありがとうございました。


何度も同じお尋ねで恐縮ですが、データベースにて重複エラー処理をする
場合は例外処理以外に方法はないのでしょうか?

最後にご教示お願い致します。

引用返信 編集キー/
■21458 / inTopicNo.11)  Re[7]: ユニークコードの生成について教えて下さい
□投稿者/ nbmyou (11回)-(2008/07/02(Wed) 13:18:55)
No21310 (青雉 さん) に返信

> データベースにて重複エラー処理をする
> 場合は例外処理以外に方法はないのでしょうか?

僕であれば例外処理で処理すると思います。

DBは何を使用しているのか、DBとの接続には何を使用しているのかなど
詳細がわからないため大雑把な回答ですが、
「一意制約違反の例外が発生した場合、再度採番を行いINSERT」
するような処理ではダメでしょうか?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -