Access и SQL-Server: сброс поля автонумерации с очисткой таблицы

Я пытаюсь синхронизировать копию таблицы действий между таблицей SQL Server Express и производственной версией Access. В других таблицах я могу стереть содержимое таблицы SQL Server и вставить весь беспорядок обратно, чтобы зафиксировать все изменения. Однако, когда я пытаюсь сделать это с этой таблицей, я получаю информацию, но поле Autonumber увеличивается с последнего неиспользованного числа из предыдущей итерации. После дюжины или около того операций «синхронизации» я опасно близок к тому, чтобы исчерпать автонумерацию для этого поля.

Я попытался выдать «DBCC CHECKIDENT» из внешнего приложения Microsoft Access, которое выдает ошибку, что инструкция не начинается с SELECT, DELETE, PROCEDURE, DROP, ALTER или чего-то подобного. Эта команда ДЕЙСТВИТЕЛЬНО работает, когда выдается из консоли управления SQL Server (инструмент, к которому у меня есть доступ в текущей тестовой среде, но НЕ будет, когда приложение будет запущено в производство).

Затем я попробовал запрос «TRUNCATE TABLE» с помощью команды DoCmd.RunSQL, и он выдал ошибку, что операция не поддерживается для связанных таблиц (приблизительно). Эта таблица связана с внешним интерфейсом Microsoft Access (внутренняя таблица находится на SQL Server Express).

Итак, для краткого обзора:

  • Front End — это приложение Microsoft Access VBA.
  • Данные хранятся в SQL Server Express на удаленной машине.
  • Таблицы данных связаны во внешнем приложении
  • Я НЕ смогу использовать команды консоли управления SQL Server, когда это приложение будет запущено в производство, оно должно выполнять свои функции самостоятельно.
  • DoCmd.RunSQL и CurrentDB.Execute не позволяют использовать TRUNCATE TABLE или команду 'DBCC CHECKIDENT'.
  • Обе вышеупомянутые функции -ДЕЙСТВИТЕЛЬНО- работают, когда они запущены из консоли управления SQL Server - см. выше, почему это не является жизнеспособным вариантом.
  • -ВСЕ- другие таблицы ведут себя так, как я ожидал, кроме этой, при необходимости сбрасывая свои поля идентификации.

-- Отредактировано 08.08.2011 в 15:08 --

Хорошо. Я предпринял несколько попыток сквозного запроса на основе VBA, и все они привели к ошибке ODBC -- call failed. Вот код модуля, который я создал для обработки проходов (позаимствовал код с dbforums.com):

Function RunPassThrough(ByVal ConnectionString As String, ByVal SQL As String, Optional ByVal QueryName As String)

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef

    Set dbs = CurrentDb
    Set qdf = dbs.CreateQueryDef
    With qdf
        .Name = QueryName
        .Connect = ConnectionString
        .SQL = SQL
        .ReturnsRecords = (Len(QueryName) > 0)
        If .ReturnsRecords = False Then
            .Execute
        Else
            If Not IsNull(dbs.QueryDefs(QueryName).Name) Then dbs.QueryDefs.Delete QueryName
            dbs.QueryDefs.Append qdf
        End If
        .Close
    End With
    Set qdf = Nothing
    Set dbs = Nothing

End Function

Таким образом, мне нужно указать строку подключения к базе данных; все следующее не удалось:

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;Uid=<my username>;Pwd=<my password>;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

strConnect = "ODBC;DSN=instkeeper_beta;"

Результат: Запрашивает у меня имя источника данных, после того как оно указано в панели администрирования источника данных, я получаю сообщение об ошибке времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

strConnect = "ODBC;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;Trusted_Connection=False;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

-- Отредактировано 08.08.2011 в 16:41 --

БОЛЬШЕ сбоев на итерациях строк подключения, у меня официально нет идей о том, как заставить этого зверя работать. После попытки предыдущего - теперь любые проходы, сделанные с интерфейсом, терпят неудачу после запроса DSN. Никакой ремонт невозможен, их нужно восстанавливать, чтобы вызывать связанные таблицы и запускать их через JET.

strConnect = "ODBC;DATA SOURCE=instkeeper_test;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

strConnect = "ODBC;DRIVER=SQL Server;SERVER=ENV980-067\ENVIRON_TEST;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).

strConnect = "ODBC;DRIVER=SQL Server;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;"

Результат: ошибка времени выполнения ODBC — вызов не выполнен (ошибка № 3146).


person Comrad_Durandal    schedule 08.08.2011    source источник
comment
1. Приведите наш вопрос в порядок, чтобы он не превратился в один длинный абзац. 2. Добавьте то, что вы пробовали (например, вы упомянули CHECKIDENT в комментарии, но не указали в вопросе... и понизили меня за это) 3. Что касается комментария, сообщите нам как вы хотите это запустить: не это не работает   -  person gbn    schedule 08.08.2011
comment
Ваше право - я отредактировал его, чтобы отразить это.   -  person Comrad_Durandal    schedule 08.08.2011


Ответы (3)


На стороне SQL Server вы можете

  1. Используйте другую команду DBCC.

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. Или используйте TRUNCATE TABLE...

Если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается до начального значения, определенного для столбца. Если начальное значение не было определено, используется значение по умолчанию 1.

Итак, вы бы побежали

TRUNCATE TABLE MyTable
person gbn    schedule 08.08.2011
comment
Команда DBCC не работает, так как я пробовал и команду checkident. TRUNCATE также не может быть запущен в этом контексте, так как я получаю «Неверный оператор SQL (ошибка № 3129)», когда это делается программно. Ни один из этих вариантов не работает, извините. - person Comrad_Durandal; 08.08.2011
comment
Я знаю, что они работают... так что вы делаете не так? Убедитесь, что они работают в инструментах SQL Server, а затем узнайте, почему они не работают в Access. И приведите в порядок свой вопрос, чтобы он был более читабельным... - person gbn; 08.08.2011
comment
@Comrad_Durandal: еще больше: это команды SQL Server, а не команды Jet. Меня не волнует, что говорит Джет. Их следует запускать на сервере или как сквозные запросы, а не к связанным таблицам. - person gbn; 08.08.2011
comment
Они работают, но только из консоли управления. Я отредактировал свой вопрос, чтобы отразить это (вы правы, я назвал это шатким и попытался пересмотреть его, чтобы он имел больше смысла), а также, надеюсь, предоставить больше информации. - person Comrad_Durandal; 08.08.2011
comment
+1 за идею с проходом - видите, я этого не знал. Я понял, что не могу DROP или ALTER связанные таблицы, но я не знал, что не могу просто отправить необработанную команду SQL на сервер с помощью DoCmd.RunSQL. Я посмотрю на проходы, посмотрю, как их использовать. - person Comrad_Durandal; 08.08.2011

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

Следующая строка подключения после исправления заработала:

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

Это позволило мне выполнить команду TRUNCATE TABLE для удаленной таблицы и выполнить инструкцию DoCmd.RunSQL для повторного заполнения таблицы из производственного источника.

Конечным результатом является то, что при выборе параметра для обновления действия оно очищает содержимое удаленной таблицы, а затем считывает содержимое рабочей таблицы в тестовую таблицу для использования при сбросе автонумерации.

person Comrad_Durandal    schedule 09.08.2011

Я нашел простой способ сделать это с помощью SQL-запроса, написанного в Access, в SQL View!

Проверьте это по адресу: http://answers.microsoft.com/en-us/office/forum/office_2003-access/reset-autonumber-in-access-table-automatically/66cbcfed-5cbe-40f6-b939-9aea8bbea2de

Напишите это:

ALTER TABLE YourTable ALTER COLUMN YourField COUNTER(1,1)

person Cauê Sauter Guazzelli    schedule 19.07.2013