[seasar-dotnet:1646] Re: 外だしSQLについて

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2010年 3月 31日 (水) 22:27:31 JST


藤井です。

プロバイダーを教えていただいてやっと現象を再現できました。
エンコードは関係ないですね。

この結果はS2DAO.NETを使わないで、素のADO.NETだけでも発生します。
ADO.NETでバインド変数のパラメーターオブジェクトを引数の数の
違いはあってもたいていは次のように行うと思います。

IDataParameter param1 =
      new OracleParameter("0", OracleType.VarChar, 3, "");

このOracleParameterは.Net Framework Data Provider for Oracle
パラメータクラスです。
2つめ以外の引数の値は、S2Dao.NETで生成される場合に合わせています。
このOracleType.VarCharをOracleType.NVarCharにすると、
ADO.NETでも笹木さんの仰る現象は再現できます。

このOracleType.NVarCharがどこから出て来たかというと
http://msdn.microsoft.com/ja-jp/library/yk72thhd(VS.80).aspx
です。
これを見ると、Data Provider for Oracleでは、DbType.Stringに
対応するOracleTypeはNVarCharです。
DbTypeとOracleTypeはリンクしています。なので、DbTypeが決まると
OracleTypeは自動的に決定されます。

笹木さんの例でのCoursePmbクラスのプロパティはみなstringなので
S2ADO.NETでは、DbTypeはStringと判断されます。
Data Provider for OracleではSeasar.Extension.ADO.Types.BaseValueTypeの
68行目の
parameter.DbType = dbType
をすると、自動的にパラメータオブジェクトのOracleTypeはNVarCharに
なります。
そのために笹木さんの仰る現象が発生します。

なお、ODP.NETでは、DbType.Stringに対応するのはOracleDbType.VarChar2
なので、現象は発生しません。

というわけで、とりあえず原因はわかりましたが、具体的な対応策はまだ
思いついておりません。

以上、報告いたします。


余談ですが、開発も大詰めを迎えていると言うことでなかなか難しいとは
思うのですが、Data Provider for Oracleを利用してパフォーマンスで問題には
ならなかったのでしょうか?

先日、私とは別のチームが納品したシステムが遅いと言われて急遽S2Dao.NETを
調査することになったのですが、Data Provider for OracleをODP.NETに
切り替えただけで、改善しました。
ベンチマークはとってませんが、10倍くらい違ったように思います。
クラサバの基幹系の案件だったため、違いがはっきりと出たかもしれません。



笹木 悠壱 さんは書きました:
> 笹木です。お世話になります。
> 
> 皆様、情報をご提供いただき、ありがとうございます。
> 検証を続けてみます。
> 
> それから、ご報告をいたします。
> 
> 久保様へ
> 使用しているデータプロバイダは、.Net Framework Data Provider for Oracle 
> です。
> DbTypeは、DbType.AnsiStringを指定しております。
> 
> 宮城様へ
> SQLファイル "全体" の文字コードを指定方法は、シフトJISでした。
> また、サンプルプログラム頂きました。ありがとうございます。
> 試してみます。
> 
> 以上、よろしくお願い申し上げます。
> 
> 笹木
> 



seasar-dotnet メーリングリストの案内