C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法
ツリー表示
トピック表示
ランキング
記事検索
過去ログ
ログ内検索
キーワードを複数指定する場合は 半角スペース で区切ってください。
検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
[返信]をクリックすると返信ページへ移動します。
キーワード
/
検索条件
/
(AND)
(OR)
検索範囲
/
(現在のログ)
(全過去ログ)
(過去ログ1)
(過去ログ2)
(過去ログ3)
(過去ログ4)
(過去ログ5)
(過去ログ6)
(過去ログ7)
(過去ログ8)
(過去ログ9)
(過去ログ10)
(過去ログ11)
(過去ログ12)
(過去ログ13)
(過去ログ14)
(過去ログ15)
(過去ログ16)
(過去ログ17)
(過去ログ18)
(過去ログ19)
(過去ログ20)
(過去ログ21)
(過去ログ22)
(過去ログ23)
(過去ログ24)
(過去ログ25)
(過去ログ26)
(過去ログ27)
(過去ログ28)
(過去ログ29)
(過去ログ30)
(過去ログ31)
(過去ログ32)
(過去ログ33)
(過去ログ34)
(過去ログ35)
(過去ログ36)
(過去ログ37)
(過去ログ38)
(過去ログ39)
(過去ログ40)
(過去ログ41)
(過去ログ42)
(過去ログ43)
(過去ログ44)
(過去ログ45)
(過去ログ46)
(過去ログ47)
(過去ログ48)
(過去ログ49)
(過去ログ50)
(過去ログ51)
(過去ログ52)
(過去ログ53)
(過去ログ54)
(過去ログ55)
(過去ログ56)
(過去ログ57)
(過去ログ58)
(過去ログ59)
(過去ログ60)
(過去ログ61)
(過去ログ62)
(過去ログ63)
(過去ログ64)
(過去ログ65)
(過去ログ66)
(過去ログ67)
(過去ログ68)
(過去ログ69)
(過去ログ70)
(過去ログ71)
(過去ログ72)
(過去ログ73)
(過去ログ74)
(過去ログ75)
(過去ログ76)
(過去ログ77)
(過去ログ78)
(過去ログ79)
(過去ログ80)
(過去ログ81)
(過去ログ82)
(過去ログ83)
(過去ログ84)
(過去ログ85)
(過去ログ86)
(過去ログ87)
(過去ログ88)
(過去ログ89)
(過去ログ90)
(過去ログ91)
(過去ログ92)
(過去ログ93)
(過去ログ94)
(過去ログ95)
(過去ログ96)
(過去ログ97)
(過去ログ98)
(過去ログ99)
(過去ログ100)
(過去ログ101)
(過去ログ102)
(過去ログ103)
(過去ログ104)
(過去ログ105)
(過去ログ106)
(過去ログ107)
(過去ログ108)
(過去ログ109)
(過去ログ110)
(過去ログ111)
(過去ログ112)
(過去ログ113)
(過去ログ114)
(過去ログ115)
(過去ログ116)
(過去ログ117)
(過去ログ118)
(過去ログ119)
(過去ログ120)
(過去ログ121)
(過去ログ122)
(過去ログ123)
(過去ログ124)
(過去ログ125)
(過去ログ126)
(過去ログ127)
(過去ログ128)
(過去ログ129)
(過去ログ130)
(過去ログ131)
(過去ログ132)
(過去ログ133)
(過去ログ134)
(過去ログ135)
(過去ログ136)
(過去ログ137)
(過去ログ138)
(過去ログ139)
(過去ログ140)
(過去ログ141)
(過去ログ142)
(過去ログ143)
(過去ログ144)
(過去ログ145)
(過去ログ146)
(過去ログ147)
(過去ログ148)
(過去ログ149)
(過去ログ150)
(過去ログ151)
(過去ログ152)
(過去ログ153)
(過去ログ154)
(過去ログ155)
(過去ログ156)
(過去ログ157)
(過去ログ158)
(過去ログ159)
(過去ログ160)
(過去ログ161)
(過去ログ162)
(過去ログ163)
(過去ログ164)
(過去ログ165)
(過去ログ166)
(過去ログ167)
(過去ログ168)
(過去ログ169)
(過去ログ170)
(過去ログ171)
(過去ログ172)
(過去ログ173)
(過去ログ174)
(過去ログ175)
(過去ログ176)
(過去ログ177)
(過去ログ178)
(過去ログ179)
強調表示
/
ON
(自動リンクOFF)
結果表示件数
/
20件
30件
40件
50件
100件
記事No検索
/
ON
大文字と小文字を区別する
No.7492 の関連記事表示
ヒット / 7件
(1-7 を表示)
<<
0
>>
■7492
Re[3]: 文字列の構築
□投稿者/ επιστημη -
(2006/10/13(Fri) 15:09:09)
分類:[C#]
ベタ引用して[解決]? 失礼な奴っちゃなー
# 教えてもらったら「ありがとう」だぞ。幼稚園で教わんなかったか?
記事No.7486 のレス /0過去ログ7より /
関連記事表示
削除チェック/
■7492
大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -
(2007/09/06(Thu) 23:10:03)
分類:[.NET 全般]
初めての書き込みになります。皆様、よろしくお願いします。
開発環境:VisualStudio2005 開発言語:C#&ADO.NET OS:WinXP Pro
現在、FormにDataGridViewを貼り付け、DataSetをバインディングした簡易データベースのようなアプリを
作成しております。機能的にはフィールドの追加・削除等も出来るようになっており、この操作を行う際に
は、メインのFormにて、DataSetのコピーを作成後、フィールド操作用のダイアログにこのコピーを渡して、
そのダイアログにて、渡されたDataSetのコピーを操作して、DataColumnの登録・削除を行うというフロー
をとっています。なおDataSetのコピーは、DataSet.Copy()にて行っています。
※フィールド操作用ダイアログがOKで終了した場合、コピー作成されたDataSetをメインのDataSetとして更新
このフローを実行中に、問題が発生してしまいました。DataSetの持つレコードやフィールド数が多い場合、
DataSet.Copy()の実行に非常に時間がかかるのです。ちなみにレコード数:30000、フィールド数:128で計
測してみたのですが、50秒近くかかりました。アプリの仕様としてはレコード数の上限は60000、フィール
ド数の上限は256とする予定なのですが、これではお話にならないレベルです。
※DataSetの容量が大きくなると、DataGridViewの動作も非常に遅くなり、これにも困っているのですが・・・
他に方法はないものかと探してみたのですが、なかなか情報が得られませんでした。現状の状態ではアプリ
として使い物にならず、非常に困っております。回避方法又は高速化の方法をご存じの方がおられましたら、
些細な事でも助かりますので、ご教授頂けないでしょうか。
宜しくお願い致します。
親記事 /過去ログ19より /
関連記事表示
削除チェック/
■7493
Re[1]: 大量データを格納したDataSetのコピーについて
□投稿者/ れい -
(2007/09/06(Thu) 23:36:04)
■
No7492
(アリパパ さん) に返信
> このフローを実行中に、問題が発生してしまいました。DataSetの持つレコードやフィールド数が多い場合、
> DataSet.Copy()の実行に非常に時間がかかるのです。ちなみにレコード数:30000、フィールド数:128で計
> 測してみたのですが、50秒近くかかりました。アプリの仕様としてはレコード数の上限は60000、フィール
> ド数の上限は256とする予定なのですが、これではお話にならないレベルです。
> ※DataSetの容量が大きくなると、DataGridViewの動作も非常に遅くなり、これにも困っているのですが・・・
>
> 他に方法はないものかと探してみたのですが、なかなか情報が得られませんでした。現状の状態ではアプリ
> として使い物にならず、非常に困っております。回避方法又は高速化の方法をご存じの方がおられましたら、
> 些細な事でも助かりますので、ご教授頂けないでしょうか。
>
たくさんのレコード全てを同時に表示する必要は無いですよね?
そんなに画面は大きくないですし。
ですので、たくさんある場合は部分的に取得します。
そうすればDataSet.CopyもDataGridViewも早く動作できますから。
記事No.7492 のレス /過去ログ19より /
関連記事表示
削除チェック/
■7494
Re[2]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -
(2007/09/07(Fri) 00:45:35)
■
No7493
(れい さん) に返信
れい様、早速の回答、ありがとうございます。
> たくさんのレコード全てを同時に表示する必要は無いですよね?
> そんなに画面は大きくないですし。
>
> ですので、たくさんある場合は部分的に取得します。
> そうすればDataSet.CopyもDataGridViewも早く動作できますから。
なるほど、部分的に取得するという方法があるのですね。
現在はBindingNavigatorのDataSourceにDataSetをセットしているのですが、
例えばこの際に、DataSetの一部をセットするというイメージでしょうか?
なお気になるのはDataGridViewにてスクロールがされた場合は、どのように
対応するのかという点です。不勉強で申し訳ありません。
またDataSet.Copyの件ですが、フィールド操作画面にて、データ型の変更機
能があり、データ型が変更された場合は、データを変換する必要があるため、
メイン画面にて持つDataSetの全データをコピーしてフィールド操作画面に
渡す必要があり、この部分は部分的に対応出来ないのです。うーん。。。
記事No.7492 のレス /過去ログ19より /
関連記事表示
削除チェック/
■7495
Re[3]: 大量データを格納したDataSetのコピーについて
□投稿者/ れい -
(2007/09/07(Fri) 02:47:19)
■
No7494
(アリパパ さん) に返信
> ■
No7493
(れい さん) に返信
> なるほど、部分的に取得するという方法があるのですね。
> 現在はBindingNavigatorのDataSourceにDataSetをセットしているのですが、
> 例えばこの際に、DataSetの一部をセットするというイメージでしょうか?
> なお気になるのはDataGridViewにてスクロールがされた場合は、どのように
> 対応するのかという点です。不勉強で申し訳ありません。
レコード数10、フィールド数10とかなら、適当なコードで何も考えなくても動きますが、
「レコード数の上限は60000、フィールド数の上限は256とする予定」なのですよね?
1フィールド1byteを無駄なく保存したとしても、1x256x60000 byte = 15.36Mbyteです。
実際に必要とされるメモリは数倍〜数十倍になるでしょう。
これは現在のPCや.Netでは無造作に扱っていい量ではありません。
無駄な操作のないコードにする必要があります。
使わない情報をADO.Netから取るのは無駄です。
「見える分+少し」だけ取得するようにします。
スクロールされ、持って無いデータを取得する必要があるなら、
その分だけ追加で取得します。
これにはDataGridViewのVirtualModeを使うといいでしょう。
> またDataSet.Copyの件ですが、フィールド操作画面にて、データ型の変更機
> 能があり、データ型が変更された場合は、データを変換する必要があるため、
> メイン画面にて持つDataSetの全データをコピーしてフィールド操作画面に
> 渡す必要があり、この部分は部分的に対応出来ないのです。うーん。。。
いいえ。できるはずです。
フィールド操作画面に、DataSet取得元のTableの情報を渡しておけば、
データ型を変更する必要が出たときだけ、データを取得し、変更できます。
せっかくADO.Netを使っているのに、
一度に大量のデータを取得し、全データをオンメモリで操作する、
なんていうのは無駄で危険です。
それに、アリパパさんの言うような操作がすばやくできるなら、
そもそもデータベースなんて要らないことになってしまいます。
量を扱う部分はデータベースにまかせ、
コードでは表示や操作に専念するよう、
設計を見直したほうがいいです。
記事No.7492 のレス /過去ログ19より /
関連記事表示
削除チェック/
■7498
Re[4]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -
(2007/09/07(Fri) 10:16:25)
れい様、ご教授ありがとうございます。
> 使わない情報をADO.Netから取るのは無駄です。
> 「見える分+少し」だけ取得するようにします。
>
> スクロールされ、持って無いデータを取得する必要があるなら、
> その分だけ追加で取得します。
>
> これにはDataGridViewのVirtualModeを使うといいでしょう。
有難うございます。早速調べてみました。MSDNにVirtualModeの実装サンプルがありました。
なかなか難しそうですが、このサンプルを参考にトライしてみます。
> いいえ。できるはずです。
> フィールド操作画面に、DataSet取得元のTableの情報を渡しておけば、
> データ型を変更する必要が出たときだけ、データを取得し、変更できます。
>
> せっかくADO.Netを使っているのに、
> 一度に大量のデータを取得し、全データをオンメモリで操作する、
> なんていうのは無駄で危険です。
> それに、アリパパさんの言うような操作がすばやくできるなら、
> そもそもデータベースなんて要らないことになってしまいます。
>
> 量を扱う部分はデータベースにまかせ、
> コードでは表示や操作に専念するよう、
> 設計を見直したほうがいいです。
おっしゃる通りですね。
フィールド操作画面起動時は、Table情報のみを受け渡し、データ型変更が行われた際に、
メイン画面からデータを取得するイベントを設け対処したいと思います。
貴重なご指摘、感謝致します。
記事No.7492 のレス /過去ログ19より /
関連記事表示
削除チェック/
■7706
Re[5]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -
(2007/09/13(Thu) 13:18:24)
れい様、先日はご教授ありがとうございました。
その後、DataGridViewのVirtualモードの実装にトライしてみましたら、
何とか動くレベルになりました。やはり大量レコード扱い時のパフォーマンスは格段
に進歩しました。
ただこの実装に伴い、問題が出てしまいました。
以前はDataSetをBindingNavigatorにセットし、BindingNavigatorのBindingSourceを
DataGridViewのDataSourceとしてセットしておりました。そのため、BindingNavigator
とDataGridViewのカレントの動きは同期が取れていました。
Virtualモード実装後は、DataGridViewのDataSourceには何もセットしておりません。
その為、BindingNavigatorでのカレントレコード移動リクエストがあった際に、Data
GridViewのカレントセルを移動する必要があるのですが、bindingNavigatorPositionItem_TextChanged
関数にて、DataGridViewのカレントセルを移動させようとすると、「SetCurrentCellAddressCore
関数への再入呼び出しを生じるため、この操作は有効ではありません。」という例外
が発生してしまい、回避方法が不明です。
何か回避方法はありませんでしょうか。
ご教授頂けますと幸いです。宜しくお願い致します。
記事No.7492 のレス /過去ログ19より /
関連記事表示
削除チェック/
<<
0
>>
パスワード/
-
Child Tree
-