2011-01-25 11 views
1

OleDbを使用してMS Accessデータベースファイルを作成しています。スニペットは次のとおりです。OleDbCommandでAUTOINCREMENTが機能しない

OleDbCommand command = oleDbConnection.CreateCommand(); 

command.CommandText = 
    "CREATE TABLE MyTable (" + 
    "[Count] LONG NOT NULL PRIMARY KEY AUTOINCREMENT, " + 
    "[TimeAndDateTested] TIMESTAMP NOT NULL, " + 
    "[SerialNumber] VARCHAR(14) NOT NULL, " + 
    "[TestResult] BIT NOT NULL)";      

command.ExecuteNonQuery(); 

何が問題なのですか?ありがとう。

答えて

3

は、私が変更します。

"[Count] IDENTITY NOT NULL PRIMARY KEY, " + 

、それが働いた:

"[Count] LONG NOT NULL PRIMARY KEY AUTOINCREMENT, " + 

で。

+1

興味深い。 。 。あなたは2007年のACまたは2010年を使用していますか?私はまだアップグレードしていない。しかし、AC 2003では、COUNTERキーワードが私のために働き、IDENTITYは失敗しました。興味深い、あなたが間違ってsterringのお詫び! – XIVSolutions

+0

いいえ、それは大丈夫です。とにかくありがとう。私はAccess 2007を使っていましたが、Access 2003ファイルとして保存しました。私は2003年にそれをチェックします。ありがとうございました。 –

2

MS Accessに対してDDLを使用する場合は、COUNTERを使用して自動インクリメント整数フィールドを指定する必要があります。

+1

TIMESTAMPでも問題は発生する可能性があります。代わりにDateTimeとしてTimeAndDateTestedフィールドを定義し、デフォルト値をNOWに設定してください。 – XIVSolutions

+0

@XIVSolutionsありがとう –

+0

@XIVSOlutions:タイムスタンプフィールドではありません。レコードが変更されるたびに更新されません。しかし、A2010では、テーブルレベルのデータマクロを実装してトリガーのように動作させることは可能ですが、Jet/ACEの賢明なバージョンではエンジンレベルでは不可能です(これは、アプリケーションレベル)。 –

4

Access 2003では、このステートメントはあなたが望むと思うテーブル構造を作成します。注意:CountはAccessの予約語なので、最初のフィールドの名前をKountに変更しました。あいまいさを避けるために名前を角カッコで囲むこともできますが、予約語をオブジェクト名として使用することは避けてください。 TIMESTAMPはDATETIMEの同義語として認識されます。 VARCHARはTEXTの同義語として認識されます。 BITは、AccessがYes/Noと呼ぶフィールドタイプを取得します。

私はKountにプライマリキー制約を割り当て、制約を "pkey"と命名しました。 Nullではなく、一意でないものは主キー制約によって暗示されるため、それらを個別に指定する必要はありません。

+0

TIMESTAMPがDateTimeに解決されることはわかりませんでした。残りはうまくいった。 – XIVSolutions

+0

私は、Jet/ACE DDLがTIMESTAMPをDATETIMEのsynomymにするのは非常に奇妙だと思います。なぜなら、それらは想像力の何もない同じものではないからです。私は、Jet/ACEでサポートされているTIMESTAMPの定義の一部にその意味を変えてしまうのではないかと思いますが、それは意味の最も単純な部分なので、ほとんど役に立ちません。 –

関連する問題