[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 メーリングリストの案内