Получить следующий номер AutoNumber для доступа

У меня есть таблица в Microsoft Access/JET, которая имеет поле AutoNumber, которое устанавливается постепенно, который служит первичным ключом таблицы. Мне нужно знать, каким будет значение первичного ключа для следующей вставленной записи, но мне нужно знать это значение до того, как запись будет вставлена. С помощью SELECT MAX([ID]) + 1 FROM [TableName]; не будет работать, потому что записи обычно удаляются из конца таблицы. (Вставка новой записи просто для определения значения также не подходит.)

Я знаю, что это легко сделать в MySQL с помощью команды SHOW TABLE STATUS. Есть ли что-нибудь, что позволит мне сделать то же самое для Access / JET, используя ADO, DAO, VB6 или любые другие доступные инструменты?

3 ответа

Решение

Вы можете использовать ADOX (Microsoft ADO Extensions для DDL и Security), чтобы определить текущее значение "Seed" вашего поля автонумерации.

Public Function NextAutonumber(ByVal pTable As String, _
        ByVal pAutonumField As String) As Long

    Dim cat As Object
    Set cat = CreateObject("ADOX.Catalog")
    Set cat.ActiveConnection = CurrentProject.Connection
    NextAutonumber = cat.Tables(pTable).Columns(pAutonumField).Properties("Seed")
    Set cat = Nothing
End Function

Обратите внимание, что этот подход может дать неправильный результат в многопользовательской ситуации... если другой пользователь может украсть INSERT в промежутке времени, когда вы получаете следующий автономный номер, и вы на самом деле делаете INSERT, Если это важно, вы можете проверить, получили ли вы ожидаемое значение, проверив SELECT @@Identity после INSERT,

Функция Autonumber в Access очень ограничена по сравнению со столбцом идентификации SQL Server или столбцом AUTO_INCREMENT MySQL. Невозможно получить следующий доступный номер, кроме использования SQL, который является неточным. Как вы заявили, записи, удаленные с этого конца, сделают так, чтобы верхний номер и следующий номер не совпадали. (См. Редактировать ниже).

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

Редактировать:
Я вижу, что HansUp действительно нашел способ сделать то, что вы просили. Пожалуйста, посмотрите его решение.

Изначально я согласился с решением HK1 сделать свое, но Ганс нашел лучшее решение.

Я собирался предложить найти идентификатор, вставив запись в транзакцию с откатом. Проблема в том, что вы получите следующий номер (например, 62), но когда вы действительно добавите новую запись по-настоящему, вы получите идентификатор после этого (63). Восстановление сбрасывает значения до следующего доступного числа.

Просто любопытно, зачем тебе этот номер знать? Если у вас есть запись (бумажная или иная), для которой необходимо это значение, вы должны ввести ее в эту систему / документы после того, как вы действительно введете эту запись.

Другие вопросы по тегам