dポイントプレゼントキャンペーン実施中!

VB2008ExpressEdition,DBはAccess2003の環境にて小規模な業務アプリの開発を行っている者です。
VBを使用してまだ2週間足らずですので、初歩的な質問かもしれませんが、よろしくお願いします。

テーブルの内容を明細表示し、登録ボタンを押すとDB更新を
行うような簡単なマスタメンテナンス画面があるとします。

明細表示のため、フォーム上にDataGridViewを作成、
DataSouceプロパティを指定し、型付きDataSetをBindさせました。
AllowUserToAddRowsプロパティはTrueとし、DataGridView上への
新規行追加も可能としてあります。

このとき、プログラムを動作させ複数行新規追加を行うと、
2行目の行追加のタイミングで、
「データの登録時にエラーが発生しました。
列「〇〇」は一意であるように制約されています。
値〇は既に存在します。」
というエラーになってしまい、行追加が1行以上行えません。
新規行追加時、エラー対象とされている列はDefault値Nullと
なっており、その値Nullの行を複数作成する操作なので
キー重複でこのようなエラーとなっているかと思いますが、
自分としてはこのようなエラーを出さず、
画面上では明細を複数行新規追加を可能としたいのです。
(キー値は最終的に更新時にマスタから値を取得、採番してカラムにセットし登録する。
また、キー重複チェックも後でロジックを組んで行う。)

このエラーチェックを行わないようにする設定、
もしくは回避方法等ありますでしょうか?

A 回答 (2件)

こんにちは。



コード上で
Me.DataSet.テーブル名.PrimaryKey = Nothing
としても、
データセットデザイナで主キーを削除しても、
どちらでも出来ましたけど、どのようにやって出来なかったのですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
korin_さんにお教え頂いた
コードに
Me.DataSet.テーブル名.PrimaryKey = Nothing
という記述で出来ました!

私は
Me.DataSet.テーブル名.カラム名.Unique = Nothing
としており、
「テーブル〇〇の主キーであり、一意制約制限は削除できません」
とエラーとなってしまっていました。

明細を複数行新規追加することもできたので、
これで先へ進めそうです。
初歩的な質問ですが、ありがとうございました!

お礼日時:2009/04/02 19:01

こんばんは。


よく判りませんが、私自身も勉強になりますので書き込みます。
本当にNullであることが問題なのですか?

・「値○」の○はNullであることを示しているのでしょうか?
・例えば「列○○」がString型ということはないですか?つまり、
 実際には空文字が入っているわけではないのですか?
・「列○○」はキーではないが、一意制約がかかっている列で、
 かつNullを許容しているということですか?

メッセージからは型付データセットの当該項目にキー設定が
あるように思えてしまいます。
そうであればキーをロジックで保障するということなので、
キー設定をはずしてしまうのが簡単なのですが。

いかがでしょうか?

この回答への補足

ご回答ありがとうございます。
すいません、質問の表現がわかりにくかったです。
また情報も足りない点が多かったようなので、
補足させて頂きます。

>こんばんは。
>よく判りませんが、私自身も勉強になりますので書き込みます。
>本当にNullであることが問題なのですか?
>・「値○」の○はNullであることを示しているのでしょうか?

「値〇」はNullということです。ただ、エラーメッセージ上では
なぜか?「’」という表記で出力されています。
ちなみにこのロジックは私が実装したものではありません。
VB側で自動生成されたものだと思います。
これをかけないようにしたいのです。

>・例えば「列○○」がString型ということはないですか?つまり、
> 実際には空文字が入っているわけではないのですか?
「列〇〇」は担当者コードで、String型です。
DafaultValueプロパティを「<DBNull>」
(新規行作成時のデフォルト値Null)としており、
DataGridView上ではReadOnlyプロパティを設定し編集不可として
いるので、新規追加行に他の値(空文字も含む)が入ることは
こちらからセットしない限りありません。
そのため、行を追加するためにキー値が同じNullとなり、エラーに
ひっかかっているのですが・・・。

>・「列○○」はキーではないが、一意制約がかかっている列で、
> かつNullを許容しているということですか?
>メッセージからは型付データセットの当該項目にキー設定が
>あるように思えてしまいます。
>そうであればキーをロジックで保障するということなので、
>キー設定をはずしてしまうのが簡単なのですが。

「列〇〇」はキーです。Default設定では一意制約がかかっており、
Nullは許容していません。
ただ、Nullについてはコード上から以下のようにプロパティを設定し、
許可するようにしています。
(そうしないとNullを許容しないエラーロジックが勝手に走ってしまい、新規行の追加すら行えなかった。)

'NULL値を一時的に許可(FormLoadイベント)
Me.DataSet.テーブル名.カラム名.AllowDBNull = True

ple_maniaさんのおっしゃる通りキーをはずしてしまえば全て解決
なのですが、上記のNullのようにコード上からも、デザイナ上からも、
キーをはずすことはできませんでした。
(コード上で設定するとエラー、デザイナ上で設定すると
保存後に設定が復元されてしまう。)

キー設定されているためにこのようなエラーが出ているのですから
キーを外すか、エラーを出力させないようにすれば
私のやりたいことは達成できるのですが・・・。
もちろん他のやり方でもかまいません。
お知恵を拝借できませんでしょうか。

補足日時:2009/04/02 06:47
    • good
    • 0
この回答へのお礼

解決しました、ありがとうございました!

お礼日時:2009/04/02 19:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!