none
DataGridView で auto increment させている primary key が負になるのは仕様? RRS feed

  • 質問

  • id を primary key とする以下のようなテーブルを用意しました。

     

    ----
    id int not null
    name varchar(50) not null
    ----

     

    id は auto increment させます。これを DataGridView に割り当ててデータを
    挿入していくと、id が編集時に負の値となります。一旦保存をすると正の値に
    なるのですが、これは正常なのでしょうか? 未確定の id が編集中に取る値と
    してはまずくはないと思いますので、なんて問題ないと考えていますが。

     

    通常のアプリケーションでは id コラムは Visible = false にする予定ですの
    で、見えはしないのですが、この値の取り方が Windows でのやり方なのか判断
    がつきません。ご存知の方お教え願えないでしょうか。


    念のため、動画も用意しときましたので、ご確認ください。

     

    URL http://custar.s151.xrea.com/videos/datagridview/datagridview.html

     

    動画の中では、テーブルに予め保存しておいた A, B の後に C, D を入力して
    います。その際、id が -1, -2 となっています。

     

     1 A
     2 B
    -1 C
    -2 D

    2007年12月4日 9:20

回答

  • もう答えが出ていますが、データテーブルでidをマイナス方向に増やすのは、常套手段です。このようにしなければアプリケーションが動きません。仕様というよりは必ずこうしなければならないので、たぶん、ダッチさんが言われるように、TableAdapterを作成する際にそのようにデータテーブルが作成されるのでしょう。逆にこのように作成されなければ、VS2008の不具合と言ってもいいほどです。

    2007年12月4日 15:45
    モデレータ

すべての返信

  • なぜ負の値になっているかというと、DB 更新時に競合しなくなるためだと思います。(DB 更新時の技ですね)
    詳しくは「@@IDENTITY クライシスを管理する]」の初めから「ADO.NET での 「コツ」」くらいまでを呼んでいただけるとわかるかと思います。

    レコードを新規作成する際に DB にインクリメントされた値を取得しに行かなくてもいいメリットもありますね。

     

    で、この動きが仕様かと聞かれるとそういったドキュメントを見つけることが出来ませんでした。


    こちらで DataColumn の AutoIncrement プロパティを True にして、その列を主キーにしてみましたが、 AutoIncrementStep プロパティがマイナスになることはありませんでした。

    しかしどこかのタイミングで AutoIncrementStep プロパティの値が -1 になっているところがあるのだと思います。

    TableAdapter などを使用しているのであれば、その処理の中にあるかもしれません。
    2007年12月4日 13:26
  • ダッチ さん、お返事ありがとうございます。

     

    仕様かどうかは大事だとは感じていませんが、そんな挙動を見たことがなかっ
    たのでお聞きしました。情報ありがとうございます。

     

    非接続な仕組みならそういうこともあるのだろうと考えています。

    2007年12月4日 15:06
  • もう答えが出ていますが、データテーブルでidをマイナス方向に増やすのは、常套手段です。このようにしなければアプリケーションが動きません。仕様というよりは必ずこうしなければならないので、たぶん、ダッチさんが言われるように、TableAdapterを作成する際にそのようにデータテーブルが作成されるのでしょう。逆にこのように作成されなければ、VS2008の不具合と言ってもいいほどです。

    2007年12月4日 15:45
    モデレータ
  • 更なる情報ありがとうございます。

     

    「マイナス方向に増やす」というのは、@IT かその手のニュースサイトの連載
    で読んだような気もします。unsigned integer じゃないから、負にインクリメ
    ントすれば、そりゃぶつからないな、とぼんやり思ってました。これが正しく
    それなのか、と実感です。

    2007年12月6日 7:55