Почему MS Access 2007 не разрешает вставку строки, а затем разрешает ее при следующей попытке вставки? - PullRequest
8 голосов
/ 08 марта 2011

Мой оператор вставки:

INSERT INTO myTable (inst_id,user_id,app_id,type,accessed_on)
VALUES (3264,2580,'MyApp','Renew',Now);

... где все значения отформатированы правильно.В таблице есть вышеперечисленные поля и еще одно, длинное поле ключа с автоинкрементом int.Внешними ключами являются 'inst_id', 'user_id' и 'app_id'.

Я получаю эту ошибку от Access: access error

... и следующую ошибку от VS 2005когда происходит ошибка:

System.Data.OleDb.OleDbException: изменения, запрошенные вами в таблице, не увенчались успехом, так как они могут создать повторяющиеся значения в индексе, первичном ключе или отношении.Измените данные в поле или полях, которые содержат повторяющиеся данные, удалите индекс или переопределите индекс, чтобы разрешить повторяющиеся записи, и повторите попытку.

При выполнении этого запроса вставки я могу просмотреть базу данных иубедитесь, что каждое из значений внешнего ключа существует в соответствующих таблицах и хранится в течение нескольких месяцев (для конкретного примера, который я использую).Эти поля также установлены так, чтобы я мог иметь дубликаты, так что это не проблема.Вызовы такого рода в других таблицах прекрасно работают.Мне не нужно указывать значение ключа автоинкремента в запросе вставки, оно добавляет его для меня автоматически (как и должно быть).

Странно то, что если я сделаю это в своем коде:

try
{
    //Execute the query here...
}
catch
{
    //Execute the same query again
}

... или если я просто попытаюсь выполнить это дважды в Access, это сработает.

Кто-нибудь сталкивался с этим раньше?Опять же, этот тип вставки работает для других таблиц, все внешние ключи присутствуют в соответствующих таблицах, первичный ключ этой таблицы установлен как «Автоинкремент», и все поля (кроме поля первичного ключа, конечно)разрешить дублирование.

Есть идеи?

РЕДАКТИРОВАТЬ: Самый большой ключ перед вставкой: 343085.Самый большой ключ после вставки: 343086.Формат:

id: AutoNumber (Field Size=Long Interger, New Values=Increment, Indexed=Yes - No Duplicates)

inst_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK)

user_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK)

app_id: Text (Field Size=255, Required=Yes, Indexed=Yes - Duplicates OK)

type: Text (Field Size=50, Required=Yes, Indexed=No)

accessed_on: Date/Time (Default Value=Now(), Required=Yes, Indexed=No)

Ответы [ 6 ]

1 голос
/ 30 марта 2011

Здесь используется старая память ...

Попробуйте добавить поле временной метки в вашу таблицу.

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

Нарушение ключа, к которому относится ошибка, - это не отсутствующий ключ в другой таблице, это дубликат ключа в той же таблице.Иногда Access получает пересеченные провода и думает, что ключ, который он назначает новой записи, уже назначен другой записи в таблице.Я не знаю, что является причиной этого.Но помещая поле временной метки в таблицу, это заставляет Access думать по-другому.

Это расстраивает, потому что я не знаю, почему это работает.И теперь в моей таблице есть поле с меткой времени, которое бесполезно.Но пусть будет так.

1 голос
/ 23 марта 2011

MS-Access, как известно, устраняет ложные ошибки, которые не имеют ничего общего с сообщаемой ими проблемой. Не мешало бы окружить столбец с именем "type" скобками, [type].

http://office.microsoft.com/en-us/access-help/access-2007-reserved-words-and-symbols-HA010030643.aspx#_Toc272229038

0 голосов
/ 09 марта 2018

Я знаю, давно у меня была похожая проблема.В моих случаях я получал ту же ошибку, но у меня не было никаких уникальных индексов в таблице.Я наконец решил это путем перекомпоновки и сжатия базы данных .

0 голосов
/ 23 марта 2011

Я считаю, что Jet / ACE не поймет метод NOW ().

И я работал с версией ACE, синтаксис не мог работать.Нужно найти другой способ прямой реализации синтаксиса.

0 голосов
/ 19 марта 2011

INSERT INTO myTable (inst_id, user_id, app_id, type, accessed_on) VALUES (3264, 2580, «MyApp», «Обновить», сейчас);


Вы можете просто проверить это с accessed_on типом данных и Now типом данных



Измените тип значения DateTime на String при вставке, что будет хорошо.
Дайте мне знать, если это работает для вас.

Спасибо
Rafee

0 голосов
/ 18 марта 2011

Меняется ли значение Сейчас между попытками, так что теперь ошибка повторяющегося ключа больше не существует?

...