Вставьте строки в Access db из C #, используя Microsoft.Jet.OLEDB.4.0, столбец autonumber установлен в ноль - PullRequest
0 голосов
/ 30 сентября 2008

Я использую C # и поставщика Microsoft.Jet.OLEDB.4.0 для вставки строк в базу данных Access.

Да, я знаю, что Access - отстой. Это огромное устаревшее приложение, и все остальное работает хорошо.

В таблице есть столбец автонумерации. Я вставляю строки, но столбец автонумерации установлен в ноль.

Я гуглил вопрос и прочитал все статьи, которые смог найти по этому вопросу. Один из них предложил вставить -1 для столбца autonumber, но это не сработало. Ни одно из других предложений, которые я мог найти, не сработало.

Я использую OleDbParameter, а не объединяю большую текстовую строку SQL.

Я пробовал вставку с транзакцией и без нее. Без разницы.

Как мне заставить эту вставку работать (т.е. правильно установить содержимое столбца автонумерации)?

Заранее большое спасибо,

Адам Лефферт

Ответы [ 2 ]

2 голосов
/ 01 октября 2008

В Access можно вставлять явное значение в столбец IDENTITY (a.k.a. Automnumber). Если вы (или ваше промежуточное программное обеспечение) записывает нулевое значение в столбец IDENTITY, и для столбца IDENTITY нет уникальных ограничений, это может объяснить это.

Просто чтобы прояснить, вы должны использовать синтаксис

INSERT INTO (<column list>) ... 

и в списке столбцов должен отсутствовать столбец IDENTITY. Jet SQL позволит вам опустить весь список столбцов, но затем неявно включает столбец IDENTITY. Поэтому вы должны использовать синтаксис INSERT INTO (), чтобы явно пропустить столбец IDENTITY.

В Access / Jet вы можете записать явные значения в столбец IDENTITY, и в этом случае значение, очевидно, не будет сгенерировано автоматически. Поэтому убедитесь, что и вы, и ваше промежуточное ПО (ADO.NET и т. Д.) Явно не записывают нулевое значение в столбец IDENTITY.

Кстати, только для столбца IDENTITY в таблице ниже будет автоматически генерироваться нулевое значение каждую секунду. INSERT:

CREATE Table Test1 
(
   ID INTEGER IDENTITY(0, -2147483648) NOT NULL, 
   data_col INTEGER
);
0 голосов
/ 30 сентября 2008

При выполнении вставки вы должны быть уверены, что вы НЕ указываете значение для столбца AutoNumber. Как и в SQL Server, вы не вставляете значение для столбца идентификаторов.

...