やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

DataTableおよびDataViewの注意点

DataTableおよびDataViewの注意点を3点

1.DataViewのSortメソッドやDataTableのSelectメソッドがOracleのOrder By の結果と異なる
 Oracleの標準ソートは、Nullが最大値として扱われるため、SQLで取得したデータを表示した場合と、DataViewのSortメソッドやDataTableのSelectメソッドでソートした結果
 を表示した場合では、ソートキーにNULL項目があった場合で結果が異なる。

 ソートキーにNULL項目が含まれる場合は、NULLを最大値に変換したのをソートキー
 とするなどの考慮が必要である。

 DataViewのSortメソッドがOracleのOrder By の結果と異なる
 http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-6218.htm
 NULLを絶対最後にしたい場合
 http://blog.livedoor.jp/tsu129/archives/50197967.html


2.DefaultViewプロパティで取得できる DataView は常に同じインスタンスである
 Dim dvView As DataView
 dvView = dtTable.DefaultView

 DataTable の「DefaultView」プロパティで取得できる DataView は常に
 同じインスタンスを使用している。

 例として、dvView.RowFilterを指定して抽出し、別の箇所で全て抽出するためdvView.RowFilterを指定しなかった場合、以前のRowFilterが残ったままとなっているため、全件取得できない。
全件取得するなら、この例の場合RowFilterを再設定する必要がある。

 本来は、同じ DataTable から異なる DataView を生成する場合は、
 下記の方法を用いた方がいいようです。
 Dim dvView As DataView = new DataView()
 dvView.Table = dtTable

 http://blogs.wankuma.com/shannon/archive/2007/01/24/58385.aspx
 http://www.yel.m-net.ne.jp/~oss/Tips/ADO/Tips_02001.htm


3.追加してすぐに削除すると削除マークとはならずに本当に削除されてしまう

 DataTable型のデータを渡す先の処理で、RowState.Deleted を見て判断しているので<削除データを作るべく、追加した上で削除してみたがRowState.Deletedにならないため
 調査してみたところ、AcceptChanges()する必要があった。

 '削除行を追加
 dtResult.Merge(LdtDeleteMeisai)

 'DataRow の RowState が Added である場合、つまり行がテーブルに追加された直後の状態の場合に、
 'その行を Deleted としてマークしたときは、その行がテーブルから削除されます。
 '↓を実行することにより、Added→Unchangedとなる
 dtResult.AcceptChanges()

 '追加したのを削除することにより、RowState.Deletedとさせる
 dvView = dtResult.DefaultView
 dvView.RowFilter = "JUCHU_KEY = 'DEL'"
 For i As Integer = 0 To dvView.Count - 1
?  dvView.Delete(0)
 Next

 http://msdn.microsoft.com/library/ja/cpguide/html/cpconManipulatingDataInADONETDataTables.asp
 http://msdn.microsoft.com/library/ja/cpguide/html/cpconDeletingDataRowFromDataTable.asp

投稿日時 : 2007年11月18日 21:56

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント