• ベストアンサー

IDの採番について

こんばんわ。 現在、MSDEとC#でアプリケーションを考えていますが、 Accessだと自動採番のオートナンバー型がありますが、 MSDEではIDなどの通し番号の採番をどのように行うのが定番なのでしょう? 自動採番の仕組みをストアドプロシージャなどで組むのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

#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)
回答No.4

締め切ってないので補足します。 ストアドレベルでの同時実行なら、値の重複は、まず 有り得ません。 なので問題となるとすれば、受け取った側がスレッドセーフ になっていない場合とかですね。 セッション管理とかに使いたいなら要注意。

kenton
質問者

お礼

utakataXEXさん、何度もありがとうございます。 締め切るの忘れていました。(^_^;) おかげで、また情報をいただけました。 セッション管理には使いません。 ただ、スレッドセーフな状態というのは、 少々怪しい部分もあるので、ソフト同士の状態をスレッドセーフにできるかどうか実験してみたいと思います。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#2です。 create文を間違えました。 create table tbl (retu1 int IDENTITY, retu2 varchar(10))

kenton
質問者

お礼

たびたび回答ありがとうございます。 クエリアナライザで動作確認しました。 まだまだ、教えていただいたことしかできないレベルで、 自分の能力の無さを痛感しました・・・ 最後の変数を定義するやり方が自分の考えている形ででは必要な気がしてきました。 今度は、その@iをプログラム側で取得する方法をまずは調べてみようと思います。 ただ、同時実行時の問題にもなりそうですね。 マシンAとマシンBからinsertがあった場合など・・・ しばらくはBooksOnlineとInternetでの調査でレベルアップを図ろうと思います。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

オートナンバーと同様にIDENTITYを使います。 こんな感じです。 create table tbl (retu int IDENTITY) BooksOnline参照。 (なければ MS のサイトから落とす)

kenton
質問者

お礼

