- ベストアンサー
IDの採番について
こんばんわ。 現在、MSDEとC#でアプリケーションを考えていますが、 Accessだと自動採番のオートナンバー型がありますが、 MSDEではIDなどの通し番号の採番をどのように行うのが定番なのでしょう? 自動採番の仕組みをストアドプロシージャなどで組むのでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 Accessのオートナンバーと同じです。 もう少し細かく書くと create table tbl (retu1 int IDENTITY, retu1 varchar(10)) でテーブルを作ったとして、プログラムに書くinsert文はこうなります。 insert into tbl(retu2) values ('あ') これでretu1には勝手に連番がふられます。 retu1の値をプログラム側で使いたい時はストアドを使用する必要あり。 declare @i int insert into tbl(retu2) values ('あ') set @i=@@IDENTITY この@iを返すストアドにします。 .NETでは独自のメソッドがあるかもしれません。
その他の回答 (3)
- utakataXEX
- ベストアンサー率69% (711/1018)
締め切ってないので補足します。 ストアドレベルでの同時実行なら、値の重複は、まず 有り得ません。 なので問題となるとすれば、受け取った側がスレッドセーフ になっていない場合とかですね。 セッション管理とかに使いたいなら要注意。
- utakataXEX
- ベストアンサー率69% (711/1018)
#2です。 create文を間違えました。 create table tbl (retu1 int IDENTITY, retu2 varchar(10))
お礼
たびたび回答ありがとうございます。 クエリアナライザで動作確認しました。 まだまだ、教えていただいたことしかできないレベルで、 自分の能力の無さを痛感しました・・・ 最後の変数を定義するやり方が自分の考えている形ででは必要な気がしてきました。 今度は、その@iをプログラム側で取得する方法をまずは調べてみようと思います。 ただ、同時実行時の問題にもなりそうですね。 マシンAとマシンBからinsertがあった場合など・・・ しばらくはBooksOnlineとInternetでの調査でレベルアップを図ろうと思います。 ありがとうございます。
- utakataXEX
- ベストアンサー率69% (711/1018)
オートナンバーと同様にIDENTITYを使います。 こんな感じです。 create table tbl (retu int IDENTITY) BooksOnline参照。 (なければ MS のサイトから落とす)
お礼
回答ありがとうございます。 IDENTITYを使うのですね。 >create table tbl >(retu int IDENTITY) ・この一文は、テーブル作成時に、retuフィールドのIDENTITYプロパティを「はい」にするのと同じことなのでしょうか? ・C#からデータのInsertするときに、retuの最大値を持っているIDENTITYプロパティからデータを取得するのでしょうか? どうも、ID自動生成とプログラムからの挿入操作と同時実行性について、BooksOnlineを見ただけでは、 それらの絡みがわからなかったので質問させていただきました。
お礼
utakataXEXさん、何度もありがとうございます。 締め切るの忘れていました。(^_^;) おかげで、また情報をいただけました。 セッション管理には使いません。 ただ、スレッドセーフな状態というのは、 少々怪しい部分もあるので、ソフト同士の状態をスレッドセーフにできるかどうか実験してみたいと思います。 ありがとうございます。