2010/06/04

知らずに落ちた、大きな落とし穴

RDBで、大文字小文字を区別しない、同一視するという、動作は、各レコードの項目のリテラル値の事と認識していました。


とある、SQL ServerのRDBは、 Create DataBaseの際の照合順序が Latvian_CI_AIになっていました。

私は、Create tabble時の項目名と、 Select/Insert/Update の 項目名の 大文字小文字を変えて書くことがあります。

文脈で強調したいときや、次ぎの処理でキーワードになる項目は、、すべて大文字にし、付随項目は小文字で記述したりして、 書き分けています。

これが、仇となりました。

この照合順序「Latvian_CI_AI」で作成したデータベースは、項目名の大文字、小文字を区別するのです。



create Table test ( ID char(3) ,id char(3))



の文が、エラーにならず、正常にテーブルが作成できます。もちろん

insert into test(ID,id) values('xyx','abc')

も実行できます。結果は、



select ID , id from test

ID id

1 xyz abc



となります。



一方で、.netのDataTable等は、項目名の大文字小文字区別はしないので



DataTable dt = new DataTable();

cmd.CommandText = "select ID,id from test";

SqlDataAdapter oda = new SqlDataAdapter(cmd);

oda.Fill(dt);

dgv.DataSource=dt;

と記述すれば、 ID と idは同値になり、 select文の idは、id1と項目名が補完されて、 DataTableが作成されます。



ID id1

1 xyz abc



となり、 SQL文



object ID = dt.Rows[0]["ID"];

object id = dt.Rows[0]["id"];

object id1 = dt.Rows[0]["id1"];

で確認すると、 IDと idは同値、 id1に "abc"が入ります。

つまり、 SQL文が "select ID,id from test" であっても、 "select ID,id as id1 from test" と解釈されます。

うーん。許されていいのかなぁと少し思うのです。



C系言語のmember名は大文字小文字区別しますが、 VB系などの言語は区別しません。

DataTableなどの、DataBase系の部品も、区別しません。 それなのに、接続先の SQLサーバーの構成次第で区別するというのは、一貫性を崩しているような感じがして、シックリきません。



無知だった責任と、Create Table時の項目名を使っていないことの責任も、私のにありますが、このようにする必然性ってあるのかしら。

また、照合順序の指定が、なぜ、項目名に影響するのか不思議でした。

0 件のコメント:

コメントを投稿