2010-02-18 2 views
7

У меня есть приложение VB6/Access, которое иногда сталкивается с проблемой с неправильным полем поля autonumber.Сброс числа автозапуска

Допустим, что существует таблица MYTABLE с идентификатором поля autonumber (это также первичный ключ). Предположим, что в настоящий момент максимальное значение ID равно 1000. Когда приложение вставляет новую запись (значение ID не указывается явно), по какой-то причине она решает, что следующее значение поля для автозапуска равно 950 (а не 1001, как и должно быть) - поэтому возникает ошибка нарушения первичного ключа.

Я нашел статью в KB, которая описывает мои симптомы: http://support.microsoft.com/kb/884185. Короче говоря, они предлагают выполнить запрос:

ALTER TABLE MYTABLE ALTER COLUMN ID COUNTER(1001,1) 

Когда я пытаюсь сделать это, он терпит неудачу с «Invalid поле типа данных»

Проблема будет исправлена, если открыть базу данных в Access и сделать компактный/ремонт, но мне нужно уметь исправлять такие проблемы внутри приложения: он установлен на нескольких тысячах компьютеров по всему миру, и попросить людей компактно/восстановить с помощью Access не вариант.

Я использую DAO DBEngine.CompactDatabase для выполнения компактного/ремонта внутри приложения, но это не устраняет проблему семян, и необходимы некоторые дополнительные трюки.

Я надеюсь, что кто-то есть идея для решения, я очень близко к отчаянному

Спасибо всем

+0

из curosity, вы закрываете таблицу ** Перед запуском '** ALTER TABLE MYTABLE ALTER COLUMN ID COUNTER (1001, 1) '? –

+0

Если код находится внутри MDC/ACCDB доступа, языком является VBA, а не VB6. Просьба уточнить. – Fionnuala

+0

@ Otaku: Да, конечно Этот запрос не работает как при выполнении внутри Access, так и при выполнении через DAO. Странно то, что: если в Access я удаляю поле автонабора, а затем создаю точно такое же поле, запрос работает. Похоже, что существуют разные варианты типа autonumber, но я не могу получить то, что это разница: – Incidently

ответ

4

Пожалуйста, ссылка на следующую статье, она содержит метод, который вы можете добавить к вашему проекту доступа для выполнения для сброса посева. Это была заставка для меня несколько раз в прошлом:

http://allenbrowne.com/ser-40.html

В дополнение к этому он дает объяснение и понимание причин и возможности разрешения таких проблем.

+0

Я бы никогда не добавил ссылку только для поддержки одной функции - последнее связывание было бы намного лучшим способом сделать это. Но я не уверен, что вы получите что-то большее, чем то, что вы получите с DAO compact и ALTER TABLE. Во всяком случае, я не могу представить этот код, а не уплотнять. –

+0

Спасибо! Это, похоже, отлично работает – Incidently

0

Возможно, вам также понадобится убедиться, что ваша база данных настроена на использование ANSI 92, так что COUNTER распознается как законный тип данных.

В Access 2007 перейдите к Параметры доступа, конструкторы объектов, синтаксис совместимости SQL Server (ANSI 92), чтобы установить это.

+0

Вы можете выполнить ALTER TABLE с помощью ADO, чтобы избежать необходимости устанавливать режим SQL 92. –

0

Вы можете быть в состоянии решить проблему с компактным/ремонт:

In Access 2010: Compact and Repair Database on the Database Tools ribbon. 
In Access 2007: Office Button | Manage. 
In earlier versions: Tools | Database Utilities.