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

笹木 悠壱 [E-MAIL ADDRESS DELETED]
2010年 3月 30日 (火) 20:47:03 JST


笹木です。お世話になります。

皆様、情報をご提供いただき、ありがとうございます。
検証を続けてみます。

それから、ご報告をいたします。

久保様へ
使用しているデータプロバイダは、.Net Framework Data Provider for Oracleです。 

DbTypeは、DbType.AnsiStringを指定しております。

宮城様へ
SQLファイル "全体" の文字コードを指定方法は、シフトJISでした。
また、サンプルプログラム頂きました。ありがとうございます。
試してみます。

以上、よろしくお願い申し上げます。

笹木

----- Original Message ----- 
From: "Hiroaki Fujii" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Sent: Tuesday, March 30, 2010 6:45 AM
Subject: [seasar-dotnet:1643] Re: 外だしSQLについて


> 藤井です。
>
> 遅くなりました。
>
> > 藤井さん、よければ、DBのエンコーディングが
> > 何だったのか教えて頂けるとありがたいです。
>
> NLS_CHARACTERSET=JA16SJISTILDE
> NLS_NCHAR_CHARACTERSET=AL16UTF16
>
> です。
>
> 後の違いは、私の環境がWindows2008上ではないことでしょうか?
>
>
> kubo さんは書きました:
>> 久保(jflute)です。
>>
>>> ちなみに、藤井さんの環境では、ODPで再現しなかったようです。
>>> (但し、11g ではなく 10g とのこと)
>> すいません、Oracle11gで再度試されていましたね。
>> 藤井さん、よければ、DBのエンコーディングが
>> 何だったのか教えて頂けるとありがたいです。
>> エンコーディングで現象が変わるかどうかは未確認ですが、
>> もし、別件のエンコーディングの話と関連が深いとしたら、
>> DBをUTF-8にしていれば再現しないかもしれないので。
>>
>> 2010/3/29 kubo <[E-MAIL ADDRESS DELETED]>:
>>> 久保(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 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 メーリングリストの案内