DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OleDbConnection経由でSQLを実行すると結果が異なる

環境/言語:[OS : Windows 7 / 言語 : C# / .NET Framework : 3.5]
分類:[.NET]

こんにちは。
C#、Accessともに初めてで、頓珍漢な質問となっているかもしれませんが、よろしくお願いいたします。


【解決したい問題】
Access2010で作成した空のaccdbファイルにテーブルを作成したいのですが、想定した結果でないため、困っております。
以下のコードでテーブルを作成しております。

string filepath = @"C:\hogehoge.accdb"; //accdbファイルのパス
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source="+filepath+";");
con.Open();
OleDbCommand odc = new OleDbCommand("CREATE TABLE SAMPLE_TABLE (番号 TEXT, 名前 TEXT)", con);
odc.ExecuteNonQuery();

実行したところ、accdbファイル内にテーブルが作成されるのですが、番号/名前がメモ型となってしまいます。
番号、及び名前をテキスト型で作成することは出来ないのでしょうか。


【解決するために何をしたか】
上記のSQLをAccessのクエリデザイン>SQLビューで実行したところ、番号、及び名前がテキスト型で登録されました。
実行結果が異なるため、混乱しております。


どなたかご存知の方がいらっしゃいましたら、よろしくお願いいたします。
こんばんは。

入力した文章そのままが最終的に実行されるわけではないので…
Accessのアプリ本体での解釈と外のドライバでの解釈は扱いが常に同じとは限りません。
この場合は桁数を省略した際の融通の利かせ方・考え方が違うのが原因だと思います。


Access上でTextとだけ指定した場合は確かデフォルトの50桁でのテキスト型という解釈になりますが、
よそからドライバ経由でテーブル作成のSQLを実行する場合には
桁を省略してTextとした場合はmemoと書いた際と同じ、より長い桁を扱えるメモ型になってしまいます。

varcharとするかvarchar(桁数)とするかtext(桁数)としてみてください。
なお、桁数は最大で255までです。桁数指定なしでvarcharと書くと255になったと思いますが、2010は分かりません。
■No31970に返信(やのじさんの記事)
> OleDbCommand odc = new OleDbCommand("CREATE TABLE SAMPLE_TABLE (番号 TEXT, 名前 TEXT)", con);
> 実行したところ、accdbファイル内にテーブルが作成されるのですが、番号/名前がメモ型となってしまいます。
型名「TEXT」「NOTE」「MEMO」「NTEXT」「LONGTEXT」は、いずれもメモ型を意味します。


文字列の長さを指定して「TEXT(10)」とすれば、可変長テキスト型(NATIONAL CHARACTER VARYING)になりますが
文字列の長さを指定せずに「TEXT」とした場合はメモ型(LONGETEXT)になります。


> 番号、及び名前をテキスト型で作成することは出来ないのでしょうか。
Access 2010 でテキスト型を作るには、データ型として
 TEXT(10)
 NTEXT(10)
 CHARACTER VARYING(10)
 NATIONAL CHARCTER VARYING(10)
 CHARACTER(10)
 NATIONAL CHARCTER(10)
 CHAR(10)
 NCHAR(10)
 VARCHAR(10)
 NVARCHAR(10)
などを使います。

・カッコ内は文字列の最大長(文字数)です。0 または 1〜255 の範囲で指定できます。
・TEXT/NTEXT 以外の型で括弧を省略すると、最大長(255)が指定されたものとみなされます。
・TEXT/NTEXT で括弧を省略した場合は、前述の通り「メモ型」となります。
・VAR/VARYING 無しは固定長のテキスト型です。短い文字列を格納した場合、末尾に空白が補填されます。
 (ちなみに、Access のテーブルデザイナで作成するテキスト型は、常に可変長となります)
・先頭に N または NATIONAL が付いている型は、本来は他言語文字列を意味します。
 ただし現行バージョン(Access 97 以降)では、文字列を Unicode で扱うため、
 N/NATIONAL 無しであっても、NATIONAL VARCHAR/NATIONAL CHAR となります。

この他、「ALPHANUMERIC」「STRING」などという型名も使えます。
(これらは可変長文字列です)
ご回答いただき、ありがとうございました。

とん。様
 SQLが同じでも、解釈が異なるとは知りませんでした。
 次からはこの点について考えながら組もうと思います。

魔界の仮面弁士様
 メモ型を意味する他の型、テキスト型を作る際の詳細な例は参考になりました。
 可変長文字列も参考になりました。

問題は「VARCHAR(255)」にすることで、解決することが出来ました。
本当にありがとうございました。
解決済み!
2013/12/04(Wed) 19:24:09 編集(投稿者)

投稿タイミングの差で、解決済みマークを解除してしまったので、
解決済みに戻して再投稿。


■No31974に返信(とん。さんの記事)
> Access上でTextとだけ指定した場合は確かデフォルトの50桁でのテキスト型という解釈になりますが、

クエリデザイナーの事でしょうか? だとしたら、サイズ指定なしの
「TEXT」の扱いは、SQL モードの設定によって異なります。(Access 2000 以降)

ANSI 89 モードのデータベースの場合はテキスト型になりますが、
ANSI 92 モードのデータベースの場合はメモ型です。

クエリデザイナーの SQL モードの切替は、Access 2002 以降の
オプション設定画面にて行えます。


> よそからドライバ経由でテーブル作成のSQLを実行する場合には
OLE DB 接続の場合は、ANSI-92 モードのみが使用可能です。(Access 2000 以降)
DAO 接続の場合は、ANSI-89 モードのみが使用可能です。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板