「VB.net Page2」の編集履歴(バックアップ)一覧はこちら
「VB.net Page2」(2014/04/09 (水) 13:11:25) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday)
#openclose(show=クリックすると見出し一覧を表示します){
#contents()
}
*&aname(MergeとLoadDataRowの違い){MergeとLoadDataRowの違い}
2014/04/09
TableA.Merge(TableB,PreserveChanges)としたとき
|RowVerision|TableA|TableB|True|False|h
|Original|1|3|3|3|
|Current|2|4|2|4|
PreserveChanges=FalseのときはOriginalとCurrentを更新する。
PreserveChanges=TrueのときはOriginalのみを更新する。
DataRowVersion.Currentだけを更新することはできない。
LoadDataRowは必ずDataRowVersion.OriginalとDataRowVersion.Currentの両方あるいは何れかを更新するか選べる。
*&aname(ICollection<T>はICollectionを継承していないのに、実体クラスはICollectionにキャストできることが多い){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>使ってなんか組んだときとか、はまりそうだからエラーメッセージきちんといれておくかなあ。
*&aname(DataTableのAutoIncrementをリセットするバッドノウハウ){DataTableのAutoIncrementをリセットするバッドノウハウ}
2014/01/08
あまり感心しない方法だけど、AutoIncrementStepを逆方向にしてNewRowを発行すると0に戻せる。
#highlight(vb.net){
table.Clear()
col.AutoIncrementStep = -1
col.AutoIncrementSeed = -1
table.NewRow() 'このDataRowは使わずに捨てる
col.AutoIncrementStep = 1
col.AutoIncrementSeed = 1}
行をクリアせずにリセットすることもできるので、AutoincrementをFalseにした後に再採番するとかも可能ですね。
重複させることもできてしまうので注意。リセットした後にAutoincrementSeedに発行したい番号をセットするとかいろいろ工夫が必要。
LoadDataRowで同一行を重ね読みしたときにAutoIncrement列をNothingにすると、書き換わらないけど内部カウンタはIncrementされているのに気付いてどうにかなんないかと試行錯誤した結果。
*&aname(データセット内に同一名を持つDataTableがあるとDataSet.Tables.Removeでエラー){データセット内に同一名を持つDataTableがあるとDataSet.Tables.Removeでエラー}
2010/10/06
TableNameでRemoveしようとしているわけじゃないです。引数にDataTableを指定してもRemoveAtでIndexを指定してもエラー。
>指定された名前 'example' と同じ名前が、名前空間が異なるコレクション オブジェクト内に少なくとも 2 つあります。
&strike(){Microsoft馬鹿じゃないの。オブジェクトのインスタンスなんて名前で押さえてたらバグの元だから名前で管理なんてしない。}
Tables.AddでチェックしないのにRemoveでエラーってどんなトラップ。
2013/12/17追記:今日.Net2005環境で再現コード書こうとしたらきちんとAddでもRenameでもエラーになったので、夢を見ていたか修正されたか、そのときの特殊条件があったかですね。
----
*comment
このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
#comment_num2
----
PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday)
#openclose(show=クリックすると見出し一覧を表示します){
#contents()
}
*&aname(MergeとLoadDataRowの違い){MergeとLoadDataRowの違い}
2014/04/09
TableA.Merge(TableB,PreserveChanges)としたとき
|RowVerision|TableA|TableB|True|False|h
|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|h
|Original|null|3|3|3|
|Current|null|4|4|4|
*&aname(ICollection<T>はICollectionを継承していないのに、実体クラスはICollectionにキャストできることが多い){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>使ってなんか組んだときとか、はまりそうだからエラーメッセージきちんといれておくかなあ。
*&aname(DataTableのAutoIncrementをリセットするバッドノウハウ){DataTableのAutoIncrementをリセットするバッドノウハウ}
2014/01/08
あまり感心しない方法だけど、AutoIncrementStepを逆方向にしてNewRowを発行すると0に戻せる。
#highlight(vb.net){
table.Clear()
col.AutoIncrementStep = -1
col.AutoIncrementSeed = -1
table.NewRow() 'このDataRowは使わずに捨てる
col.AutoIncrementStep = 1
col.AutoIncrementSeed = 1}
行をクリアせずにリセットすることもできるので、AutoincrementをFalseにした後に再採番するとかも可能ですね。
重複させることもできてしまうので注意。リセットした後にAutoincrementSeedに発行したい番号をセットするとかいろいろ工夫が必要。
LoadDataRowで同一行を重ね読みしたときにAutoIncrement列をNothingにすると、書き換わらないけど内部カウンタはIncrementされているのに気付いてどうにかなんないかと試行錯誤した結果。
*&aname(データセット内に同一名を持つDataTableがあるとDataSet.Tables.Removeでエラー){データセット内に同一名を持つDataTableがあるとDataSet.Tables.Removeでエラー}
2010/10/06
TableNameでRemoveしようとしているわけじゃないです。引数にDataTableを指定してもRemoveAtでIndexを指定してもエラー。
>指定された名前 'example' と同じ名前が、名前空間が異なるコレクション オブジェクト内に少なくとも 2 つあります。
&strike(){Microsoft馬鹿じゃないの。オブジェクトのインスタンスなんて名前で押さえてたらバグの元だから名前で管理なんてしない。}
Tables.AddでチェックしないのにRemoveでエラーってどんなトラップ。
2013/12/17追記:今日.Net2005環境で再現コード書こうとしたらきちんとAddでもRenameでもエラーになったので、夢を見ていたか修正されたか、そのときの特殊条件があったかですね。
----
*comment
このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
#comment_num2
----