2011-01-25 2 views
1

Я делаю файл базы данных MS Access с помощью OleDb. Вот фрагмент:AUTOINCREMENT не работает на OleDbCommand

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] LONG NOT NULL PRIMARY KEY AUTOINCREMENT, " + 

с:

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

, и она работала.

+1

Интересно. , , Вы используете ac 2007 или 2010? Я еще не обновился. Однако в 2003 году ключевое слово COUNTER работало для меня, а IDENTITY не удалось. Интересно, и извинения за то, что вы ошибаетесь! – XIVSolutions

+0

Нет, все в порядке. Спасибо, в любом случае. Я использую Access 2007, но я сохранил его как файл Access 2003. Я проверю его в 2003 году. Спасибо всем. –

2

При использовании DDL для доступа к MS Access вы хотите использовать COUNTER для указания целочисленного поля с автоматическим приращением.

+1

Не уверен, но вы также можете столкнуться с проблемами с TIMESTAMP. Вместо этого определите поле TimeAndDateTested как DateTime и установите значение по умолчанию для NOW() – XIVSolutions

+0

@XIVSolutions Спасибо –

+0

@XIVSOlutions: это не поле метки времени, так как оно не будет обновляться при каждом изменении записи. Однако в A2010 можно реализовать макрос данных на уровне таблицы (это работает как триггер), но это невозможно на уровне двигателя в любой надежной версии Jet/ACE (это необходимо сделать на уровень приложения). –

4

В Access 2003 это утверждение создаст структуру таблицы, я думаю, что вы хотите. Заметьте, что я изменил имя первого поля на Kount, потому что Count является зарезервированным словом в Access. Вы можете заключить это имя в квадратные скобки, чтобы избежать двусмысленности, но я предпочитаю просто избегать использования зарезервированных слов в качестве имен объектов. TIMESTAMP распознается как синоним DATETIME. VARCHAR признан синонимом TEXT. BIT предоставит вам тип поля, который Access вызывает Да/Нет.

CREATE TABLE MyTable2 (
Kount COUNTER CONSTRAINT pkey PRIMARY KEY, 
TimeAndDateTested TIMESTAMP NOT NULL, 
SerialNumber VARCHAR(14) NOT NULL, 
TestResult BIT NOT NULL); 

Я назначил ограничение основного ключа для Kount и назвал ограничение как «pkey». Не Null и уникальные подразумеваются с помощью ограничения первичного ключа, поэтому вам не нужно указывать их отдельно.

+0

Я не знал, что TIMESTAMP разрешит DateTime. На остальном красиво сделано. – XIVSolutions

+0

Я думаю, что очень странно, что Jet/ACE DDL сделает TIMESTAMP синомом DATETIME, так как они не являются одним из аспектов воображения.Я предполагаю, что дело в том, что оно ухудшает смысл части определения TIMESTAMP, поддерживаемой Jet/ACE, но это самая тривиальная часть значения, так что мне вряд ли полезно. –

Смежные вопросы