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

kubo [E-MAIL ADDRESS DELETED]
2010年 3月 29日 (月) 10:12:20 JST


久保(jflute)です。

宮城さん、情報提供ありがとうございます。

DbTypeの指定が直接の原因かどうか確認がまだですが、
他にエンコーディングを指定する箇所は見当たらないし、
別件でエンコーディングの問題が発生しているので、
DbTypeの指定がポイントなんじゃないかと仮定している段階です。

> "OleDbCommand" かつ DbType.String を使用しているときに
> 明示的に OleDbParameter の値を OleDbType.VarChar に設定しています。
> (確か、OleDb 経由で接続したときに問題が発生するDB Providerがあったので、入れた処理だったと思います)
> もし、OleDb 経由でDBに接続指定知るなら、この処理が影響しているかもしれません。

Oleのif文は、このためだったんですね。
ただ、"非 Unicode 文字の可変長ストリーム" ということで、
OleDbなら逆にうまくいきそうな気もしますね。
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbtype(VS.80).aspx

どちらのデータプロバイダで現象が発生しているのか、
情報頂ければと思います。>笹木さん
(メール見返しても見当たらなかったので...
どこかに書いてあります???)

ちなみに、藤井さんの環境では、ODPで再現しなかったようです。
(但し、11g ではなく 10g とのこと)


別件の問題のときのように、DbType.AnsiStringの指定で
うまくいくならまだ良いですが、データプロバイダ固有の
クラスを利用しないといけないとなると、S2Dao.NETとしては
かなりつらい問題になりますね。


#
# ちなみに、S2Dao.NET、ValueType属性が
# サポートされてない!?んですね。。。
#

