なにやらかにやらメモ

VB.net Page2

PageLastUpdate: 2014-04-09 /today: - /yesterday: -

MergeとLoadDataRowの違い

2014/04/09
TableA.Merge(TableB,PreserveChanges)としたとき
RowVerision TableA TableB True False
Original 1 3 3 3
Current 2 4 2 4
PreserveChanges=FalseのときはOriginalとCurrentを更新する。
PreserveChanges=TrueのときはOriginalのみを更新する。
DataRowVersion.Currentだけを更新することはできない。

LoadDataRowは必ずDataRowVersion.OriginalとDataRowVersion.Currentの両方あるいは何れかを更新するか選べる。

TableAに存在しない行はPreserveChangesに関わらず、OriginalとCurrentが追加され、RowStateも変わらない。
RowVerision TableA TableB True False
Original null 3 3 3
Current null 4 4 4

ICollection<T>はICollectionを継承していないのに、実体クラスはICollectionにキャストできることが多い

2014/01/10
DataRowCollectionがイマイチ使いにくいコレクションで、型変換をさぼれる関数を作ろうとしたときに、DataRow()やList(Of DataRow)と共有するにはIEnumerableまで遡らないといけない。

まあ遡ってたんですけど、どうしてもCountが使いたいケースでIEnumerableだと効率悪すぎ。

と、思って苦し紛れに引数をICollectionにしてList(Of DataRow)を突っ込んでみたら、きちんと動いて「?!?!?!」ってなった。


よく実装を見てみたら、ICollection<T>はICollectionを継承してないけど、IList<T>はICollectionを実装してる・・・。
他のジェネリック系コレクションもことごとく実装してるから、うん、まあこれでいいけど。
他の人が独自クラスでICollection<T>使ってなんか組んだときとか、はまりそうだからエラーメッセージきちんといれておくかなあ。

DataTableのAutoIncrementをリセットするバッドノウハウ

2014/01/08
あまり感心しない方法だけど、AutoIncrementStepを逆方向にしてNewRowを発行すると0に戻せる。
table.Clear()
col.AutoIncrementStep = -1
col.AutoIncrementSeed = -1
table.NewRow() 'このDataRowは使わずに捨てる
col.AutoIncrementStep = 1
col.AutoIncrementSeed = 1
行をクリアせずにリセットすることもできるので、AutoincrementをFalseにした後に再採番するとかも可能ですね。
重複させることもできてしまうので注意。リセットした後にAutoincrementSeedに発行したい番号をセットするとかいろいろ工夫が必要。

LoadDataRowで同一行を重ね読みしたときにAutoIncrement列をNothingにすると、書き換わらないけど内部カウンタはIncrementされているのに気付いてどうにかなんないかと試行錯誤した結果。


データセット内に同一名を持つDataTableがあるとDataSet.Tables.Removeでエラー

2010/10/06
TableNameでRemoveしようとしているわけじゃないです。引数にDataTableを指定してもRemoveAtでIndexを指定してもエラー。
指定された名前 'example' と同じ名前が、名前空間が異なるコレクション オブジェクト内に少なくとも 2 つあります。
Microsoft馬鹿じゃないの。オブジェクトのインスタンスなんて名前で押さえてたらバグの元だから名前で管理なんてしない。
Tables.AddでチェックしないのにRemoveでエラーってどんなトラップ。
2013/12/17追記:今日.Net2005環境で再現コード書こうとしたらきちんとAddでもRenameでもエラーになったので、夢を見ていたか修正されたか、そのときの特殊条件があったかですね。

comment

このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
名前:
コメント:

すべてのコメントを見る


更新履歴

取得中です。