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

kubo [E-MAIL ADDRESS DELETED]
2010年 3月 18日 (木) 19:47:50 JST


久保(jflute)です。

笹木さん、こんばんは

問題を整理すると:

最初、「パラメータコメントで全角文字を使うと...」
だったのが、再度の検証の結果、
「全角文字の利用の有無に関係なく、Courseカラム
の大なり小なり条件が想定外のものになる」
ということになりますでしょうか?

A. バインド変数の有無で影響している(かも)
B. 全角文字のデータ値が影響している(かも)

とりあえず思いつく、以上の二点に関して検証して
みるともう少し状況がクリアになってくるかもしれません。

<A>
A-1. 埋め込み変数コメントを利用して実行してみる
A-2. SQL*Plusでバインド変数を利用して実行してみる

<B>
B-1. 全角文字の値を止めてみる (abc, def とか単純なのでお試し)
B-2. 別の全角文字を使ってみる
*DB側で利用しているエンコーディングは何でしょう?
(原因としてちょっと考えずらいですが...)

2010/3/18 笹木 悠壱 <[E-MAIL ADDRESS DELETED]>:
> 藤井様
>
> お世話になっております。笹木です。
>
> ご確認いただき、ありがとうございます。
> ご指摘いただいた点を踏まえて、再度検証してみました。
>
> まず、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 メーリングリストの案内