[seasar-dotnet:713] Re: S2Dao.Net+Npgsqlでのクエリーの不具合について

Kazuya Sugimoto [E-MAIL ADDRESS DELETED]
2007年 12月 26日 (水) 16:32:43 JST


黒柳さん、こんにちは。

杉本です。

S2Dao.NETを通しても、内部では基本的に【3】と同じようなことをやっているので、
問題ないはずなのですが、原因はなんでしょうねぇ。

使用しているデータプロバイダはNpgsqlだと思いますが、念のため確認させてください。

データプロバイダを指定しているDiconファイルかアプリケーション構成ファイルを
見せてもらえますでしょうか?

07/12/26 に Hitoshi Kuroyanagi さんは書きました:
> こちらのMLには初めて出させていただきます、黒柳と申します。
>
> 現在 S2Dao.Net + NpgSQLにて開発をしているのですが
> クエリーで正確に検索できない現象が発生して困っています。
>
> テーブル TestTable
> id(int)    infoname(text)     infovalue(text)
> ----------+----------------------+-----------------------
>   1         カタログNo            01-0001
>   2         カタログNo            01-0002
>   3         カタログno            01-0003
>   4         カタNo                 01-0004
>   5         カタNo                 01-0005
>   6         カタログno            01-0006
>   7         CatalogNo            01-0007
>   7         カタログNo            01-0008
>
> このようなテーブルに対して以下のdaoでクエリーを実行するのですが
>
> 本来であれば3件返ってくるはずが2件しか戻ってきません。
> [Bean(typeof(TestTableDto))]
> public interface ITestTableDao
> {
>        [Sql("SELECT infoname,infovalue FROM test WHERE Infoname='カタログNo'")]
>        IList<TestTableDto> GetCatalogNo();
> }
>
> どうも調べていくうちにある事実がわかりました
>
> Seasarのログでは以下の様にSQLが正しく解釈されているのに
> Seasar.Extension.ADO.Impl.BasicSelectHandler: DEBUG 2007-12-26
> 15:24:32,218 [12] SELECT infoname,infovalue  FROM test WHERE
> Infoname='カタログNo'
>
> PostgreSQLサーバーのログでは以下のように "No"が"no"としてSQL文の発行がされています
> 2007-12-26 15:24:32 LOG:  statement: select infoname,infovalue as
> nodename from test where infoname='カタログno'
> このため 上記のDaoでは2件が取得されているようです
>
> 調査した中でわかっていることは以下のことです
> 【1】同じテーブルをODBC経由で検索では正常に取得できている。
>     (但し非常に遅い)
> 【2】同様のテーブルをSqlServer2005に作成しS2Dao.Netで検索では正常に取得できている。
>     (データベースの照合順序をJapanese_CS_AS_KS_WSに変更してある)
>
> [Sql("SELECT infoname,infovalue FROM test WHERE Infoname='カタログNo'")]
>> [Sql("SELECT infoname,infovalue FROM test WHERE Infoname='CatalogNo'")]
> にしてもやはり失敗している
> ( PostgreSqlのログ
> 2007-12-26 15:45:31 LOG:  statement: select infoname,infovalue as
> nodename from test where infoname='catalogno'
> )
> 【3】Seasarを使わずにNpgSQLでの検索では正常に取得できている。
> string sqlStr = "SELECT infoname,infovalue  FROM public.bomvalue WHERE
> Infoname='カタログNo'";
> string connStrNpgsql = "Server=localhost;"
>                                 + "Port=5432;"
>                                 + "User Id=*******;"
>                                 + "Password=****;"
>                                 + "Database=***;"
>                                 + "Encoding=UNICODE";
> NpgsqlConnection Npgconn = new NpgsqlConnection(connStrNpgsql);
> NpgsqlCommand Npgcmd = new NpgsqlCommand(sqlStr, Npgconn);
> Npgconn.Open();
> NpgsqlDataReader Npgdr = Npgcmd.ExecuteReader();
> while (Npgdr.Read())
> {
>     Console.Write("{0},{1}\n", Npgdr["infoname"], Npgdr["infovalue"]);
> }
> この時のPostgreSQLログ
> 2007-12-26 15:54:53 LOG:  statement: SET CLIENT_ENCODING TO UNICODE
> 2007-12-26 15:54:53 LOG:  statement: SELECT oid, typname FROM pg_type
> WHERE typname IN ('unknown', 'refcursor', 'char', 'bpchar', 'varchar',
> 'text', 'name', 'bytea', 'bit', 'bool', 'int2', 'int4', 'int8', 'oid',
> 'float4', 'float8', 'numeric', 'inet', 'money', 'date', 'time',
> 'timetz', 'timestamp', 'timestamptz', 'point', 'lseg', 'path', 'box',
> 'circle', 'polygon')
> 2007-12-26 15:54:53 LOG:  statement: SELECT infoname,infovalue FROM
> test WHERE infoname='カタログNo'
>
> 環境は以下の通りです
> PostgreSQLのバージョン 8.2.5
> NpgSqlのバージョン  PostgreSQL添付のものでなく PgFoundryの Npgsql1.0.1-bin-ms2.0
>    バージョン  1.0.0.0 ランタイムバージョン  v2.0.50727
> S2Daoのバージョン   1.3.5.0  ランタイムバージョン  v2.0.50727
>
> 私なりの考えでは
> S2Dot.NET経由ではSQL文を発行する前の文、特に"SET CLIENT_ENCODING TO UNICODE"
> というのがないのですが、この辺が原因のような気がします
> もし何か解決の手がかりがございましたらご教示ください。
>
> ---------------------------------------
> 黒柳 仁 / Hitoshi Kuroyanagi
> ---------------------------------------
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


-- 
Kazuya Sugimoto
Microsoft MVP Visual Developer - Solutions Architect
http://d.hatena.ne.jp/sugimotokazuya/


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