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

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2010年 3月 30日 (火) 06:45:17 JST


藤井です。

遅くなりました。

 > 藤井さん、よければ、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 メーリングリストの案内