none
ADO.NETの型付きDataSetを使用した自動インクリメントについて RRS feed

  • 質問

  • ADO.NETの型付きDataSetにてデータベースとやりとりしています。

    あるint型のプライマリキーで自動インクリメントを
    行いたいと思い、型付きDataSetのDataTableの
    プロパティのプライマリキーに以下の設定をして
    Updateを行いましたがプライマリキー違反になってしまいます。

     

      AutoIncrement true
      AutoIncrementSeed -1
      AutoIncrementStep -1

     

    この他に何か設定は必要でしょうか?

    ○環境
      Visual Studio 2008
      SQL Server 2005 Standard Edition

    2008年4月8日 15:17

回答

  • ちょっとこれだけでははっきり絞れないのですが、データベースのテーブル側でもAutoIncrementSeed -1, AutoIncrementStep -1のようになっていませんか?

    また、プライマリーキー違反はデータベースのテーブル側で発生しているのでしょうか? それともデータテーブル側で発生しているのでしょうか?

    2008年4月9日 1:02
    モデレータ
  •  ken18 さんからの引用

    データベースのテーブル側では対象の列に対して

    IDENTITYの指定をいいえに設定しています。

    またプライマリーキー違反はデータベースのテーブル側で発生しています。

     

    hogeCountに値が入っていない場合、IDENTITYが「いいえ」なので、nullになろうとします。しかし、プライマリーキーはnullは許可しないので、それでプライマリーキー違反になっているんじゃないかと思います。

    通常はIDENTITYは「はい」にするのですが、なぜ「いいえ」にされているのでしょうか? 「いいえ」であれば、自分で値を与えてあげなければなりません。

    2008年4月9日 4:07
    モデレータ

すべての返信

  • ちょっとこれだけでははっきり絞れないのですが、データベースのテーブル側でもAutoIncrementSeed -1, AutoIncrementStep -1のようになっていませんか?

    また、プライマリーキー違反はデータベースのテーブル側で発生しているのでしょうか? それともデータテーブル側で発生しているのでしょうか?

    2008年4月9日 1:02
    モデレータ
  • 情報が足りてなくて申し訳ございません。

     

    データベースのテーブル側では対象の列に対して

    IDENTITYの指定をいいえに設定しています。

    またプライマリーキー違反はデータベースのテーブル側で発生しています。

     

    例としてデータベースに以下のHogeテーブルがある時に発生します。

    PK hogeCount int

       date     datetime

    ソースは以下です。

    HogeDataSet hogeDataSet = new HogeDataSet();
    TableAdapterManager tableAdapterManager = new TableAdapterManager();
    tableAdapterManager.HogeTableAdapter = new HogeTableAdapter();

    HogeDataSet.HogeRow hogeRow = hogeDataSet.Hoge.NewHogeRow();

    ※hogeCountには値を入れない。

    :

    :

    hogeDataSet.Hoge.AddHogeRow.AddHogeRow();

    ※この時点で対象の列の値には-1が設定されている。

     

    tableAdapterManager.UpdateAll(hogeDataSet);

    ※上記のUpdateAllを実行するとプライマリキー違反になる。

    2008年4月9日 3:27
  •  ken18 さんからの引用

    データベースのテーブル側では対象の列に対して

    IDENTITYの指定をいいえに設定しています。

    またプライマリーキー違反はデータベースのテーブル側で発生しています。

     

    hogeCountに値が入っていない場合、IDENTITYが「いいえ」なので、nullになろうとします。しかし、プライマリーキーはnullは許可しないので、それでプライマリーキー違反になっているんじゃないかと思います。

    通常はIDENTITYは「はい」にするのですが、なぜ「いいえ」にされているのでしょうか? 「いいえ」であれば、自分で値を与えてあげなければなりません。

    2008年4月9日 4:07
    モデレータ
  • IDENTITYを「はい」にすると以下のExcptionが発生しました。

     

    「IDENTITY_INSERT が OFF に設定されているときは、テーブル 'Hoge' の ID 列に明示的な値を挿入できません。」

     

    なのでデータベースでは「いいえ」に設定しなければならないのかなと思っていました。

    が、どうやらそうではないでようですね。

     

    デザイナでDataSetのDataTableを一旦削除して

    データベースの対象の列のIDENTITYを「はい」に設定して

    DataSetにドラッグ&ドロップで新たにDataTableを作成したら

    問題なく自動インクリメントできました。

     

    上記の手順で問題なく行えたことから恐らくですが原因はデータベースのテーブルの

    状態が中途半端に作成されたままでそのテーブルをドラッグ&ドロップしてDataTableを

    作成していたので自動生成されたコードに不備があったのかな・・・と思います。

     

    trapemiyaさんありがとうございました。

    素早い回答に感謝しています。

    2008年4月10日 10:54
  • こんにちは。森田 知良です。

     

    trapemiyaさん、有用な情報ありがとうございました。

     

    ken18さん、その後いかがでしょうか?
    trapemiyaさんの情報は、有用な情報と思われましたので、
    勝手ながら回答済みチェックを付けさせていただきました。


    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有効な回答があった場合は、なるべく回答済みボタンを押してチェックを付けてくださるようお願いします。

     

    ken18さんは、回答済みチェックを解除することもできますのでご確認ください。

     

    また、4/9 午後 12:27 のken18さんの投稿が二重投稿になってしまっていたようでしたので、

    勝手ながら削除させていただきました。


    それでは、これからもフォーラムのご利用をよろしくお願いいたします。

    2008年4月16日 6:31