C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 58 を表示中)
■33077 / )  Re[3]: 進行状況バー(何%完了)の表示
□投稿者/ 魔界の仮面弁士 (1009回)-(2009/02/20(Fri) 10:05:27)
2009/02/20(Fri) 10:41:03 編集(投稿者)

No33072 (ka さん) に返信
>>(1) 現在は、どのようにして取り込んでいますか?
> →項目チェックを行った後、項目によっては文字列を分類しマスタ検索した
>     のち複数のテーブルへ更新しています。 

ごめんなさい、聞き方が悪かったですね。
変換中の作業内容ではなく、変換手法を聞きたかったのです。

Excel → SQL Server 2000 といっても、その変換方法は多岐に渡りますよね。
複数行を一括処理する手法や、一行ずつ処理する手法。
データ加工を VB 側で行う手法や、SQL Server 側に担当させる手法など。

・SQL Server のデータ変換サービス (DTS) を用いている。
・Excel 参照用のリンク サーバーを作り、それを OPENQUERY にて参照し、SQL Server 側で加工して取り込んでいる。
・OPENROWSET もしくは OPENDATASOURCE を用いて Excel を参照し、SQL Server 側で加工して取り込んでいる。
・System.Data.SqlClient.SqlBulkCopy クラスを利用して、作業テーブルに一括して取り込んでいる。
・OleDbDataAdapter 経由で得た Excel データを DataTable 上で加工し、それを SqlDataAdapter にて反映させている。
・Excel のオートメーション機能を利用してデータを読み取り、それを VB 側で加工後、1行ずつ SqlCommand で更新している。
・その他

どのような方法を使うかによって、進捗表示のために使える手順も異なってくるかと思います。

現在の方法が、進捗表示機能を備えている、あるいは容易に実装可能ならば、さほど問題は無いでしょう。

しかし、もしも進捗表示に向かない手法が使われていたとして、しかも作業工程上、他の変換方法を
選択できないような場合には、進捗表示そのものを諦めなければならないかも知れません。
(その場合の選択肢としては、予想終了時間を経験則で見積もり、経過時間を表示することで代用するなど)

あるいは、変換方法を変更することで、進捗表示が不要になるほど高速に処理できる事もありえます。
その逆に進捗表示を付加したが故に、大幅な速度低下になってしまう可能性も無いとは言えません。
(たとえばオートメーション法などは、柔軟性が高い反面、変換効率としては最低の部類にあたるでしょう)

という事で、「現在はどのようにして変換しているのか」といった点を知るために、
先の『現在は、どのようにして取り込んでいますか?』という質問に至った次第です。


>>(2) 処理前に、データの総件数は事前に取得できますか?
>    →Excelをオープンした時になら可能です。
変換方法によって、「現在の処理行数」を得る方法は異なります。

たとえば、SqlBulkCopy を使うと、一定行数を取りこむごとに SqlRowsCopied イベントが発生し、
それを使って「現在の処理行数」を報告させる事ができます。
# SqlBulkCopy による CSV 変換例。
# http://www.vbstation.net/tips/sqlbulkcopy_zip.htm

あるいは、先述のように、BackgroundWorker を使って通知する方法もあるかと思います。

ただ、どの方法を使うにしても、全体の進捗率をパーセンテージで表示したいのであれば、
現在の処理行数が、全体の何割に相当するのかを調べるために、事前にデータの総件数を
得ておいた方が良いでしょうね。


> →すみません。初心者なもので、上記イベントとか分かりません。
流石に掲示板でゼロから教えるわけにもいかないので、まずは分かる範囲で調べてみてください。
提示したキーワードで MSDN ライブラリや ネット上を探せば、少なからず情報は得られるかと思います。

その上で、「〜という URL で情報を見つけたけれど、その中の〜という部分の意味がわからない」とか、
「〜というサンプルを見つけて試したけれど、〜というエラーになってしまった」など、
「〜という機能がある事がわかったが情報が足りないので、参考文献を教えて欲しい」など、
【具体的】な質問を投稿してみれば、何らかの回答が得られるかと思います。
返信 編集キー/


管理者用

- Child Tree -