ぴゅーもんブログ

カナダ生まれの日本育ち白イルカ(ベルーガ)のぬいぐるみぴゅーもんのブログです、ハワイにもいったよ〜(不定期のんびり更新)

.NETコネタ DataSetの画面へのDataBind

データセット内のテーブルの画面へのバインドにおける特徴。
テーブル内に新規行を追加した場合、(RowState=Added)
グリッドへバインドした場合問題なく表示可能。画面上の通常コントロールの場合バインド時にエラーが発生します。このとき、フォームのデザイナにより設定されたデータソースのDefaultViewの表記をやめるとバインド可能だが、いままで、NULLデータが問題なくバインドできていたものが、エラーとなってしまうようになる。

 NG:
<%# DataBinder.Eval(画面貼付データセット, "Tables[テープル名].DefaultView.[0].CURRICULUM") %>
OK:(しかしNULLがNG)
<%# DataBinder.Eval(画面貼付データセット, "Tables[テープル名].[0].CURRICULUM") %>

どうも追加行(RowState=Added)あるといけないようです。そこで、「AcceptChanges」メソッドによって行を確定状態(RowState = .Unchanged)で
あると問題なくバインド可能なようです。たしかに、今までは、アダプタのFILLメソッドやUpdateメソッド発行後のバインドであったので問題がなかったようです。FillやUpdateメソッド実行後には自動的に、各行が確定状態になる仕様だそうです。

そこで、バインド前に、「AcceptChanges」メソッドによって強制的に確定してみたところ、バインドはOKなのですが、今度は、データベースへ登録するときに問題が発生です。アダプタは、各行のRowStateの状態によって適切なコマンドによりデータベースへアクセスしていますので、行を事前に確定させてしまうと、正しくINSERT文を発行してくれなくなります。

そこで解決策:
画面へのバインド用のデータセット格納変数へ実際にデータベースへのアクセスしているデータセットのコピーを渡してから、そのデータセットを確定状態へしました。

画面貼付データセット = 本体データセット.Copy
画面貼付データセット.AcceptChanges()