- PR -

型付きデータセットクラスについて

1
投稿者投稿内容
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-04-08 12:20
いつもお世話になっております。
今回、色々ご意見を伺いたく投稿しました。
ちょっと長くなりますがご容赦ください。

VisualStudio2003 の機能として、型付きデータセットクラスの作成があります。
ソリューションエクスプローラから新らしい項目の追加⇒データセット でクラスファイルを追加し、
サーバーエクスプローラから作成したいテーブルをドラック&ドロップすると、テーブル定義を読み込み、*.vb ファイルが自動コーディングされます。

このクラスにはデータセット内のデータテーブルの各カラムのデータにアクセスするプロパティも用意されます。
その自動コーディングされる内容についてですが、テーブルの属性がNotNullの場合は
さほど問題ではないのですが、Null OK の場合次のようにコーディングされてしまいます。

コード:
Public Property Hogehoge as String
  Get 
     Try
         Return CType(Me(Me.TableXXX.HogehogeColumn),String)
     catch e as InvalidCastException
         Throw New StrongTypingException("値は DBNull であるため、取得できません",e)
     End Try
  End Get
  Set
     'Set側の処理
  End Set
End Property



つまり、DB の値がNull の時は例外を発生させています。

で、今、この型付きデータセットクラスを直接 DataGrid にバインドしています。
そうすると、Null の値があるレコードで上記例外が発生してしまいます。

型付きデータセットクラスは直接バインドするべきではないのでしょうか?

自動コーディングされたソースを修正してもいいのですが、そうするとテーブル構成が変更になったとき、
同じように手修正をしなければなりません。今後担当が変わらなければそれもOKかもしれませんが、
個人のノウハウに依存する作りは避けるべきなので、自動コーディングされた物に手は入れたくありません。

皆さんは、型付きデータセットクラスをこのような使い方されますか?
それと、なにか妙案がありましたらアドバイスをお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-08 21:59
 プロパティウインドウに、NullValueというのがあると思うけど?

 で、設定注意です。例えば、Date型にNillableをTrueに設定すると、変換ツールが落ちます。IntegerなどをNillableにしても、落ちます。が、NullValueを0とかに設定すると、通ります。しかし、(空白)とかにすると、落ちます。


 で、自動生成されるものについては、アダプターパターンを使います。
参考:VB.NETとC#でデザインパターン→VB.NET - Adapter(皮かぶせて再利用)
 ん〜、このページ、本がないと辛いかも。それと、生成されるクラスが多いこと、DataSetはDataTableを包含しているところ辺りが、苦しいか。

_________________
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-04-09 00:52
Jittaさんありがとうございます。

デザインパターンですか〜、確かに気合いを入れないと理解が難しいです。
(基礎からデザインパターンを勉強しないと、提示して頂いたHPだけだはついて行けない..............)

ちょっと色々試してみたのですが、
自動生成された Datasetクラスを継承したクラスを作成し、問題のプロパティの部分を何とかしようとしたのですが、
フォームのデザイナーで、Gridのデータソースに割り付けようとしても、設定ができないのです。
よくよく考えたら、フォームのデザイナーにデータセットを貼り付けるには、データセットクラスそのもの見ているのではなく、
自動生成する元ネタのXMLファイルの方を見ているからですよね。
回避策(ItemDataBound でゴリゴリ)は思いつきいたのですが、それは最後の手段としてキープして、もうちょっとあがいてみようと思っています。

>プロパティウインドウに、NullValueというのがあると思うけど?
試してみます。
ただ、DataGridのDataBindの時に Grid側に DBNullが渡ってきた場合に、Grid側で例外が発生しないようにするプロパティのような気がするんですが。
型付きデータセットクラスではGrid に渡す前に例外が起きてるので、ダメなような気もします。
何はともあれ、検証してみないことには先に進まないので、思いつくことはどしどしトライしてみます。


個人的には、この型付きデータセットクラスは非常に気に入っていますので、
注意するところさえ解ってしまえば、とても強力なアイテムだと思っています。
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-04-09 01:03
大変失礼致しました m(__)m

>プロパティウインドウに、NullValueというのがあると思うけど?

型付きデータセットのプロパティウインドゥにこのプロパティがあるのですね!
早速、月曜日試してみます。

光明が見えてきた
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-04-11 10:20
型付DatasetクラスのXSDファイルのプロパティウインドゥから設定してみました。
Decimal型は、Jittaさんの指摘のように、NullValueをドロップダウンから選ぶとエラーになりますが、String型はそのまま使えました.
↓のコードが自動生成されました。

コード:
        Public Property DecimalHoge As Decimal
            Get
                If Me.IsDecimalHogeNull Then
                    Return 0     '← NullValue で0を設定
                Else
                    Return CType(Me(Me.tableT_HOGE.DecimalHogeColumn),Decimal)
                End If
            End Get
            Set
                Me(Me.tableT_HOGE.DecimalHogeColumn) = value
            End Set
        End Property
        

        Public Property StringHoge As String
            Get
                If Me.IsStringHogeNull Then
                    Return String.Empty     '← NullValue でEmptyを選択
                Else
                    Return CType(Me(Me.tableT_HOGE.StringHogeColumn),String)
                End If
            End Get
            Set
                Me(Me.tableT_HOGE.StringHogeColumn) = value
            End Set
        End Property



ただ、日付型は何を設定してもエラーになりますね。
とても使い勝手がいいのですが、日付型だけ使えないというのは、とてもつらい。
とても良い機能なので残念です.........。
まぁ、それを把握した上で、使いこなせばいいですね。
(DBをString型にするとか → あんまり好きじゃないけどな〜)

どうもありがとうございました
1

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