it技術:dotnet:datatableおよびdataviewの注意点
目次
DataTableおよびDataViewの注意点
1.DataViewのSortメソッドやDataTableのSelectメソッドがOracleのOrder By の結果と異なる
Oracleの標準ソートは、Nullが最大値として扱われるため、SQLで取得したデータを表示した場合と、DataView のSortメソッドや
DataTable の Selectメソッドでソートした結果を表示した場合とでは、ソートキーに NULL項目があった場合で結果が異なる。
ソートキーにNULL項目が含まれる場は、NULLを最大値に変換したのをソートキーとするなどの考慮が必要である。
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
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
it技術/dotnet/datatableおよびdataviewの注意点.txt · 最終更新: 2017/03/26 11:38 by yajuadmin