トップ回答者
ADO.NETの型付きDataSetを使用した自動インクリメントについて

質問
-
ADO.NETの型付きDataSetにてデータベースとやりとりしています。
あるint型のプライマリキーで自動インクリメントを
行いたいと思い、型付きDataSetのDataTableの
プロパティのプライマリキーに以下の設定をして
Updateを行いましたがプライマリキー違反になってしまいます。AutoIncrement true
AutoIncrementSeed -1
AutoIncrementStep -1この他に何か設定は必要でしょうか?
○環境
Visual Studio 2008
SQL Server 2005 Standard Edition
回答
-
ken18 さんからの引用 データベースのテーブル側では対象の列に対して
IDENTITYの指定をいいえに設定しています。
またプライマリーキー違反はデータベースのテーブル側で発生しています。
hogeCountに値が入っていない場合、IDENTITYが「いいえ」なので、nullになろうとします。しかし、プライマリーキーはnullは許可しないので、それでプライマリーキー違反になっているんじゃないかと思います。
通常はIDENTITYは「はい」にするのですが、なぜ「いいえ」にされているのでしょうか? 「いいえ」であれば、自分で値を与えてあげなければなりません。
すべての返信
-
情報が足りてなくて申し訳ございません。
データベースのテーブル側では対象の列に対して
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を実行するとプライマリキー違反になる。
-
ken18 さんからの引用 データベースのテーブル側では対象の列に対して
IDENTITYの指定をいいえに設定しています。
またプライマリーキー違反はデータベースのテーブル側で発生しています。
hogeCountに値が入っていない場合、IDENTITYが「いいえ」なので、nullになろうとします。しかし、プライマリーキーはnullは許可しないので、それでプライマリーキー違反になっているんじゃないかと思います。
通常はIDENTITYは「はい」にするのですが、なぜ「いいえ」にされているのでしょうか? 「いいえ」であれば、自分で値を与えてあげなければなりません。
-
IDENTITYを「はい」にすると以下のExcptionが発生しました。
「IDENTITY_INSERT が OFF に設定されているときは、テーブル 'Hoge' の ID 列に明示的な値を挿入できません。」
なのでデータベースでは「いいえ」に設定しなければならないのかなと思っていました。
が、どうやらそうではないでようですね。
デザイナでDataSetのDataTableを一旦削除して
データベースの対象の列のIDENTITYを「はい」に設定して
DataSetにドラッグ&ドロップで新たにDataTableを作成したら
問題なく自動インクリメントできました。
上記の手順で問題なく行えたことから恐らくですが原因はデータベースのテーブルの
状態が中途半端に作成されたままでそのテーブルをドラッグ&ドロップしてDataTableを
作成していたので自動生成されたコードに不備があったのかな・・・と思います。
trapemiyaさんありがとうございました。
素早い回答に感謝しています。
-
こんにちは。森田 知良です。
trapemiyaさん、有用な情報ありがとうございました。
ken18さん、その後いかがでしょうか?
trapemiyaさんの情報は、有用な情報と思われましたので、
勝手ながら回答済みチェックを付けさせていただきました。
回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
有効な回答があった場合は、なるべく回答済みボタンを押してチェックを付けてくださるようお願いします。ken18さんは、回答済みチェックを解除することもできますのでご確認ください。
また、4/9 午後 12:27 のken18さんの投稿が二重投稿になってしまっていたようでしたので、
勝手ながら削除させていただきました。
それでは、これからもフォーラムのご利用をよろしくお願いいたします。