Access & SQL-Server: сброс поля Autonumber с помощью таблицы протирания - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь синхронизировать копию таблицы активности между таблицей 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).

Итак, для краткой сводки:

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

- отредактировано 08/08/2011 @ 15:08 -

хорошо- Я предпринял несколько попыток выполнить сквозной запрос на основе VBA, все из которых привели к ошибке ODBC - ошибка вызова.Вот код для модуля, который я создал для обработки сквозных переходов (заимствованный код от 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)

Ответы [ 3 ]

1 голос
/ 08 августа 2011

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

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

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. Или используйте СТОЛ TRUNCATE ...

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

Так вы бы запустили

TRUNCATE TABLE MyTable
0 голосов
/ 19 июля 2013

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

Проверьте его по адресу: 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)

0 голосов
/ 10 августа 2011

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

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

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

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

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

...