Open棟梁 wiki [[戻る>FAQ]] *目次 [#ceca0ef7] #contents *パラメタライズド・クエリの初歩 [#ha6bb666] -Like検索は標準のパラメタライズド・クエリ、[[動的パラメタライズド・クエリ]]でサポートされています(パラメタにワイルドカードを含めたLikeの検索条件を渡す)。 -パラメタライズド・クエリのパラメタにnullを渡したい場合、DBNullを使用します([[動的パラメタライズド・クエリ]]では、nullは特殊な制御パラメタとして利用されます)。 *方法 [#a3da5b22] **パラメタライズド・クエリのバインド変数へのバインド方法は? [#mbcbdc8e] 名前バインドにのみ対応しています。このため、どのデータプロバイダであっても、順番バインドをサポートしません。 -ODP.NETのバインドは名前バインド固定になります。 -OLEDB、ODBC、HiRDBのデータプロバイダは~ 「?」パラメタの順番バインドにのみ対応しているためフレームワーク内部で名前バインド可能になる様に処理を加えています。~ なお、制限事項として、コメント中に パラメタ名と同じ文字列があると正しく動作しませんのでご注意ください。 **パラメタライズド・クエリのバインド変数への属性指定方法は? [#hbfb130e] -SetParameter()メソッドで型、サイズ、方向を指定可能です。 -後工程でのPG修正が難しい場合は、SQL定義ファイル中に型キャストを明示すること型指定可能です。 -自動生成DaoのI/Fでは、パラメタへの属性指定ができないので、自動生成Daoのテンプレート(DaoTemplate)のSetParametersFromHtメソッドをカスタマイズすることで、ユーザコードからパラメタへの属性指定がになります。 --例えばユーザコードから自動生成Daoのプロパティ・プロシージャに以下のクラスを設定する。 public class GenDaoParam { public object Value; public object DbType; public int Size; public ParameterDirection Direction; } --そもそも、自動生成ツールで型情報も取得しているので、型込みの生成に対応する~ という話もありますが、実装も複雑になるので、現時点では対応を見送っています。 **ストアド プロシジャ、無名PL/SQLブロックの実行や、戻り値の取得などは可能か? [#c390162a] ストアド プロシジャでも[[動的パラメタライズド・クエリ]]機能を使用できます。 **デッドロック、ロックタイムアウト、「ユニークキーの重複」などの例外をリトライしたい。 [#k470cfdf] B層[[ベースクラス2]]の例外処理をカスタマイズして、 リトライ対象例外を業務例外に振り替え、P層に正常系の戻り値が戻るようにします。 **SetUserParameter()メソッドの利用ポリシーをどのように考えるべきか? [#qe5e248d] -SetUserParameter()メソッドは、SQLインジェクションの可能性があるものの、DB部品の(僅かな)制約 / 制限などを解決するAPIでもあります。 -このため、SetUserParameter()メソッドの利用を制限せず、D層の[[ベースクラス2]]に実装するSQLトレースをカスタマイズして~ SQLインジェクションの可能性があるSQLをチェック & Warningログを出力するなどの対応をした方がプロジェクトとしては、スムーズに開発を遂行できると考えます。 **[[D層自動生成ツール]]で楽観排他を、どのように実装するのか? [#e520ecee] -[[D層自動生成ツール]]でのDao生成時にタイムスタンプ列名を設定し、~ タイムスタンプ必須オプションONにして生成することで楽観排他を実現できます。 -自動生成のDaoクラスを利用しないケースに関しては別途排他に関する実装が必要となりますので、~ 更新系は自動生成DAOを必ず利用するような運用とすることをお勧めします。 *性能 [#v72fa9e1] **コマンド タイムアウト値を設定するにはどうすれば良いか? [#r0e2db77] 共通のコマンド タイムアウト値をconfigファイルに設定できます。 **ODP.NET、HiRDBの配列バインドをサポートしているか? [#db704ba5] -サポートしています。 -また、配列バインドをサポートしていないデータプロバイダでの~ 大量データ処理実装のために、[[バッチクエリ作成支援機能]]を提供しています。 **SQLで暗黙の型変換が発生し、検索処理性能が大幅に劣化する。 [#d3619796] -SetParameter()メソッドで型、サイズ、方向を指定可能です。 -後工程でのPG修正が難しい場合は、SQL定義ファイル中に型キャストを明示すること型指定可能です。 **[[動的パラメタライズド・クエリ]]を記述するXMLファイルのサイズなどにより性能が劣化しないか? [#o6536f12] -1つのXMLファイル中に150タグ以上あると性能が劣化が始まりますので、不要なタグは記述しないようにお願いします(XMLファイル サイズについては、問題ないようです)。 -また、バッチ更新処理の場合は、ラウンド・トリップ軽減の観点も含め、配列バインド(ODP.NET、HiRDBでサポート)、[[バッチクエリ作成支援機能]]を併用下さい。 -なお、[[動的パラメタライズド・クエリ分析ツール]]を使用したテストのために記述する PARAMタグ、DIVタグなどXMLドキュメント オブジェクトの更新処理を伴わないタグについては、性能劣化の原因になりません。 *エラー [#g7fbf41d] **検索条件のIN句(副問合せ)を動的化したいがエラーとなる。 [#o4b7b07b] 検索条件のIN句(副問合せ)を動的化する場合、[[動的パラメタライズド・クエリ]]のIFタグ ではなく、タグのネストが可能なSUBタグを使用頂けます。 **[[動的パラメタライズド・クエリ]]でXMLが編集されずに、そのまま実行される。 [#g5a1aa8a] -DB部品の最も初めのチェック処理にXmlDocument.Load()メソッドを使用しているため、 --XMLフォーマットとして正しいものは[[動的パラメタライズド・クエリ]] --不正であるものは[[静的パラメタライズド・クエリ]] >として実行されるため、この現象は、不正なフォーマットのXMLを投げている事に起因します。 -XMLフォーマットの不正を確認するためには、 --[[動的パラメタライズド・クエリ分析ツール]]を使用するか、 --デバッグ時に、DB部品クラスのIsDPQプロパティ(動的SQLか静的SQLかを識別する)をチェックするか、 >して下さい。 **自動生成Daoの Update処理で「ORA-00972 "識別子が長すぎます"」が発生する。 [#fcffbeab] -[[D層自動生成ツール]]は、Update時に使用するパラメタ識別子に~ 1文字以上のプレフィックス・サフィックスを追加する必要があります。 -この際、パラメタ識別子が30文字を越えてしまい、エラーが発生するケースがあります。 -プレフィックス・サフィックスは、[[D層自動生成ツール]]のコンフィグで設定可能です。 -この再設定と、再生成が面倒な場合は、文字列一括置換ツールなどを使ってパラメタ識別子を~ 置換するなどして下さい(DaoとUpdate処理のSQL定義(XML)が置換対象ファイルになります)。 *サポート [#jeee821d] **Like句を使用した曖昧検索をサポートしているか? [#y8965987] -サポートしています。 -パラメタライズド・クエリ自体がLike句を使用した曖昧検索をサポートしているため文字列連結やSetUserParameter()メソッドを使用する必要はありません。 **LINQ to SQLやLINQ to Oracle、LINQ to Entities(ADO.NET Entity Framework)をサポートしているか? [#d17aa77f] -サポートしています。利用制限はしていません(機能提供は無し)。 -D層フレームワーク(静/[[動的パラメタライズド・クエリ]]機能、[[D層自動生成ツール]])の使用を推奨しています。 **任意のDLL(Assembly)からの埋込SQLのロードをサポートしているか? [#v3c9d7c9] -[[ベースクラス2]]のSetSqlByFile2メソッドを用いてExecutingAssemblyの埋込リソースから SQLをロードすることができますが、~ 任意のDLL(Assembly)から埋込リソースをロードを行う場合は、SetSqlByFile2メソッドのカスタマイズが必要になります。 -カスタマイズ方法は、SetSqlByFile2メソッドで、EmbeddedResourceLoader.LoadAsStringメソッドを使用して 直接、埋込SQLをロードし、this.SetSqlByCommandメソッドでSQLを設定するようにします。 -問題は、EmbeddedResourceLoader.LoadAsStringメソッドの引数であるassemblyStringと、loadfileNameに組み込む名前空間情報の情報をどのように渡すかになりますが、この部分はプロジェクト毎に検討ください。