【質問内容】
サンプルで作成した出力プログラムでは、70列なのですが、4200行程度になると不正なエラーが指示画面に表示され出力が行われません。制限は、エクセルの仕様に基づいているとのことですが、何らかの制約があるのでしょうか。物理メモリは、1GBで、HDの空きは10GB以上あります。
【GrapeCity 回答内容】
レポートの構造や実装する処理の内容を変更することで、レポート作成
時のメモリ使用量を低減できる可能性がございます。
詳細につきましては、製品ヘルプの以下の内容をご参照ください。
ActiveReports for .NETユーザーガイド
- ActiveReports for .NETの概要
- クイックスタート
- ActiveReportsの最適化
- よくある質問
- その他
- メモリが大量に消費される場合の対応方法
なお、上記ヘルプで説明されているCacheToDiskプロパティは、.NET
Frameworkの分離ストレージ(IsolatedStorage)を使用します。この
ため、CacheToDiskプロパティをTrueに設定し、レポートを作成する
場合は、このアプリケーション自身が分離ストレージにアクセスできる
権限を有している必要があります。
分離ストレージにアクセスできる権限は、IsolatedStoragePermission
やIsolatedStorageFilePermission、オペレーティングシステムの権限、
ファイルに対するアクセス制御リストなどの条件に依存します。
MSDNライブラリの以下の内容をご参照ください。
[分離ストレージ作業の実行]
http://msdn2.microsoft.com/ja-jp/library/8dzkff1s(VS.80).aspx
Windows Server 2003のIIS 6.0の「NETWORK SERVICE」アカウントには、
分離ストレージにアクセスするための権限が与えられておりません。
そのため、CacheToDiskプロパティをTrueに設定した場合、レポートの
作成時にエラーが発生します。
IIS 6.0の「NETWORK SERVICE」アカウントでActiveReportsを使用する
場合には、CacheToDiskプロパティはデフォルトのFalseのままでご利用
くださいますようお願い申し上げます。
最初の処理でぬけるためには、OrElse が効率的で、速度も早かった
http://msdn2.microsoft.com/ja-jp/library/ea1sssb2.aspx
最初の式が真 (True) の場合、2 番目の式は評価されません
http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnetbasic/02_operators.html
SQLの速度改善についての参考資料。詳しくは記載したURLへアクセス。
要約すると…DataAdapterで自動生成されたSQL(更新系・追加・削除)を
そのまま使用すると、連続処理の場合は特に速度が低下する仕様とのことです。
DataAdapterを別の方法(ストアド等)に書き換えるのがベストですが、
書き換えが難しい場合、手で修正したSQLに変更する方法でも効果は
高いことが分りました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6851&forum=7
VB.NET- 更新処理時SQLServerタイムアウト
VB.NETにてSQLServer2000のテーブル更新プログラムを作成しています。
作成しているのは1000万件ほどの件数があるKYKINFOテーブルに対して、
別のテーブル(dbUtmp表)の値をJIGYOCD,KYKNOをキーとして更新するプログラムです。
と全項目が最初にSELECTした値と等しいかAND条件に入れているようなのです(--;
このテーブルが項目数が120個程度あるのですが、それらがすべてWHERE句に
入ってしまっています。
こういった仕様なのでしょうか。。。プライマリキーのみで更新できるようにする
よい手がありましたらご教授ください。
やはりできないんですね。とりあえずCommandBuilderで作成したSQL文の
WHERE句以降をロジックで置き換えることで対応しました。
これからはCommandBuilderはできるだけ使用しないようにします。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18290&forum=7&start=16
コマンドビルダはあまり使わないほうが無難でしょうか。
まじめに自分でSQL文を生成したほうが安全ですかね。
性能を考慮されるのでしたら、DataAdapterのUpdateメソッドで使用する
INSERT, UPDATE, DELETE用のSQL文をストアドプロシージャに自前で用意
すべきです。
http://www.microsoft.com/japan/msdn/thisweek/meikaiADONET/meikaiADONET1.aspx
SqlCommandBuilder クラスを利用すると、更新系のSQL 文が自動生成される。
Visual Studio .NET のデータアダプタ構成ウィザードにおいても同様の
SQL 文が生成される。ここで自動生成される SQL 文には、最初に Fill メソッドで
読み込んだ段階のすべての列の値が Where 句の条件として含まれる。これによって
楽観的 (オプティミスティック) 同時実行制御を機能的に実現している。
DataAdapterのFill() メソッドによって最初にDataSet 内にデータを格納した後に、
DB の元のデータがほかで更新された場合、読み込んだ段階の項目値を
Where 句に持つ Update 文や Delete 文の更新件数は 0 件となる。この状態は、
DataAdapter の Update() メソッドの実行時の DBConcurrencyException が発生する
ことで検出できる。したがって、ほかで更新された場合の対処はこの例外を
キャッチすることでハンドリング可能である。なお、この自動生成された更新系 SQL 文
をそのまま使用するかどうかは開発者の自由である。たとえば DBMS 側で
タイムスタンプ列やバージョン番号列を実装し (タイムスタンプの更新やバージョン番号
の更新はトリガとしてあらかじめ実装)、それを Where 句内で主キー列と共に
比較対象とするといった方法もある。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33506&forum=7&9
CommandBuilderはパフォーマンスを考えるにあまりオススメしません。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconUsingStoredProceduresWithCommand.asp
コマンドによるストアド プロシージャの使用
http://www.agtech.co.jp/html/v9manuals/adonet/adonet-09-2.html
CommandBuilder オブジェクトの使用
CommandBuilder オブジェクトは SQL ステートメントを生成するには便利だと
思われがちです。しかし、これを使用するとパフォーマンスに悪影響を及ぼす
恐れがあります。同時処理の制限が原因で、CommandBuilder オブジェクトは
効率のよいSQL ステートメントを生成することができません。
たとえば、次の SQL ステートメントは、Command Builder で作成されたものです。
エンドユーザーが作成した Update ステートメントと Delete ステートメントの方が、
Command Builder が生成するステートメントより効率がよい場合もよくあります。
もう 1 つの問題は、CommandBuilder オブジェクトの設計にあります。
CommandBuilder オブジェクトは常に DataAdapter オブジェクトと関連付けられ、
DataAdapter オブジェクトが生成する RowUpdating イベントと
RowUpdated イベントのリスナーとして CommandBuilder オブジェクト自体を
登録します。したがって、行を更新するたびに、この 2 つのイベントが処理
されなければなりません。
[製品 FAQ(よくある質問)サーチ]
http://www.grapecity.com/japan/Support/faq/
[バグレポートサーチ]
http://www.grapecity.com/japan/Support/bugreport/
[カタログ,トライアル版,アップデート]
http://www.grapecity.com/japan/download/
http://studiodragoonnet.main.jp/tech/modules/sections/index.php?op=listarticles&secid=5
・ 接続文字列上での接続プールの制御 (read: 343 times)
・ DataTableに既存のDataRowを設定する方法 (read: 634 times)
・ DataTableに配列を設定する方法 (read: 328 times)
・ InfoMessageイベントでSQLServerのPRINTコマンドメッセージをトラップする (read: 241 times)
・ サーバーエクスプローラ設定の保存先 (read: 116 times)
・ 序数値を使った高速アクセス (DataReader) (read: 172 times)
・ IDbConnetionインターフェイスを使ってデータプロバイダの違いを抽象化する (read: 137 times)
・ バッチクエリにおける複数の結果の取得 (DataReader) (read: 180 times)
・ DataReaderを閉じるまでは、出力パラメータの値は書き出されない (read: 200 times)
・ DataReaderで実行中のクエリのキャンセル (read: 137 times)
・ DataAdapterの自動接続について (read: 229 times)
・ CommanBehavior.CloseConnectionを使った後処理 (read: 145 times)
・ 準備済みクエリによるパフォーマンス改善 (read: 209 times)
・ ストアドプロシージャを呼び出す3つの方法 (read: 330 times)
・ DataSetとDBのマッピング制御 (MissingMappingAction) (read: 264 times)
・ DataSetとDBのマッピング制御 (MissingSchemaAction) (read: 158 times)
http://www.microsoft.com/japan/msdn/net/adonet/datasetenhance.aspx#datasetenhancem_topic2
パフォーマンスの生データ
ADO.NET 1.x の DataSet のパフォーマンスを巡っては開発者から懸念の声が上がっていましたが、特に大量のデータを含む DataSet については、その懸念は正当と言わざるを得ません。 大量のデータを含む DataSet の処理が低速になるケースは 2 つあります。
まず初めにパフォーマンスの低下を感じるのは、行数の多いDataSet (実際には DataTable) を読み込むときです。
DataTable 内の行数が増えると、その行数にほぼ比例して、新しい行の読み込み時間が長くなります。
また、大量のデータを含む DataSet のシリアル化やリモート処理を行う際にもパフォーマンスに影響が出ます。 DataSet に関しては、特にアプリケーション階層間の受け渡しの際にシリアル化の方法が自動認識される点が大きな特徴となっていますが、詳しく見てみると、このシリアル化は非常に冗長でメモリとネットワークの帯域幅を大量に消費することがわかります。 ADO.NET 2.0 では、このようなパフォーマンス上のボトルネックがどちらも解消されています。
新しいインデックス エンジン
DataTable のインデックス エンジンは ADO.NET 2.0 で完全に書き直され、大きなデータセットの処理能力が大幅に向上しています。 その結果、基本的な挿入、更新、削除が高速になり、Fill 操作や Merge 操作も高速になっています。
ベンチマークやパフォーマンス向上の定量化は常にアプリケーションに依存するため話は単純ではありませんが、この変更により、100 万行の DataTable の読み込みでは明らかに桁違いのパフォーマンス向上が見られます。
筆者の環境で ADO.NET 1.1 と Visual Studio 2003 を使ってこのコードを実行したところ、実行時間は約 30 分でした。 ADO.NET 2.0 と Visual Studio 2005 を使った場合、実行時間は約 40 ~ 50 秒になりました。
行の数を 50 万行にしたところ、バージョン 1.1 では約 45 秒かかったのに対し、バージョン 2.0 での所要時間は約 20 秒でした。 環境によって結果は異なりますが、要点は明らかだと思います。
http://laika.e-dog.to/index.php?itemid=766
VB.NETでExcelを出力する場合の最速方法。.NETユーザーであれば、かなりお手軽に扱えます。Excel単体、或いは、VB6.0やAccessあたりだときっとAPI関数を利用しないと同じようなことは再現できないと思います。とはいえ、ExcelのVBAで書くにしても、理屈は一緒ですので、時間を節約したい方はトライする価値は…
Windowsアプリ と Webアプリ では、ライセンス供与の方法が異なる。
Webアプリでは[Web.Configキー作成]で取得した XMLをコピーしリビルドすると良いとのこと。
ActiveReportsのヘルプへのリンク(ローカルPCへインストール済みの場合)
ms-help://dd.ActiveReports2.1041/ddARNET2/Userguide/artskLicensingApplications.html
PCでIIS、ASP.netが正常に動作しないという問題が発生した。DELLのDemension 5150C(2006/10頃購入)。何故メーカー側がそのような初期設定にしているのか分からない。Sony Vaio のサポートページから得た情報だが、同様の手順で設定を行ったところ、IIS、ASP.net、VS.netなどの再インストールは必要なく対応できることが分かった。
一般的な情報では、IIS、Frameworkの再設定、aspnet_regiis.exe /-u 又は /-i、regsrv32の実行等で解決されるようなのですが、メーカーのプレインストールPCでは、設定状態によりIISに限らず特殊な手順が必要になることもありますので、似たような現象が有りましたら、そのような視点でも調べてみて下さい。
【質問内容 概略】
WindowsXP Proに標準で付いているIISをセットアップしASP(Active Server Pages)スクリプトを実行しようとすると「HTTP 500 - 内部サーバー エラー」と表示されてエラーで実行することができません。一般的にWindowsXP ProをインストールすればASPは正常に動作するはず…
【SONY製品の場合の解決方法】
https://hotstreet.vaio.sony.co.jp/article/article.php?id=28542
http://pegalabo.net/archives/VB.NET/source/FormatDate.html
http://jeanne.wankuma.com/tips/datetime/addmonths.html
http://blog.goo.ne.jp/glass-_-onion/c/9ee59f5d243db910e17c7f89a8f67c33
日付のフォーマットを行うときは、String.Formatメソッドを使用します。
具体的にはString.Format("{0:yyyy/MM/dd}",日付)と記述します。
よく使う表記は以下の6つだと思います。
yyyy 年(西暦4桁)
MM 月
dd 日
HH 時(24時間制)
mm 分
ss 秒
注意点は大文字と小文字を区別することです。
yyyy/mm/ddと書いてしまうと月のところに分が入ってしまいます(正しくはyyyy/MM/dd)。
表示された日付を見て「2005/58/13」あれ???
みたいな事もよくあります。
こういったバグはコンパイル時にエラーが出ないので気をつけましょう。