- PR -

Excelプロセス残で質問です。

1
投稿者投稿内容
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 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をクローズする
メゾットで全てを解放するようにしてあります。
←もう少し調査要かもしれませんが。。。)

以上、宜しくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-11 08:57
引用:

Excelオブジェクトを使った場合、Excelオブジェクトを
解放しなければいけないのは知っているのですが、
上記のような、Adapterなどを使った場合も、
何かしら解放する必要があるのでしょうか?



「ある」と仮定して、それは可能ですか?

Adapter が Excel の存在を隠蔽している以上、解放するべきものがあったとしても、ユーザコードから「それ」に手が届かないのが通常ではありませんか?
なので、一般的にはリソースの解放などは Adapter の責務と考えられるはずです。

もちろん、ユーザコードから見える範囲、つまり Adapter 関連のリソース(=接続など)の解放はユーザコードの責務になります。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 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オブジェクトを解放。。。
}
}

理解が不足しているため、なぜ、同じクラス内だと
駄目なのか不思議に思っている所です。。。。。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-12 08:46
引用:

理解が不足しているため、なぜ、同じクラス内だと
駄目なのか不思議に思っている所です。。。。。



対象のファイルが使用中というわけでもないでしょうから、不思議ですねぇ。

でも、不思議が残っているうちは何も「解決」してないですよ。
いつ来たいと異なる動作をしても不思議は無いってことですから。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 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 をラップして使用するような別のプロバイダがあって、それを使っているということでしょうか?

引用:
コネクションストリングに、Excelファイル名を指定している以外は、Excelオブジェクトを使っていません。


接続文字列に指定しているのはファイル名だけではないですよね? プロバイダも指定していると思いますが、それはなんでしょうか?

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-10-12 09:47 ]
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2006-10-12 12:46
引用:

さくさんの書き込み (2006-10-10 23:54) より:

コネクションストリングに、Excelファイル名を指定している
以外は、Excelオブジェクトを使っていません。




引用:

さくさんの書き込み (2006-10-11 20:42) より:
finally
{
m_xlApp などExcelオブジェクトを解放。。。
}



なんのこっちゃ? 結局ExcelClassとやらでExcelオブジェクト扱って解放してるんですよね? 最初に書いている事と違うような。。。
ここの解放にミスってるとしか思えないのですが。

でもってやっぱりこれを貼ります↓
http://jeanne.wankuma.com/tips/programing/releasecom.html
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-12 13:09
引用:

まるくさんの書き込み (2006-10-12 12:46) より:

なんのこっちゃ? 結局ExcelClassとやらでExcelオブジェクト扱って解放してるんですよね? 最初に書いている事と違うような。。。
ここの解放にミスってるとしか思えないのですが。


というよりは、今回の要件では一切必要ないのですよね > Excel.* COM ラッパ関係

未記入 (ぬし) さんの仰るとおり、Excel のプロセスが起動させること自体がおかしいです。
別の処理で必要なものなのかもしれませんが、どちらにしても '疑うべきもの' を見誤っていると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-10-12 20:37
みなさま、返信ありがとうございます。

本日、ソースの整理をしていて、
>なんのこっちゃ?
っている書き方をしていたのに気付きました。

既存のExcel処理から、adapterを使った処理に変更
していました。既存のソースは残しつつ、adapterに
処理を切り替えて、動作を確認しました。
adapterの処理(10行?)を追加しただけなのに
Excelプロセスが残ってしまう現象が発生しました。

解放していない、Excelオブジェクトがあるのかと
思い、コメント化していったのですが、
最後に残ったのが、追加したAdapterの処理でした。
最終的には、connectionのOpenとCloseだけとなったのですが
なぜか、Excelプロセスが残るため、疑問に思ったため
書き込みした次第です。

ここでの、Excelオブジェクトの解放は問題とは
違うと思ったので、適当な文章になってしまいました。
(後々に書いた文章に蛇足でした。。。)。

予測ですが、OleDBによるExcelの接続と
Excelオブジェクトを使用を同時になんらかの接続が
あるかと思っています。
→後々で調べてみようかと思っています。
専用クラスに、Excelオブジェクトの型だけ宣言しておいて
どうなるかなど。。。。

混乱させるような文章を掲載して済みませんでした。
多数の返信ありがとうございます。



1

スキルアップ/キャリアアップ(JOB@IT)