0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Access 今日のトリビア Schema.iniでフィールド名をブランケットで囲むと()がつく

Last updated at Posted at 2022-01-06

前提条件

ACCESS テキストファイル形式のフィールド区切り記号に、桁やテキストの区切り記号と同じ記号は使用できません
この設定を使いまわします。
なお、ファイル形式はmdbではなくaccdbとします。

sch.txt
"NO","F01","F02","F03"
"01",2233333.456,"nam","1000000"
"01",2233333.456,"Bond, James ""master""","2000000"

ここでSchema.iniを次のように表記します。

schema.ini
[sch.txt]
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=25
CharacterSet=ANSI
CurrencyThousandSymbol=, 
CurrencyDecimalSymbol=. 
DecimalSymbol=.
TextDelimeter="
NumberLeadingZeros=True
Col1=[NO] LONG
Col2=[F01] Double
Col3=[F02] Text Width 30
Col4=[F03] Currency

SQL

SELECT * INTO T_CsvImport
FROM [TEXT;DATABASE=C:\hoge].sch.txt;

実行すると

image.png

なんとフィールド名に半角のカッコ()がついていることがわかります。

さらに

それではSchema.iniを次のように書きます。

schema.ini
[sch.txt]
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=25
CharacterSet=ANSI
CurrencyThousandSymbol=, 
CurrencyDecimalSymbol=. 
DecimalSymbol=.
TextDelimeter="
NumberLeadingZeros=True
Col1="[NO]" LONG
Col2="[F01]" Double
Col3="[F02]" Text Width 30
Col4="[F03]" Currency

この場合どうなるか

SQLを実行してみます。

image.png

同じようにフィールド名にカッコがつく

なんと二重引用符の有無に関わらずカッコがついてしまいました。

ポイント

まずなぜ角かっこで包んだかというと、
Access 2002 以降のバージョンの Access の予約語の一覧

予約語を含む名前を持つ既存のオブジェクトの場合は、オブジェクト名を角かっこ ([ ]) で囲み、エラーを回避できます

というのがあり、
この予約語の中にNOがあるため、角かっこ[]でエラーを回避しようとしたためでした。
なお、角かっこ[]英語ではブランケットとも言いますが、これ自体はフィールド名に使えずエラーになるとされています。

Access データベースで特殊文字を使用する場合のエラー メッセージ

フィールド名に角かっこ ([]) またはかっこ (()) が含まれている場合は、次のエラー メッセージが表示されます。
入力した式には、閉じるかっこ、かっこ (])、または垂直バー (|) がありません。

次に、Schma.iniのフィールド名は二重引用符は必ずしも必要ではありません。しかし、空白があるとエラーが起きるため、二重引用符で回避しsています。

なお、accdb形式では上記の予約語は使ってもエラーになりません。これは誤解していたのですが、よく見ると、

難易度: 低シングル ユーザー コンピューターのユーザー インターフェイスに関する知識が必要です。 この記事は、Microsoft Access データベース (.mdb) と Microsoft Access プロジェクト (.adp) に適用されます

とあります。つまり、accdbファイルではエラーにならないわけです。その代わりブランケットが勝手に変換されているという自体になっているわけです。
ここまではいいのですが、ブランケットを使っていたらエラーではなく勝手に変換しているという点が最大のポイントです。
これは予期しない動作としていいと思います。
なぜかというとフィールド名に使えない文字を使い、さらに、テキストファイルのフィールド名と一致していないからです。
本来なら一口も食べずにエラーになって当たり前のはずです。
そうした予想を裏切るので、予期しない動作といえるわけです。

なお、SChema.iniのcsv変換で下手を打つと、Accessは強制終了します。なので、このへんはあまりAccessを試すような行為はやめたほうがいいと思います。
フィールド、コントロール、オブジェクトに名前を付けるためのガイドラインを守りましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?