「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>FAQ]]

*目次 [#ceca0ef7]
#contents

*参考 [#c03f88d3]
-.NET用アプリケーション フレームワーク ”棟梁” 利用ガイド(ベターユース、FAQ編)~
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/7_User_Guide(BetterUse_and_FAQ).doc

--4章:「D層に関するトピック」も参考にして下さい。
--7章:「FAQ」> 7.3節:「D層フレームワーク」も参考にして下さい。

*パラメタライズド・クエリの初歩 [#ha6bb666]
-Like検索は標準のパラメタライズド・クエリ、[[動的パラメタライズド・クエリ]]でサポートされています(パラメタにワイルドカードを含めたLikeの検索条件を渡す)。
-パラメタライズド・クエリのパラメタにnullを渡したい場合、DBNullを使用します([[動的パラメタライズド・クエリ]]では、nullは特殊な制御パラメタとして利用されます)。

*方法 [#a3da5b22]
**パラメタライズド・クエリのバインド変数へのバインド方法は? [#mbcbdc8e]
名前バインドにのみ対応しています。このため、どのデータプロバイダであっても、順番バインドをサポートしません。
-ODP.NETのバインドは名前バインド固定になります。
-OLEDB、ODBC、HiRDBのデータプロバイダは~
「?」パラメタの順番バインドにのみ対応しているためフレームワーク内部で名前バインド可能になる様に処理を加えています。~
なお、制限事項として、コメント中に パラメタ名と同じ文字列があると正しく動作しませんのでご注意ください。

**パラメタライズド・クエリのバインド変数への属性指定方法は? [#hbfb130e]
-SetParameter()メソッドで型(、サイズ、方向)を指定可能です。 

-後工程でのPG修正が難しい場合は、SQL定義ファイル中に型キャストを明示すること型指定可能です。~
また、自動生成Daoは型指定するI/Fが無いため、必要に応じて型キャストを使用して対応下さい。

-自動生成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]
ストアド プロシジャでも[[動的パラメタライズド・クエリ]]機能を使用できます。

***ストアド プロシジャの実行方法 [#baebe4d6]
ストアド プロシジャは、利用ガイドに書かれている方法で実行できます。

-.NET用アプリケーション フレームワーク ”棟梁” 利用ガイド(ベターユース、FAQ編)~
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/7_User_Guide(BetterUse_and_FAQ).doc
--4.4 ストアド プロシージャの実行方法

***[[CmnDao>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Dao/CmnDao.cs]]経由でのストアド実行 [#wcf3155f]
現行の[[CmnDao>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Dao/CmnDao.cs]]では、

 SetSqlByCommand("sp_help", CommandType.StoredProcedure);

のようにStoredProcedureパラメタが指定できないのでストアド実行はできないと思います。

しかし、現行の[[CmnDao>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Dao/CmnDao.cs]]も、以下まで対応可能済みなので、~
ちょっとカスタマイズすればストアド実行できるようになると思います。

-DicParameterDirectionまで指定できます。
-[[CmnDao>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Dao/CmnDao.cs]]で戻り値を取得する場合、以下の実装でストアドの戻り値も取得できます。
 ((DamSqlSvr)cmndao.GetDam()).DamSqlCommand.Parameters["ret"].Value;

対応されたモジュールをpullrequestして貰えると、とても助かります。

**デッドロック、ロックタイムアウト、「ユニークキーの重複」などの例外をリトライしたい。 [#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ファイル サイズについては、問題ないようです)。 

-なお、[[動的パラメタライズド・クエリ分析ツール]]を使用したテストのために記述する PARAMタグ、DIVタグなどXMLドキュメント オブジェクトの更新処理を伴わないタグについては、性能劣化の原因になりません。

*エラー [#g7fbf41d]

**[[動的パラメタライズド・クエリ]]で、[<]、[>]などの文字が含まれると適切に実行されない。 [#f62b8d45]
XML内部で使用不可能な文字列は、[[HTMLエンコーディング>http://itpro.nikkeibp.co.jp/article/COLUMN/20070409/267808/]]が必要になります。

これらの文字列が含まれる場合は、[[下記の現象>#g5a1aa8a]]が発生します。

**[[動的パラメタライズド・クエリ]]で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)が置換対象ファイルになります)。

**検索条件のIN句(副問合せ)を動的化したいがエラーとなる。 [#o4b7b07b]
検索条件のIN句(副問合せ)を動的化する場合、[[動的パラメタライズド・クエリ]]のIFタグ ではなく、タグのネストが可能なSUBタグを使用頂けます。

*Daoの使い分け [#m93cb89e]

**更新系処理 [#ibb5dec2]
自動生成Dao

**単一テーブルからのSELECT [#v7b6eb62]
自動生成Dao

**複数テーブルなど複雑なSELECT [#w6260481]
共通Dao([[CmnDao>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Business/Dao/CmnDao.cs]]) 

**大量データ処理(バッチ更新処理) [#s95f01f8]
大量データ処理(バッチ更新処理)で
-[[オーバーヘッドのある動的SQL>#o6536f12]]を使用したり、
-1件1件のクエリを発行して多くのラウンドトリップを発生させると、

性能が出ません。

従って、大量データ処理(バッチ更新処理)の場合は、
-配列バインド(ODP.NET、HiRDBでサポート)
-[[バッチクエリ作成支援機能]]

を使用して下さい。

*制限事項 [#s54b0aae]
**[[動的パラメタライズド・クエリ]]のパラメタ名 [#o212ae41]
[[動的パラメタライズド・クエリ]]のパラメタで、XMLタグの編集処理に使用されるパラメタのパラメタ名は、~
同じ値を使用するパラメタでも、別々に(1つの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に組み込む名前空間情報の情報をどのように渡すかになりますが、この部分はプロジェクト毎に検討ください。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS