Получить следующую таблицу AutoNumber for Access - PullRequest
4 голосов
/ 27 июня 2011

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

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

Ответы [ 3 ]

7 голосов
/ 28 июня 2011

Вы можете использовать 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.

1 голос
/ 28 июня 2011

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

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

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

1 голос
/ 28 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...