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