
VB2008ExpressEdition,DBはAccess2003の環境にて小規模な業務アプリの開発を行っている者です。
VBを使用してまだ2週間足らずですので、初歩的な質問かもしれませんが、よろしくお願いします。
テーブルの内容を明細表示し、登録ボタンを押すとDB更新を
行うような簡単なマスタメンテナンス画面があるとします。
明細表示のため、フォーム上にDataGridViewを作成、
DataSouceプロパティを指定し、型付きDataSetをBindさせました。
AllowUserToAddRowsプロパティはTrueとし、DataGridView上への
新規行追加も可能としてあります。
このとき、プログラムを動作させ複数行新規追加を行うと、
2行目の行追加のタイミングで、
「データの登録時にエラーが発生しました。
列「〇〇」は一意であるように制約されています。
値〇は既に存在します。」
というエラーになってしまい、行追加が1行以上行えません。
新規行追加時、エラー対象とされている列はDefault値Nullと
なっており、その値Nullの行を複数作成する操作なので
キー重複でこのようなエラーとなっているかと思いますが、
自分としてはこのようなエラーを出さず、
画面上では明細を複数行新規追加を可能としたいのです。
(キー値は最終的に更新時にマスタから値を取得、採番してカラムにセットし登録する。
また、キー重複チェックも後でロジックを組んで行う。)
このエラーチェックを行わないようにする設定、
もしくは回避方法等ありますでしょうか?
No.2ベストアンサー
- 回答日時:
こんにちは。
コード上で
Me.DataSet.テーブル名.PrimaryKey = Nothing
としても、
データセットデザイナで主キーを削除しても、
どちらでも出来ましたけど、どのようにやって出来なかったのですか?
ご回答ありがとうございます。
korin_さんにお教え頂いた
コードに
Me.DataSet.テーブル名.PrimaryKey = Nothing
という記述で出来ました!
私は
Me.DataSet.テーブル名.カラム名.Unique = Nothing
としており、
「テーブル〇〇の主キーであり、一意制約制限は削除できません」
とエラーとなってしまっていました。
明細を複数行新規追加することもできたので、
これで先へ進めそうです。
初歩的な質問ですが、ありがとうございました!
No.1
- 回答日時:
こんばんは。
よく判りませんが、私自身も勉強になりますので書き込みます。
本当に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のようにコード上からも、デザイナ上からも、
キーをはずすことはできませんでした。
(コード上で設定するとエラー、デザイナ上で設定すると
保存後に設定が復元されてしまう。)
キー設定されているためにこのようなエラーが出ているのですから
キーを外すか、エラーを出力させないようにすれば
私のやりたいことは達成できるのですが・・・。
もちろん他のやり方でもかまいません。
お知恵を拝借できませんでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数式は残し値をクリアするマク...
-
UserForm1.Showでエラーになり...
-
HTMLソースが表示のページのも...
-
ACCESS VBAのSplit()関数の使用...
-
mailstorehomeのエクスポートで...
-
objectタグを使用してEXCEL出力
-
ISNAとISERRORの使い方の違い
-
コンボボックスの特定項目だけ...
-
LaTeXのエラーについて(コンパ...
-
VBAのエラーについて
-
CSV出力時、件数によりエラーと...
-
スクリプト エンジンの例外が発...
-
MDBへレコード挿入中にエラーが...
-
教えて下さい
-
配列数式の解除
-
Libre office マクロ
-
マクロを組んで作業するのは実...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
【マクロ】【画像あり】4つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
On ErrorでエラーNoが0
-
VBA データ(特定値)のある最...
-
インポート時のエラー「データ...
-
マクロで"#N/A"のエラー行を削...
-
VBAのリストボックスで、横スク...
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
Filter関数を用いた結果、何も...
-
文字列内で括弧を使うには
-
【VB.NET】 パワポ操作を非表示で
-
レコード登録時に「演算子があ...
おすすめ情報