- PR -

DataGridVewでデータバインディングしている時、主キー、ユニークの重複チェックについて

投稿者投稿内容
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-01 22:04
主キーは複合もあるので行でチェックするのがいいという前提で話します
チェック場所はいろんなイベントがあると思います。
・DataGridVewのRowValidatingイベント
・DataTableのRowChagingイベント
※DBに問い合わせは論外。
他にもあるかもしれんが・・・。あったら教えてください

入力された値をチェックと言うことでDataGridVewのRowValidatingでチェック
(ViewのことはViewでチェック)
他のクラスでチェックすると、調査時いろんなソースを追いかけないのと
入力チェックロジックは1つのイベント内にまとめたいためです。

まず、主キー重複、ユニークチェックメソッドはあるのか?
System.Data.UniqueConstraintクラスにCheckConstraintと言う
メソッドかイベントがあるのはわかったのですが
それはパブリックではない(MSDN)にも載ってないので使用できません。
リフレクションで取得できるかと思いましたが無理でした。

それで別の方法でチェックするにはどうしたらいいのかなと
思って質問しました。

今の考えではクラス内部で主キー、ユニークの値を配列で保持して
配列内をチェックしかないのかなと思ってますが・・・。
複合主キーの時はそれぞれの列の値を文字列連結して
1つの文字列として保持する。

DataTableで制約チェックを追加しておけば例外が発生するのですが
DataGridVewのDataErrorイベントに制御が移ります。
私はDataErrorイベントは最後の最後の手段と思っています。
DataErrorイベント自体、なんかどんな例外が起こるかわからないから
DataErrorイベントで開発者にまかせようというマイクロソフト側
の仕様のような気がしてなりません。

皆さんはどうやっていますか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-12-01 23:23
DBに問い合わせするのがもっともエレガントで単純だと思うのですが 
おまけに確実だし、DBに問い合わせなしだとキー重複エラー可能性があるのでは
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-02 15:40
http://pc11.2ch.net/test/read.cgi/tech/1162467959/451-453

もしかして同じ方でしょうか。

とりあえず DataTable.PrimaryKey プロパティDataRowCollection.Contains メソッド
を使えばいいんじゃないかな?と思います。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-02 17:22
ぽぴ王子さん回答ありがとうございます。

恥ずかしいですがずばり同じ人です…。(ばれてましたか…)

結構調べたつもりなんですけどDatarowCollectionのメソッドで大丈夫そうですね!!

まだ試していませんができそうです!!ありがとうございました!!
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-03 11:06
ぽぴ王子さん!!主キーチェックはできました!!

けど、ちょっと気になることがあって…。

これってユニーク制約は無理ですよね・・・。

う〜ん。困ったもんだ
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-03 11:17
引用:

キキーヌさんの書き込み (2007-12-03 11:06) より:

これってユニーク制約は無理ですよね・・・。


あーそうですね。主キー重複の部分だけ見ていたので、そこだけに
回答してしまいました。
ユニーク制約の場合(というか主キーでも使えるけど)は、DataTable
を元に DataView を作って、その DataView の RowFilter プロ
パティに条件をセットして Count プロパティで有無を判断する、な
んてことをよくやります。

DataView を作っておくのが面倒な場合は、DataTable.Select
メソッドを使ったりしますが、なんか遅そうな気がする(計ったわけで
はないので変わらないかもしれない)ので、こちらはよっぽどめんど
くせぇ〜って時でないと使わないです。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2007-12-03 23:19
ぽぴ王子さん。いや、ぽぴ王子様。
ありがとうございます。大変助かりました。

DataViewのRowFilterで対応できました。

「DataTableを元に DataView を作って」って気になったのですが

DataTable.DefaultViewプロパティでDataViewが取得できるみたいです〜
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-04 07:06
DataTable.DefaultView を使うと、たとえば DataTable を
DataGridView の DataSource として使っている場合など
元の DataTable の表示に影響を及ぼす場合があります。

DataTable を元に DataView を作るというのはこんな感じ
です(言語が書いていないのでC#で)。

コード:

DataView dv = new DataView(dt);
(dtはDataTable)


_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)