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時の項目名を使っていないことの責任も、私のにありますが、このようにする必然性ってあるのかしら。
また、照合順序の指定が、なぜ、項目名に影響するのか不思議でした。