回答ありがとうございます。 IDENTITYを使うのですね。 >create table tbl >(retu int IDENTITY) ・この一文は、テーブル作成時に、retuフィールドのIDENTITYプロパティを「はい」にするのと同じことなのでしょうか? ・C#からデータのInsertするときに、retuの最大値を持っているIDENTITYプロパティからデータを取得するのでしょうか? どうも、ID自動生成とプログラムからの挿入操作と同時実行性について、BooksOnlineを見ただけでは、 それらの絡みがわからなかったので質問させていただきました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Accessで自前の自動採番処理で採番テーブルを

    Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に 1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。 2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか? ご回答のほうよろしくお願いします。

  • 自動採番について

    初心者です。 Access2000で銀行管理DBを作っています。 (1)テーブルを入金用と出金用それぞれに作成 (2)データ入力用フォームもそれぞれに作成します。 入力にあたって入力番号を自動採番にしたいと考えてますが、番号の構成は数値10桁で、"年" + "月" + "連番"の組み合わせにしたいのです。例:2003070001 入金用と出金用それぞれ別に入力番号をつけます。 これを実現するために「採番テーブル」を別に作成しなければいけないようですが、 (1)採番テーブルの定義の方法 (2)入力フォームで自動採番するためのVBA記述の方法 についてアドバイスいただけないでしょうか? よろしくお願いします。

  • 文字を含むIDの自動採番

    Access2013を使っています。 IDはテキスト型で、 A00000000 っていう書式なんですが、 新規レコード作成時のイベントで、ID自動採番(連番をふる)をしたいのですが、下記だと最初の1レコード(A00000001)以降がエラーになってしまいます。 Format(Nz(DMax("ID", "T_テーブル名"), 0) + 1, "\A00000000" ) もちろん、すでにあるIDがA00000001なので、DMaxが使えないんですが、どうやって分けてやったら良いのかわかりません。 やりたい結果は、新規レコード作成時に、IDが"A"&"8ケタの最大値+1"が自動に振られて、テーブルのIDフィールドにA00000001、A00000002・・・とデータ保持したいのです。 説明が判り辛くて恐縮ですが、ご教示お願いします。

  • 自前の採番処理をするとリレーションが

    自前の採番処理を作成するのが初めてなので質問したいのですが 自前の採番処理をしてオートナンバー型を主キーで使用しないようにすると、リレーションが、参照整合性のところが設定出来ません。自動連鎖更新など。 これは、普通のことでしょうか? あと、MainとSubのFormがある場合、Subフォームでの自動採番処理はどのようにすれば良いでしょうか? よろしくお願いします。

  • エクセルで自動採番する方法

    「管理対象区分(カラムA)」、「起票日(カラムB)」を使って、「ID(カラムC)」に自動採番したいのですが、効果的な関数をご教示いただけないでしょうか。 ID採番のロジックは以下の通りです。 (1)(「管理対象区分」の頭文字3桁) + (2)(「起票日」のYYYYMM) + (3)(「起票日」が同月内であれば同月の通し番号、翌月であれば「001」から振り直し) <特記事項> A. (2)について、MMが一桁の場合でも、2桁表示したい(例:1月⇒01) B. (3)について、常に3桁で表示したい ご回答いただけると幸いです。 よろしくお願いいたします。

  • ACCESSでの自動採番

    立て続けの質問お許しください。 Accessで、自動採番をしていきたいのですがアドバイスお願いいたします。 フィールド1→年度 (ex.2003) フィールド2→採番番号 (ex. 01) というものを作って、フォームでフィールド1、2ともに自動採番していきたいと考えています。 (2003 01, 2003 02,・・・・というふうに自動採番していきたい) しかし、来年の4月になったらフィールド1の年度を"2004"に自動変更し、変更後、フィールド2の値を1から取り直したいのです。このようなことを自動でやるのは可能なのでしょうか? DMAX関数を使って・・・と思ったのですが、年度が変更したときにどのようにフィールド2の値を1から取り直せばいいのかが分かりません。あと、2004年4月になって初めてフィールド1の値を2004と更新したいのですがどうやればいいかわかりません。 どなたか詳しい方お願いします

  • 自前採番処理について

    Access2013で、自前で採番処理をスル場合 以下のどちらが正しいでしょうか? 1) フォームの保存ボタンで、採番管理テーブルを参照して、現在の主キーのID番号を取得して、それに+1したものを採番管理テーブルに保存し、エラーがなければ、画面にセットして保存。 2) フォームのレコードソースのID番号の最大値を取得して、それに+1加算したものを採番管理テーブルに保存し、エラーがなければ、画面にセットし保存。 1) 2)どちらも、採番管理テーブルに+1した番号を保存する時にエラーが起きたら、画面は Me.Undoする。 よろしくお願いします。

  • Accessで、ある行を並び替えた後に採番したい。

    初心者です。よろしくお願いいたします。 ACCESSで顧客データがあります。 部署、名前、住所・・・・といったテーブルを元 にして作成した入力フォームがあります。 ところが、最近になってデータごとにIDを振る ことになりました。しかも「まずは部署でソートを かけてから採番する」ということになりました。 通常でしたら、テーブルにオートナンバー型のフィールドを作成すればいいと思うのですが、その前に「部署」フィールドでソートをかけないといけないのです。 (1) データを追加する (2) 部署でソートをかける (3) (2)の状態で採番 ・・・・という流れにしたいのです。なので データを追加するたびに必ず最後に最新の状態 で採番し直す!と言った感じです。 上記のような方法はありますでしょうか。 よろしくお願いたします。

  • Microsoft Accessで自動採番をさせたい。

    いつも大変お世話になっております。 アクセスでの質問です。 フィールドに「管理ID」があって、ここに8ケタのコードが自動採番されるようなしくみにしたいと考えています。 この管理IDは8ケタで、採番の仕組みは以下の通りです。 (1)「アイテム分類」というフィールドに入った製品によって頭2桁が決まる。 例)野菜・・・YA   果物・・・KU   鮮魚・・・SE (2)入力しているのが06年07月だったら次の4桁は「0607」になる。 ここまでで、頭の6ケタ「YA0607」などまでが決まる。 最後の2桁は、その月に発生している情報の連番をつけていきたい。 例) 06年07月に1番目に採番されたデータ→YA060701 06年07月に5番目に採番されたデータ→YA060705 という具合に・・・ これにはたくさんの要素がつまっています。 要素(1) 採番するフィールド以外のフィールド(アイテム分類)を見て、頭2文字を決めること。(ただし、規則はありますので、DBで表すことはできます) 要素(2) 現在のDATEから、年と月だけ4桁拾うこと 要素(3) 過去に発生しているレコードを抽出・カウントし、最後の数字の+1になる番号をつける ということです。 上記のようなことが可能なのでしょうか? 分かりましたら、できるだけ具体的に教えてください。よろしくお願いします。m(_ _)m

  • 伝票番号の自動採番について

    伝票番号の採番で、西暦+5桁という仕様です。 これを、年が変わってから入力する際に 新しい年(度)+00001 としたいのですが、どのようにプログラムを組んだらいいのか分かりません。 ちなみに今までのプログラムでは Format関数や、DMax関数を使って自動採番していました。 Access2000での開発です。 どうぞよろしくお願いします。