Заставьте SET IDENTITY_INSERT быстрее действовать из MS Access - PullRequest
2 голосов
/ 08 августа 2011

Я работаю над повышением размера набора базовых баз данных MS Access до SQL Server.Я написал сценарий SQL для создания схем таблиц в SQL Server.Сейчас я пытаюсь заполнить таблицы.Большинство таблиц имеют первичные ключи автонумерации.Вот мой общий подход:

For each TblName in LinkedTableNames
    'Create linked table "temp_From" that links to the existing mdb'
    'Create linked table "temp_To" that links to the new SQL server table
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " ON"
    db.Execute "INSERT INTO temp_To SELECT * FROM temp_From", dbFailOnError
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " OFF"
Next TblName

Первая вставка происходит немедленно.Последующие попытки вставки завершаются неудачно с ошибкой: «Невозможно вставить явное значение для столбца идентификаторов в таблице« TblName », если для параметра IDENTITY_INSERT задано значение OFF.»

Я добавил оператор Resume для этой конкретной ошибки, а также таймер.Получается, что ошибка продолжается ровно 600 секунд (десять минут), а затем вставка проходит успешно.

MS Access автоматически обновляет свои сеансы ODBC каждые 10 минут?Есть ли способ заставить это произойти быстрее? Я что-то упускаю из виду?

Справочная информация для тех, кто сразу захочет сказать «Использовать мастер увеличения»:
Я не пользуюсь встроенным мастером увеличения, потому что мне нужно иметь возможность писать сценарий всей операции от начала до конца.Цель состоит в том, чтобы запустить его в тестовой среде перед запуском коммутатора в расположении клиента.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я нашел ответ на свой первый вопрос. Десять минут - это параметр, скрытый в реестре под ключом Jet engine:

'Jet WinXP/ Win7 32-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout

'Jet Win7 64-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout

'ACE WinXP/ Win7 32-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Access Connectivity Engine\Engines\ODBC\ConnectionTimeout

'ACE Win7 64-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MicrosoftAccess Connectivity Engine\Engines\ODBC\ConnectionTimeout

Здесь задокументировано для ACE:

ConnectionTimeout : количество секунд, в течение которых кэшированное соединение может оставаться бездействующим до истечения времени ожидания. По умолчанию используется значение 600 (значения имеют тип REG_DWORD).

Для этой клавиши было установлено значение по умолчанию 600. Это 600 секунд или 10 минут. Я уменьшил это до десяти секунд, и код ускорился соответственно.

Это ни в коем случае не полное решение, потому что установка этого значения по умолчанию обязательно вызовет проблемы в других местах. Фактически, Тони Тойс однажды рекомендовал , чтобы по умолчанию лучше было увеличено при использовании соединений без DSN.

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

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

Две мысли, хотя не уверен, что любая из них будет полезна, потому что это незнакомая для меня территория.

" MS Access автоматически обновляет свои сеансы ODBC каждые 10 минут? Есть ли способ заставить это произойти быстрее? Я что-то упускаю из виду? "

В диалоговом окне «Параметры Access 2003» на вкладке «Дополнительно» есть параметр «Интервал обновления ODBC», а также параметры для повторных попыток. Помогают ли эти настройки ... или имеют какой-либо эффект?

Интересно, не могли бы вы избежать этой проблемы, создавая столбцы SQL Server в виде простых чисел, а не в виде числа, ВСТАВЛЯЙТЕ свои данные, затем ALTER TABLE ... ALTER COLUMN, чтобы изменить их после вставки данных.

Доступ не позволит мне преобразовать числовой столбец в автономное число, если таблица содержит данные, но ISTR SQL Server более гибок в этом отношении.

...