- - PR -
Excelプロセス残で質問です。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-10 23:54
.NETのExcelで、プロセスが残る現象で悩んでいます。 この主題は、他インターネットで検索すれば、 多数ヒットするのですが、一つ確認したく ご存知の方がいれば、ご教示いただければと思っています。 確認したい事: Excel取り込みを、OleDB.OleConnectionや Adapterなどを使ってSQL(SELECT * FROM [SHEET%])文 を投げ、FillメゾットでDataSetに一括で取得しました。 (上記、メゾットなどのスペルは記憶で書いているため 多少のスペルミスはご了承下さい。。。。) Excelオブジェクトを使った場合、Excelオブジェクトを 解放しなければいけないのは知っているのですが、 上記のような、Adapterなどを使った場合も、 何かしら解放する必要があるのでしょうか? コネクションストリングに、Excelファイル名を指定している 以外は、Excelオブジェクトを使っていません。 ExcelからDataSetにExcelから取り込んでいる所を見ると 何かしらのExcelオブジェクトが生成されているのかと 思っています。。。 (Excelオブジェクトは隅々まで解放していない場所を 探しましたが。。。イベントのfinallyや、Excelをクローズする メゾットで全てを解放するようにしてあります。 ←もう少し調査要かもしれませんが。。。) 以上、宜しくお願いします。 | ||||||||
|
投稿日時: 2006-10-11 08:57
「ある」と仮定して、それは可能ですか? Adapter が Excel の存在を隠蔽している以上、解放するべきものがあったとしても、ユーザコードから「それ」に手が届かないのが通常ではありませんか? なので、一般的にはリソースの解放などは Adapter の責務と考えられるはずです。 もちろん、ユーザコードから見える範囲、つまり Adapter 関連のリソース(=接続など)の解放はユーザコードの責務になります。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2006-10-11 20:42
ひどりさん返信ありがとうございます。
結論から言うと、解決しました。。。(多分。。。) Adapterの責務と考えたのですが、 Excelオブジェクトを全て起動せず、 また、Adpter.Fill()もせず、Open(), Close()のみにしてみました。 それにも関わらず、Excelのプロセスが起動されたままになりました。 oleConnectionする直前で、ファイルを指定するために、 ファイルダイアログを使用して読み込むファイル名を取得しています。 このファイルダイアログをExcel読み込みクラスより上位の モジュールに置いた所、解決しました。 ボタンイベント関数() { string filename = ファイルダイアログ() ; // 上位に持ってきた。 ExcelClass(filename) ; } ExcelClass(string filename) { try { // m_xlApp などのExcelオブジェクトがあります。 // ################## // Excelプロセスが残っていた時、ここに // ファイルダイアログを取得していました。 // string filename = ファイルダイアログ() ; ################## OleDbConnection oleCon = new OleDb... ... oleCon.Open() ; Adapter.Fill() ; oleCon.Close() ; } finally { m_xlApp などExcelオブジェクトを解放。。。 } } 理解が不足しているため、なぜ、同じクラス内だと 駄目なのか不思議に思っている所です。。。。。 | ||||||||
|
投稿日時: 2006-10-12 08:46
対象のファイルが使用中というわけでもないでしょうから、不思議ですねぇ。 でも、不思議が残っているうちは何も「解決」してないですよ。 いつ来たいと異なる動作をしても不思議は無いってことですから。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2006-10-12 09:44
私は .NET を知らない。ADO.NET も知らない。Adapter も OleConnection も当然知らない。だけど口出ししてみます。間違ってたらすみません。
OleDB.OleConnection ということは、OLE DB Provider を使って Excel ファイルの読み取りをおこなっているのですよね? 実際に使用しているプロバイダは何ですか? プロバイダとして Microsoft Jet 3.51 OLE DB Provider や Microsoft Jet 4.0 OLE DB Provider を使用しているのであれば Excel(excel.exe) は不要です。Excel データの読み取りに excel.exe を使用しないのですから、Excel プロセスが残るどころか Excel プロセスが起動すること自体が解せません。それとも、Excel をラップして使用するような別のプロバイダがあって、それを使っているということでしょうか?
接続文字列に指定しているのはファイル名だけではないですよね? プロバイダも指定していると思いますが、それはなんでしょうか? [ メッセージ編集済み 編集者: 未記入 編集日時 2006-10-12 09:47 ] | ||||||||
|
投稿日時: 2006-10-12 12:46
なんのこっちゃ? 結局ExcelClassとやらでExcelオブジェクト扱って解放してるんですよね? 最初に書いている事と違うような。。。 ここの解放にミスってるとしか思えないのですが。 でもってやっぱりこれを貼ります↓ http://jeanne.wankuma.com/tips/programing/releasecom.html | ||||||||
|
投稿日時: 2006-10-12 13:09
というよりは、今回の要件では一切必要ないのですよね > Excel.* COM ラッパ関係 未記入 (ぬし) さんの仰るとおり、Excel のプロセスが起動させること自体がおかしいです。 別の処理で必要なものなのかもしれませんが、どちらにしても '疑うべきもの' を見誤っていると思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-10-12 20:37
みなさま、返信ありがとうございます。
本日、ソースの整理をしていて、 >なんのこっちゃ? っている書き方をしていたのに気付きました。 既存のExcel処理から、adapterを使った処理に変更 していました。既存のソースは残しつつ、adapterに 処理を切り替えて、動作を確認しました。 adapterの処理(10行?)を追加しただけなのに Excelプロセスが残ってしまう現象が発生しました。 解放していない、Excelオブジェクトがあるのかと 思い、コメント化していったのですが、 最後に残ったのが、追加したAdapterの処理でした。 最終的には、connectionのOpenとCloseだけとなったのですが なぜか、Excelプロセスが残るため、疑問に思ったため 書き込みした次第です。 ここでの、Excelオブジェクトの解放は問題とは 違うと思ったので、適当な文章になってしまいました。 (後々に書いた文章に蛇足でした。。。)。 予測ですが、OleDBによるExcelの接続と Excelオブジェクトを使用を同時になんらかの接続が あるかと思っています。 →後々で調べてみようかと思っています。 専用クラスに、Excelオブジェクトの型だけ宣言しておいて どうなるかなど。。。。 混乱させるような文章を掲載して済みませんでした。 多数の返信ありがとうございます。 |
1