PageLastUpdate:2014-04-09/today: - /yesterday: -
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 |
2014/01/10
DataRowCollectionがイマイチ使いにくいコレクションで、型変換をさぼれる関数を作ろうとしたときに、DataRow()やList(Of DataRow)と共有するにはIEnumerableまで遡らないといけない。
まあ遡ってたんですけど、どうしてもCountが使いたいケースでIEnumerableだと効率悪すぎ。
と、思って苦し紛れに引数をICollectionにしてList(Of DataRow)を突っ込んでみたら、きちんと動いて「?!?!?!」ってなった。
よく実装を見てみたら、ICollection<T>はICollectionを継承してないけど、IList<T>はICollectionを実装してる・・・。
他のジェネリック系コレクションもことごとく実装してるから、うん、まあこれでいいけど。
他の人が独自クラスでICollection<T>使ってなんか組んだときとか、はまりそうだからエラーメッセージきちんといれておくかなあ。
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されているのに気付いてどうにかなんないかと試行錯誤した結果。
2010/10/06
TableNameでRemoveしようとしているわけじゃないです。引数にDataTableを指定してもRemoveAtでIndexを指定してもエラー。
指定された名前 'example' と同じ名前が、名前空間が異なるコレクション オブジェクト内に少なくとも 2 つあります。
Microsoft馬鹿じゃないの。オブジェクトのインスタンスなんて名前で押さえてたらバグの元だから名前で管理なんてしない。
Tables.AddでチェックしないのにRemoveでエラーってどんなトラップ。
2013/12/17追記:今日.Net2005環境で再現コード書こうとしたらきちんとAddでもRenameでもエラーになったので、夢を見ていたか修正されたか、そのときの特殊条件があったかですね。
comment
このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
最終更新:2014年04月09日 13:11