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