トップ回答者
AccessにおけるSQLで予約文字をAS句に使う方法

質問
-
環境:VisualBasic2010
OS:Windows7 Pro x64AccessのSQLの記述について教えてください。
SELECT Table1.Ch1 AS No1 , Table1.Ch2,Table1.Ch3, Table1.Ch4, Table1.Ch5 FROM Table1
上のような記述で、エイリアスを設定してSQLを実行すると問題なくレコードを取得することができます。
ここで、以下のように予約文字を使用したい場合はどのようにすればよいでしょうか。SELECT Table1.Ch1 AS No.1 , Table1.Ch2,Table1.Ch3, Table1.Ch4, Table1.Ch5 FROM Table1
とりあえず、No.1を[No.1]や 'No.1'、 "No.1"などとしてみましたがNGでした。
確認方法としては、Access2010上でのクエリでSQL文字列を作成して実行しています。コード上では、「.(半角ピリオド)」 を「¥.(全角ピリオド)」として、エイリアスを指定して、バインド後の表示時に、
Replaceしていますが、スマートではないのと、他の文字に対応できないため、なにか良い方法がないかと模索中です。どなたが、ご存知の方がいらっしゃいましたら、教えていただけますでしょうか。
よろしくお願いいたします。
回答
-
以下、ご参考までに連携します。
エラーで表示されているように、Accessの列別名に、「ピリオド」を使用することはできません。
列名を以下のようにするなど、ご検討いただければと思います。
たとえば。。
- No1←1つめのSQLの記載方法を採用する。
- №1←「ナンバー」と打ち込んで変換しています。(環境依存文字ですが。。)
参考サイト:
Access データベースでの作業時に使用すべきでない特殊文字
How can I use the table name in a column alias in Access SQL?
-
コード上では、「.(半角ピリオド)」 を「¥.(全角ピリオド)」として、エイリアスを指定して、バインド後の表示時に、
Replaceしていますが、スマートではないのと、他の文字に対応できないため、なにか良い方法がないかと模索中です。エイリアスにピリオドを含むのは難しいように思います。エイリアスで列名を変えてしまう方法は確かにわかりやすく簡単ですが、列名を変えるチャンスは、データテーブルでもあります。テーブルアダプターを使用している場合にはそこで変えてしまえば良いですし、データテーブルを直接使用している場合でもデータ取得後に列名を変更することが可能です。
また、DataGridViewに表示している場合は、列のHeaderTextプロパティで変更できるなど、コントロール側で変えることもできます。
確かにReplaceするのは見通しが悪くなり、あまり良い方法だと思いませんので、上記のような対応を検討されてみてはいかがでしょうか?★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク Kino001 2013年1月28日 9:29
すべての返信
-
以下、ご参考までに連携します。
エラーで表示されているように、Accessの列別名に、「ピリオド」を使用することはできません。
列名を以下のようにするなど、ご検討いただければと思います。
たとえば。。
- No1←1つめのSQLの記載方法を採用する。
- №1←「ナンバー」と打ち込んで変換しています。(環境依存文字ですが。。)
参考サイト:
Access データベースでの作業時に使用すべきでない特殊文字
How can I use the table name in a column alias in Access SQL?
-
コード上では、「.(半角ピリオド)」 を「¥.(全角ピリオド)」として、エイリアスを指定して、バインド後の表示時に、
Replaceしていますが、スマートではないのと、他の文字に対応できないため、なにか良い方法がないかと模索中です。エイリアスにピリオドを含むのは難しいように思います。エイリアスで列名を変えてしまう方法は確かにわかりやすく簡単ですが、列名を変えるチャンスは、データテーブルでもあります。テーブルアダプターを使用している場合にはそこで変えてしまえば良いですし、データテーブルを直接使用している場合でもデータ取得後に列名を変更することが可能です。
また、DataGridViewに表示している場合は、列のHeaderTextプロパティで変更できるなど、コントロール側で変えることもできます。
確かにReplaceするのは見通しが悪くなり、あまり良い方法だと思いませんので、上記のような対応を検討されてみてはいかがでしょうか?★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク Kino001 2013年1月28日 9:29
-
trapemiya様
ご返信ありがとうございます。
kyk_nk様からも使用できない回答をいただきました。
初期のころに手がけたもので、「AccessDataSource」を使用しています(Webフォーム開発です)。
DataSourceModeをDataSetとしているので、そちらで何かできるか調べてみます。
Me.AccessDataSource1.DataFile = AccDataFile Me.AccessDataSource1.SelectCommand = strSQL Me.GrdTimeSeries.DataSourceID = Me.AccessDataSource1.ID Me.AccessDataSource1.DataBind()
従いまして、現在は、GridViewのRowDataBindイベントで、RowTypeがHeaderのときの処理で
.Replace("\.", ".")
としています。もともとのエイリアス名は使うときによって、様々違うため(表が何種類もある)、
エイリアス名の設定値を読み込んで後処理としています。