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

Hitoshi Kuroyanagi [E-MAIL ADDRESS DELETED]
2007年 12月 26日 (水) 16:01:04 JST


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