- - PR -
多重接続時のアプリケーションエラー
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-10-29 13:05
いつも参考にさせていただいてます。
現在、ASP.NETからEXCEL出力するシステムを開発中です。 そこでどうしても分からないことがPC1台で行うとEXCELは問題なく出力される のですが2台のPCで同時にEXCELを出力しようとすると 1台はアプリケーションエラーで終了し、 もう1台は一応、EXCEL出力されるのですが 編集がめちゃくちゃになって出てきます。 ConnectionとExecuteReaderの場所をモジュールではなく、 ローカルで宣言したりといろいろやってみたのですが アプリケーションエラーはどうしても解消されません。 それに加えて "データリーダーが閉じている時に、無効な操作Readをしようとしました" または "行および列にデータが存在しません" と、同時接続のタイミングによってエラー内容も異なります。 アプリケーションエラーで指摘されるロジックもタイミングによって異なるようです。 EXCEL出力を複数のPCから同時に行うことは無理なのでしょうか? どなたかご存知の方がいらっしゃればご教授願います。 | ||||
|
投稿日時: 2003-10-29 17:39
ユーザ毎(というか接続毎かな?)にきちんと切り分けて動作できるような
つくりになってないんでしょうね。 モジュールを使わないようにするのは大前提として、Excelを利用している 部分もなんかあぶなそうですね。 まずはモジュールをまったく使わない形にしてみたらどうでしょう。 | ||||
|
投稿日時: 2003-10-30 15:17
小野@EACさん、返答ありがとうございました。
ご指摘どおり、モジュールを使わない形にしたところ アプリケーションエラーはなくなったのですが EXCELの編集がボロボロです。 EXCELを使う時の設定(createObjectなど・・。)すべてローカルでやっているのですが 2つのPCを同時起動でEXCEL出力すると 両方とも処理は正常に終了するのでが中身が ひどいです。。 小野@EACのスレッドを引用------------------------ Excelを利用している 部分もなんかあぶなそうですね。 ----------------------------------------------------- これはどういう意味でしょうか?EXCEL出力が行われるシステムでの 多重接続はキツイってことでしょうか? | ||||
|
投稿日時: 2003-10-30 17:16
Moduleブロックが「アプリケーション(この場合、ASP.NETのワーカプロセス)全体で共有される」ということを知らずにModuleブロックを使い、この中に頻繁に変更される値が入っていると、{ユーザ毎(というか接続毎かな?)にきちんと切り分けて動作できるようなつくりになってない}わけです。 同じように、同じ名前のファイルをロードし、編集し、同じ名前のファイルに出力するような作り方をしていると、変になります。 私のところでも別の人が担当しているのですが、ファイルはXLSファイルではなく、テンプレートファイルにしています。とりあえず、「同じ」フォーマットですが、「同じ」ファイルではなくなります。保存の方がまだ手をつけていないのですが、セッションIDの名前にして保存、すぐに開いてクライアントに送り返し、削除、かなぁ? | ||||
|
投稿日時: 2003-10-30 18:31
Excelファイルをどのように作っているか、というあたりで
結果的にひとつのファイルに複数から書き込むような プログラムになっているというのが一番考えられる状況ですね。 Jittaさんが書いているように、それぞれの接続毎に別のファイルに 書き出すような方法をどうにかして実現する必要があります。 私だったら。。。 システムの要件にもよりますが、サーバからはデータを渡して、 クライアント側でExcelファイルにするような形にするかな。 この場合もやり方はいくつかありますね。 #以前にもいろいろ議論されているはず。 | ||||
|
投稿日時: 2003-10-30 18:33
Jittaさん、返答ありがとうございました。
ユーザー毎に使うようなものはMODULEからすべて取り除きました。 それと、現在の状況を詳細に説明すると あるフォルダからEXCELファイルをコピーし、ログインユーザーごとのフォルダを生成し そのフォルダの中にコピーしたEXCELファイル貼り付けてその中身を編集するという感じです。 ですから編集するファイルはログインユーザーごとに異なります。 そして困ることに、2台のPCを起動し、ログインユーザーもそれぞれ別にして サーバーに存在するそれぞれ別々のXLSファイルをコピーして 編集処理を行った場合dでもぐちゃぐちゃになってしまいます。 やはりそれぞれの2つの処理が混在してるためにEXCELの編集がぐちゃぐちゃになっている ようです。 Jittaさんの書き込みを引用------------------------------------- セッションIDの名前にして保存、 すぐに開いてクライアントに送り返し、削除、かなぁ? ----------------------------------------------------------------- これのすぐに開いてクライアントに送り返し、削除ってどういう意味でしょうか? | ||||
|
投稿日時: 2003-10-31 09:39
今までDLL提供していたものをWebアプリで組み替え最中です。クライアントで行っていたので(それでも端末によってバージョンが違うので苦労しましたが)競合は考えなくて良かったのですが。。。 OLEオブジェクトがどのように参照されているか、というところにかかってくるのでしょうか。GetObjectで生きているExcelオブジェクトを捕まえている、なんてことはないですよね(^^;? 小野さんの<quote>サーバからはデータを渡して、 クライアント側でExcelファイルにする</quote>というのが間違いないのでしょうが、やはりバージョン違いによる…を考えると、ちょっとためらいが。 今のところ、Excelオブジェクトから Workbookのデータをデータストリームとして取り出すことができないと思っているので、いったん保存するしかないかな、と。保存すると、ファイル名が同じだと上書きされちゃうので、違う名称にするためにセッションIDを使おうかと。で、保存すると「消す」操作をしてやらないと、必ず違う名称で保存されるのでディスクを圧迫します。それで、データストリームとして読み出して、それをクライアントに送信したらすぐにファイルを消してやろうと。 | ||||
|
投稿日時: 2003-10-31 11:08
実験してみました。
Webアプリケーションで、ボタンをクリックするとエクセルに99×100のセルに"ColNumber:RowNumber"という文字列(のつもりが、エクセルに時間と判断されてしまう)を格納します。これを、セッションIDをファイル名にして保存します。 excel = CType(CreateObject("Excel.Application"), Excel.Application) book = excel.Workbooks.Add() sheet = book.ActiveSheet sheet.Range("A1").Value = SessionID For col = 2 To 100 For row = 1 To 100 sheet.Cells(row, col).value = CStr(col) & ":" & CStr(row) Next Next book.SaveAs(String.Format("C:\Windows\Temp\{0}.xls", SessionID)) えっと、私の方のプロジェクトでは、エクセルの処理はスレッドで回し、クライアントには応答を返しているので、ここでは省いていますが、この処理をスレッドで行っています。あと、宣言やオブジェクトの破棄も転記していません。 これを、同じPC(というか、サーバ)でIEを2枚開いて同時にアクセスしました。結果、両方のファイルとも、期待通りの値が正しく入っていました(「時間値」と判断されたのは期待通りではないが)。実行中、EXCELプロセスが2つできていることを確認したので、オブジェクトが正しく参照されているなら、複数のアクセスがあっ ても値が混合するなどの問題はないと判断します。 #ついでに、他のスレッドで問題になっている「C:\ディレクトリにショートカット」もできていないことを確認しました。 [ メッセージ編集済み 編集者: Jitta 編集日時 2003-10-31 11:11 ] |