2010/3/29 Ryo Miyagi <[E-MAIL ADDRESS DELETED]>:
> 宮城です。
>
> レスの内容を追い切れていないのと、問題の箇所を検証できていないので
> 分かる部分について回答いたします。
>
>>> そこで、再び確認させていただきたいのですが、外だしSQLのバインド部分の文字エンコードを
>>> 指定する設定はSeasar側にあるのでしょうか?
>>S2Dao.NETでは、Seasar.Extension.ADO.Types.BaseValueType
>>の BindValue() でバインド処理を行っているはずです。
>
> バインド処理の部分は、久保さんの回答の通りです。
> s2container.net のデフォルトでは、
> BaseValueType を継承した PrimitiveBaseType を継承した StringType クラスで
> バインドする型がstringの場合のバインド処理を行っています。
>
> 従って、StringType クラスを独自に実装して
> Seasar.Extension.ADO.Types.ValueTypes#RegisterValueType(typeof(String),
> new 独自実装したStringTypeクラス);
> メソッドをアプリケーションの起動時に呼び出せば、
> s2container.netのソースに修正を入れないで
> バインド処理を置き換えることが可能です。
>
> なお、Seasar.Extension.ADO.Types.BaseValueType クラスでは、
> "OleDbCommand" かつ DbType.String を使用しているときに
> 明示的に OleDbParameter の値を OleDbType.VarChar に設定しています。
> (確か、OleDb 経由で接続したときに問題が発生するDB Providerがあったので、入れた処理だったと思います)
> もし、OleDb 経由でDBに接続指定知るなら、この処理が影響しているかもしれません。
>
> また、この問題と直接関係ないと思いますが、
> SQLファイル "全体" の文字コードを指定することは可能です。
> http://s2dao.net.seasar.org/ja/dicon.html#encoding
>
>
> 補足: 独自実装したStringType クラスのサンプル
>   ※コンパイルを通していないので、エラーが出るかもしれません。
> public static int Main(string[] args) {
>    // アプリケーション起動時に、独自実装したStringType クラスを指定。
>    Seasar.Extension.ADO.Types.ValueTypes#RegisterValueType(
>        typeof(String),
>        new MyApp.ADO.Types.MyStringType()
>    );
> }
>
> namespace MyApp.ADO.Types
> {
>    public class MyStringType : IValueType
>    {
>        public virtual object GetValue(IDataReader reader, int index, Type type)
>        {
>            return GetValue(reader[index]);
>        }
>
>        public virtual object GetValue(IDataReader reader, string
> columnName, Type type)
>        {
>            return GetValue(reader[columnName]);
>        }
>
>        public virtual object GetValue(IDataReader reader, int index)
>        {
>            return GetValue(reader[index]);
>        }
>
>        public virtual object GetValue(IDataReader reader, string columnName)
>        {
>            return GetValue(reader[columnName]);
>        }
>
>        public virtual void BindValue(IDbCommand cmd, string
> columnName, object value)
>        {
>            BindValue(cmd, columnName, value, DbType.String);
>        }
>
>        public virtual BindValue(IDbCommand cmd, string columnName,
> object value, DbType dbType)
>        {
>            BindValue(cmd, columnName, value, dbType, ParameterDirection.Input);
>        }
>
>        public virtual void BindValue(
>            IDbCommand cmd,
>            string columnName,
>            object value,
>            DbType dbType,
>            ParameterDirection direction
>            )
>        {
>            IDbDataParameter parameter = cmd.CreateParameter();
>            parameter.ParameterName = columnName;
>
>            // TODO: ここで、バインドパラメータの処理を変更する
>            // 強制的にSJISに変更するなら、dbTypeは、DbType.Object にする?
>            // ODP.NET を使っているなら、DbType.String ではなく、ODP.NET固有の
> OdpNetParameter? を指定してみる
>            parameter.DbType = dbType;
>            if ("OleDbCommand".Equals(cmd.GetType().Name) && dbType ==
> DbType.String)
>            {
>                OleDbParameter oleDbParam = parameter as OleDbParameter;
>                oleDbParam.OleDbType = OleDbType.VarChar;
>            }
>            parameter.Value = GetBindValue(value);
>            parameter.Direction = direction;
>            cmd.Parameters.Add(parameter);
>        }
>
>        protected virtual object GetBindValue(object value)
>        {
>            if (value == null)
>            {
>                return DBNull.Value;
>            }
>            return value;
>        }
>
>        protected virtual object GetValue(object value)
>        {
>            if (value == DBNull.Value)
>            {
>                return null;
>            }
>            else if (value is string)
>            {
>                return value;
>            }
>            else
>            {
>                return value.ToString();
>            }
>        }
>    }
> }
>
> 以上。
>
>
> 2010年3月28日17:48 kubo <[E-MAIL ADDRESS DELETED]>:
>> 久保(jflute)です。
>>
>> かなりヤマカンなのですが、
>> http://ml.seasar.org/archives/seasar-dotnet/2010-February/001556.html
>> この辺の話が関連したりしないかなと。
>>
>> いずれにせよ、ADO.NET単体での
>> 再現プログラムがあった方が良いかと思います。
>> (それを使ってDbTypeの変更なども検証できるかと)
>>
>> 2010/3/28 kubo <[E-MAIL ADDRESS DELETED]>:
>>> 久保(jflute)です。
>>>
>>>> ですので、DBのエンコードを変える、NVARCHARに変更
>>>> することは、現状難しいです。また、ご提案いただいた、テーブルに「レベル」
>>>> を設ける方法も難しいです。
>>>> データプロバイダの変更は試してみる価値があると思いますが、
>>>> まだ検証しておりません。Oracleへの確認もまだ行っておりません。
>>>
>>> 大詰めということなので、個人的にはデータプロバイダの変更も
>>> 現実的ではないですね。原因を掴むという意味で試す価値は大いにありますが。
>>>
>>> 回避の手だてですが、やはり原因の場所を特定させるために、
>>>
>>>> S2Dao.NETという要因の関係性を明確にするために、
>>>> 外だしSQLの部分を「ADO.NET直接利用」で試して
>>>> みると良いです。
>>>
>>> まずは、これををやってみた方が良いかと思います。
>>> (もしやっていたら結果を教えて頂けばと)
>>> いきなりS2Dao.NETのどこを直すを考えるより、
>>> ADO.NET直接で再現させてから回避ポイントが探した方が、
>>> S2Dao.NETでの修正ポイントも明確になりやすいかと。
>>> (原因が全然検討違いだったら時間がもったいないし)
>>>
>>>> そこで、再び確認させていただきたいのですが、外だしSQLのバインド部分の文字エンコードを
>>>> 指定する設定はSeasar側にあるのでしょうか?
>>> S2Dao.NETでは、Seasar.Extension.ADO.Types.BaseValueType
>>> の BindValue() でバインド処理を行っているはずです。
>>>
>>> ちなみに、バインド処理でエンコードっていう概念が
>>> ちょっと思い当たらないのですが...
>>> http://msdn.microsoft.com/ja-jp/library/system.data.idbdataparameter_members.aspx
>>> IDbDataParameterのメンバにもエンコーディングを
>>> 指定するものは見当たらないですね...
>>> C#上の文字列(String型)はunicodeで扱われてるはずなので、
>>> Shift_JISに変換掛けるとなると、byte配列でADO.NETに渡すか、
>>> やはり、ADO.NETに対してエンコーディングを指定する
>>> ようなやり方にはなると思います。(あるとすれば)
>>> (ODPのクラスを直接利用すれば指定できたりするとか...!?!?)
>>>
>>> 2010/3/28 笹木 悠壱 <[E-MAIL ADDRESS DELETED]>:
>>>> 久保様
>>>>
>>>> 笹木です。お世話になります。
>>>> すいません、返信が遅くなりました。
>>>>
>>>> まず、この件ですが、非常にクリティカルな問題です。
>>>> 開発でSeasarを使わせて頂いるのですが、現在開発が大詰めを迎えているためです。
>>>> (もっと早くに気付くべきでした。)
>>>>
>>>> ですので、DBのエンコードを変える、NVARCHARに変更
>>>> することは、現状難しいです。また、ご提案いただいた、テーブルに「レベル」
>>>> を設ける方法も難しいです。
>>>> データプロバイダの変更は試してみる価値があると思いますが、
>>>> まだ検証しておりません。Oracleへの確認もまだ行っておりません。
>>>>
>>>> 希望ですが、Seasar側でこの現象を回避できればと思っております。
>>>> 今回、検証させていただき、原因となっているのは、バインド時に文字エンコードが
>>>> 変わってしまっていることだと想像できます。そこをSeasar側で何とか出来ないかと検証しております。
>>>> その後の検証で、外だしSQLのバインド部分をTO_CHARで囲むことで
>>>> 現象が回避でることがわかりました。下記の様なSQLです。
>>>>
>>>> SELECT *
>>>>  FROM M_LESSON
>>>> WHERE COURSE >= TO_CHAR(/*pmb.CourseFrom*/)
>>>>  AND COURSE <= TO_CHAR(/*pmb.CourseTo*/)
>>>>
>>>> また、SQLツールで、文字リテラル部分を、N'xxxxx'として、ユニコードに変換するようにSQLを
>>>> 記述すると、想定外の結果と同じレコード件数になることがわかりました。下記の様なSQLです。
>>>>
>>>> SELECT *
>>>>  FROM M_LESSON
>>>> WHERE COURSE >= N'T初級'
>>>>  AND COURSE <= N'T上級'
>>>>
>>>> そこで、再び確認させていただきたいのですが、外だしSQLのバインド部分の文字エンコードを
>>>> 指定する設定はSeasar側にあるのでしょうか?
>>>>
>>>> また、設定が無ければ、Seasarのオープンソースに手を加えたいと考えております。
>>>> バインド処理を行っている箇所を強制的にシフトJISにエンコードする旨の記述を加えます。
>>>> その箇所をお教えいただけないでしょうか?
>>>> (一度、ソースを拝見したのでが、それがどこなのかわかりませんでした。)
>>>>
>>>> そもそも、見当違いなことを申し上げていたら、何卒ご容赦下さい。
>>>>
>>>> 以上、宜しくお願い申し上げます。
>>>>
>>>> 笹木
>>>>
>>>> ----- Original Message ----- From: "kubo" <[E-MAIL ADDRESS DELETED]>
>>>> To: <[E-MAIL ADDRESS DELETED]>
>>>> Sent: Friday, March 19, 2010 10:10 AM
>>>> Subject: [seasar-dotnet:1614] Re:外だしSQLについて
>>>>
>>>>
>>>>> 久保(jflute)です。
>>>>>
>>>>> 検証ありがとうございます。
>>>>> さらにまとめると:
>>>>>
>>>>> .NET-3.5
>>>>> Oracle11g (on Windows2008)
>>>>> o NLS_CHARACTERSET=JA16SJISTILDE
>>>>> o NLS_NCHAR_CHARACTERSET=AL16UTF16
>>>>>
>>>>> 「漢字の大なり小なり検索が想定外となる」
>>>>> 外だしSQL + バインド変数 = x (HITしない)
>>>>> 外だしSQL + 埋め込み変数 = o
>>>>> SQL*Plus + バインド変数 = o
>>>>> SQL*Plus + 埋め込み変数 = o
>>>>>
>>>>> S2Dao.NETという要因の関係性を明確にするために、
>>>>> 外だしSQLの部分を「ADO.NET直接利用」で試して
>>>>> みると良いです。で、さらに結果が変わらなければ、
>>>>> データプロバイダを別のものに変えて試してみましょう。
>>>>> ODPとOLEで結果が同じかどうか!?
>>>>> (そもそも何をご利用ですか?)
>>>>> ここまでやるとかなり状況がクリアになるかと思います。
>>>>>
>>>>> その後は、ちょっとこの問題のクリティカル性次第なのですが、
>>>>> もし、業務的に困ってないけど気になって投稿してみた、
>>>>> というのであれば適当なところで検証を打ち切るのもアリですが、
>>>>> 重要な問題というのであれば、
>>>>>
>>>>> o NVARCHARを利用してみる
>>>>> o DBのエンコーディングをUTF-8にしてみる(ちょっと大変かな)
>>>>> などもできるならばやってみると良いかもしれません。
>>>>> (万が一、回避できる選択肢が見つかればと)
>>>>>
>>>>>
>>>>> 上記の検証結果次第では、ちょっと「コミッタだからわかる」
>>>>> というレベルを超えちゃっているので、Oracleのサポート、
>>>>> (もしくはデータプロバイダ)に問い合わせられるなら
>>>>> 問い合わせてみたほうが良いかもしれません。
>>>>> あと、Oracleの掲示板(OTNとか)を探して同じような現象が
>>>>> 報告されていないか、なければそちらで投稿して聞いてみる
>>>>> とかも良いかもしれません。
>>>>>
>>>>>
>>>>> #
>>>>> # 個人的には、漢字データに対して厳密な大なり小なりの
>>>>> # 意識が必要になることはほとんどなかったので、
>>>>> # この件に関する情報は何も持ってないです。
>>>>> # また、自分がDB設計するときにはそういう条件が
>>>>> # (極力)必要にならないようにします。
>>>>> # (基本的に文字列型で大なり小なり条件が発生しないように)
>>>>> #
>>>>> # 例えば、コースは、char(3)のコード(COURSE_CODEとか)
>>>>> # にして、FK制約でCOURSEマスタテーブルを参照して、
>>>>> # そちらのテーブルに「レベル」を表現するカラムを追加
>>>>> # して(数値など)、そのカラムで大なり小なり条件とするなど。
>>>>> # もし、そういった回避ができるのであれば、それも一つの
>>>>> # 選択肢かと思います(検証作業が大変だと思うので)。
>>>>> #
>>>>>
>>>>> 2010/3/19 笹木 悠壱 <[E-MAIL ADDRESS DELETED]>:
>>>>>>
>>>>>> 藤井様
>>>>>>
>>>>>> お世話になっております。笹木です。
>>>>>>
>>>>>> 先程、久保様にご報告させていただいた内容で
>>>>>> 何かお分かりになりましたら、幸いです。
>>>>>>
>>>>>> 以上、宜しくお願い申し上げます。
>>>>>>
>>>>>> 笹木
>>>>>>
>>>>>> ----- Original Message ----- From: "Hiroaki Fujii"
>>>>>> <[E-MAIL ADDRESS DELETED]>
>>>>>> To: <[E-MAIL ADDRESS DELETED]>
>>>>>> Sent: Thursday, March 18, 2010 10:37 PM
>>>>>> Subject: [seasar-dotnet:1610] Re: 外だしSQLについて
>>>>>>
>>>>>>
>>>>>>> 藤井です。
>>>>>>>
>>>>>>> 改めて、Oracle11g、S2Container.NET1.3.17で確認いたしました。
>>>>>>> テーブルを再度作り直してSQLPlusで実行すると、きちんと2件と
>>>>>>> ヒットしました。
>>>>>>> あれ、Oracle10gから11gになって挙動が変わった?何か間違えたかな?
>>>>>>>
>>>>>>> その上で、メールの通りコードも記述し、外だしSQL文も同じように
>>>>>>> 作ってみましたが、きちんとS2DAO.NETは2件、帰ってきました。
>>>>>>> メールのコピペで作ったわけではありませんが、何が影響してうまく
>>>>>>> 帰ってこないのか、わからない状況です。
>>>>>>>
>>>>>>> さらに、何か情報を提供いただけたら、何かわかるかもしれません。
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 笹木 悠壱 さんは書きました:
>>>>>>>>
>>>>>>>> 藤井様
>>>>>>>>
>>>>>>>> お世話になっております。笹木です。
>>>>>>>>
>>>>>>>> ご確認いただき、ありがとうございます。
>>>>>>>> ご指摘いただいた点を踏まえて、再度検証してみました。
>>>>>>>>
>>>>>>>> まず、S2Dao.NET用のインターフェイスの書き方に誤りはございませんでした。
>>>>>>>> また、インターフェイスとテーブルについて、2バイト文字、漢字等を使用せずに
>>>>>>>> 実行してみましたが、結果は同じでした。
>>>>>>>> (結果は下記の通りです。)
>>>>>>>>
>>>>>>>> それから、SQL文自体はこれで通ります。
>>>>>>>> WHERE句の中のANDをORに変えて実行した場合、sqlplusで3件帰ってきてしまいま
>>>>>>>> す。
>>>>>>>> (結果は下記の通りです。)
>>>>>>>>
>>>>>>>>
>>>>>>>> ■テーブル
>>>>>>>> ・テーブル名
>>>>>>>> M_LESSON
>>>>>>>> ・フィールド
>>>>>>>> TENPO  NUMBER(3,0) (PK)
>>>>>>>> DATE VARCHAR2(8) (PK)
>>>>>>>> START  VARCHAR2(4) (PK)
>>>>>>>> END   VARCHAR2(4)
>>>>>>>> COURSE VARCHAR2(6)
>>>>>>>>
>>>>>>>> ■上記テーブル内のレコード
>>>>>>>> 1,"20100301","1000","1100","T初級"
>>>>>>>> 1,"20100301","1100","1200","T中級"
>>>>>>>> 1,"20100301","1200","1300","T上級"
>>>>>>>>
>>>>>>>> ■実行①(外だしSQLでパラメータコメントを使用)
>>>>>>>>
>>>>>>>> SELECT *
>>>>>>>> FROM M_LESSON
>>>>>>>> WHERE COURSE >= /*pmb.CourseFrom*/
>>>>>>>> AND COURSE <= /*pmb.CourseTo*/
>>>>>>>>
>>>>>>>> パラメータ値
>>>>>>>> pmb.CourseFrom→'T初級'
>>>>>>>> pmb.CourseTo→'T上級'
>>>>>>>>
>>>>>>>> ⇒検索結果は、レコードなしとなります。
>>>>>>>>
>>>>>>>> (SQLログ)
>>>>>>>> Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 10:04:40,480
>>>>>>>> [1] DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
>>>>>>>> FROM M_LESSON
>>>>>>>> WHERE COURSE >= 'T初級'
>>>>>>>> AND COURSE <= 'T上級'
>>>>>>>>
>>>>>>>> ■実行②(外だしSQLでパラメータコメントを使用をしない)
>>>>>>>>
>>>>>>>> SELECT *
>>>>>>>> FROM M_LESSON
>>>>>>>> WHERE COURSE >= 'T初級'
>>>>>>>> AND COURSE <= 'T上級'
>>>>>>>>
>>>>>>>> ⇒検索結果は、レコード2件となります。
>>>>>>>> 1,"20100301","1000","1100","T初級"
>>>>>>>> 1,"20100301","1200","1300","T上級"
>>>>>>>>
>>>>>>>> ■Daoインターフェイス
>>>>>>>>
>>>>>>>> [Bean(typeof(CourseInfo))]
>>>>>>>> public interface ICourseDao
>>>>>>>> {
>>>>>>>> IList<CourseInfo> SelectCourse(CoursePmb pmb);
>>>>>>>> }
>>>>>>>>
>>>>>>>> [System.Serializable]
>>>>>>>> public class CourseInfo
>>>>>>>> {
>>>>>>>> string _Course;
>>>>>>>>
>>>>>>>> public string Course
>>>>>>>> {
>>>>>>>> get { return _Course; }
>>>>>>>> set { _Course = value; }
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> [System.Serializable]
>>>>>>>> public class CoursePmb
>>>>>>>> {
>>>>>>>> string _CourseFrom;
>>>>>>>>
>>>>>>>> public string CourseFrom
>>>>>>>> {
>>>>>>>> get { return _CourseFrom; }
>>>>>>>> set { _CourseFrom = value; }
>>>>>>>> }
>>>>>>>>
>>>>>>>> string _CourseTo;
>>>>>>>>
>>>>>>>> public string CourseTo
>>>>>>>> {
>>>>>>>> get { return _CourseTo; }
>>>>>>>> set { _CourseTo = value; }
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> ■sqlplusでの実行結果
>>>>>>>> SQL> select * from M_LESSON where COURSE >= 'T初級' and COURSE <= 'T上級';
>>>>>>>>
>>>>>>>> TENPO DATE STAR END COURSE
>>>>>>>> ---------- -------- ---- ---- ------
>>>>>>>> 1 20100301 1000 1100 T初級
>>>>>>>> 1 20100301 1200 1300 T上級
>>>>>>>>
>>>>>>>> SQL> select * from M_LESSON where COURSE >= 'T初級' or COURSE <= 'T上級';
>>>>>>>>
>>>>>>>> TENPO DATE STAR END COURSE
>>>>>>>> ---------- -------- ---- ---- ------
>>>>>>>> 1 20100301 1000 1100 T初級
>>>>>>>> 1 20100301 1100 1200 T中級
>>>>>>>> 1 20100301 1200 1300 T上級
>>>>>>>>
>>>>>>>> 以上、宜しくお願い申し上げます。
>>>>>>>>
>>>>>>>> 笹木
>>>>>>>>
>>>>>>>> ----- Original Message ----- From: "Hiroaki Fujii"
>>>>>>>> <[E-MAIL ADDRESS DELETED]>
>>>>>>>> To: <[E-MAIL ADDRESS DELETED]>
>>>>>>>> Sent: Wednesday, March 17, 2010 10:52 PM
>>>>>>>> Subject: [seasar-dotnet:1605] Re: 外だしSQLについて
>>>>>>>>
>>>>>>>>
>>>>>>>>> 藤井です。
>>>>>>>>>
>>>>>>>>> 完全に一緒ではないのですが、Oracle10gXE、ODP、Quillが1.3.17の
>>>>>>>>> 環境で実行しましたが、再現しませんでした。
>>>>>>>>>
>>>>>>>>> もう少し調べる前に、お願いなのですが、S2Dao.NET用のインターフェイスの
>>>>>>>>> 書き方は間違えていることはないでしょうか?
>>>>>>>>> 引数や2バイト文字の漢字や1バイト文字をプロパティなどで混在して
>>>>>>>>> 使われているようですが、これらを間違えて使っていることはない
>>>>>>>>> でしょうか?
>>>>>>>>>
>>>>>>>>> それと、SQL文もこれで本当に通るか確認をお願いします。
>>>>>>>>> WHERE句の中のANDをORに変えたらsqlplusで2件帰ってきました。
>>>>>>>>>
>>>>>>>>> 確認をお願いいたします。
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ㈱ネスティ 笹木 悠壱 さんは書きました:
>>>>>>>>>>
>>>>>>>>>> はじめまして。
>>>>>>>>>> 笹木と申します。
>>>>>>>>>>
>>>>>>>>>> 外だしSQLについて質問させて下さい。
>>>>>>>>>> パラメータコメントに全角文字を指定すると、
>>>>>>>>>> 想定される結果を取得できないことがあります。
>>>>>>>>>>
>>>>>>>>>> パラメータコメントを使用せずに、直接書き込んで
>>>>>>>>>> 実行した場合は、思ったとおりの結果を取得できます。
>>>>>>>>>>
>>>>>>>>>> 何か設定が必要なのでしょうか?
>>>>>>>>>> 以下、実行内容です。
>>>>>>>>>>
>>>>>>>>>> ■開発環境
>>>>>>>>>> OS:WindowsXP
>>>>>>>>>> VisualStudio2008
>>>>>>>>>> .NetFrameWork3.5
>>>>>>>>>> Oracle11g(OS:Windos2008)
>>>>>>>>>> S2Container.NET 1.3.17.0
>>>>>>>>>> S2Dao.NET 1.3.17.0
>>>>>>>>>>
>>>>>>>>>> ■テーブル
>>>>>>>>>> ・テーブル名
>>>>>>>>>> M_レッスン
>>>>>>>>>> ・フィールド
>>>>>>>>>> 店舗   NUMBER(3,0) (PK)
>>>>>>>>>> 日付   VARCHAR2(8) (PK)
>>>>>>>>>> 開始時刻 VARCHAR2(4) (PK)
>>>>>>>>>> 終了時刻 VARCHAR2(4)
>>>>>>>>>> コース  VARCHAR2(6)
>>>>>>>>>>
>>>>>>>>>> ■上記テーブル内のレコード
>>>>>>>>>> 1,"20100301","1000","1100","T初級"
>>>>>>>>>> 1,"20100301","1100","1200","T中級"
>>>>>>>>>> 1,"20100301","1200","1300","T上級"
>>>>>>>>>>
>>>>>>>>>> ■実行①(外だしSQLでパラメータコメントを使用)
>>>>>>>>>>
>>>>>>>>>> SELECT *
>>>>>>>>>> FROM M_レッスン
>>>>>>>>>> WHERE コース >= /*pmb.コースFROM*/
>>>>>>>>>> AND コース <= /*pmb.コースTO*/
>>>>>>>>>>
>>>>>>>>>> パラメータ値
>>>>>>>>>> pmb.コースFROM→'T初級'
>>>>>>>>>> pmb.コースTO→'T上級'
>>>>>>>>>>
>>>>>>>>>> ⇒検索結果は、レコードなしとなります。
>>>>>>>>>>
>>>>>>>>>> (SQLログ)
>>>>>>>>>> Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-17 12:01:30,400
>>>>>>>>>> [1] DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
>>>>>>>>>> FROM M_レッスン
>>>>>>>>>> WHERE コース >= 'T初級'
>>>>>>>>>> AND コース <= 'T上級'
>>>>>>>>>>
>>>>>>>>>> ■実行②(外だしSQLでパラメータコメントを使用をしない)
>>>>>>>>>>
>>>>>>>>>> SELECT *
>>>>>>>>>> FROM M_レッスン
>>>>>>>>>> WHERE コース >= 'T初級'
>>>>>>>>>> AND コース <= 'T上級'
>>>>>>>>>>
>>>>>>>>>> ⇒検索結果は、レコード2件となります。
>>>>>>>>>> 1,"20100301","1000","1100","T初級"
>>>>>>>>>> 1,"20100301","1200","1300","T上級"
>>>>>>>>>>
>>>>>>>>>> SQLツールで実行した場合は、結果②と同じです。
>>>>>>>>>> 実行①で、実行②と同じ結果を取得するためには
>>>>>>>>>> どういった設定が必要なのでしょうか?
>>>>>>>>>>
>>>>>>>>>> 以上、宜しくお願い申し上げます。
>>>>>>>>>>
>>>>>>>>>> 笹木
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --------------------------------------------------------------------------------
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> seasar-dotnet mailing list
>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --------------------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>>>> _______________________________________________
>>>>>>> seasar-dotnet mailing list
>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> seasar-dotnet mailing list
>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> seasar-dotnet mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>


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