MS Access Interop - импорт данных - PullRequest
2 голосов
/ 02 апреля 2009

Я работаю над exe для экспорта SQL в Access, мы не хотим использовать DTS, так как у нас есть несколько клиентов, каждый из которых экспортирует разные представления, и накладные расходы на установку и обслуживание пакетов DTS слишком велики.

* Редактировать: этот процесс автоматизируется для многих клиентов каждую ночь, поэтому весь процесс должен запускаться и управляться внутри курсора в хранимой процедуре. Это связано с тем, что данные должны быть отфильтрованы для каждого проекта для экспорта.

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

doCmd.TransferDatabase(Access.AcDataTransferType.acImport...

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

Можно ли как-нибудь предотвратить появление этого сообщения или увеличить время ожидания команды импорта?

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

Рад за любые предложения, как решить эту проблему.

Edit:

Дополнительная информация о том, что я делаю:

У нас есть несколько клиентов, каждый из которых имеет стандартную модель данных. Одним из «модулей» является экспортер доступа (sproc). Он читает представления для экспорта из таблицы параметров, а затем экспортирует. Представления фильтруются по проекту, и для каждого проекта создается файл доступа (каждое представление имеет поле проекта)

Мы работаем с SQL 2005 и не переходим к SQL 2005 быстро, вероятно, мы перейдем к 2008 через несколько месяцев.

Затем у нас есть задание на выполнение модуля, которое выполняет настроенный модуль для каждой базы данных. Существует много заданий импорта / экспорта / других заданий, которые выполняются при выполнении этого модуля, и экспортер доступа должен иметь возможность вписываться в эту среду. Поэтому мне нужен универсальный экспортер SQL -> Access, который можно настроить с помощью нашей структуры параметров.

В настоящее время sproc вызывает exe-файл, который я написал, и мой exe открывает доступ через interop, я знаю, что это плохо для сервера, НО выполнение модуля написано, поэтому одновременно выполняется только один модуль, поэтому процедура никогда не будет выполнена. запускать более одного экземпляра одновременно.

Ответы [ 4 ]

1 голос
/ 03 апреля 2009

Мы сделали это, используя ADO для подключения к исходным и целевым данным. При необходимости вы можете установить значения времени ожидания соединения и команды и прочитать / добавить к каждому набору записей.

Не особенно быстро, но мы смогли оставить его включенным на ночь

1 голос
/ 06 апреля 2009

Я нашел способ сделать это.

http://support.microsoft.com/kb/317114 описывает основные шаги для запуска процесса доступа.

Я сделал Process переменной класса вместо локальной переменной метода ShellGetApp. Таким образом, когда я вызываю функцию Quit для доступа, если она не закрывается по какой-либо причине, я могу явно завершить процесс.

app.Quit(Access.AcQuitOption.acQuitSaveAll);
if (!accessProcess.HasExited)
{
    Console.WriteLine("Access did not exit after being asked nicely, killing process manually");
    accessProcess.Kill();
}

Затем я использовал здесь функцию тайм-аута метода, чтобы дать тайм-ауту вызова доступа. Если время ожидания истекло, я могу также завершить процесс доступа (время ожидания может быть связано с появлением диалогового окна, и я не хочу, чтобы процесс зависал навсегда. У меня есть метод тайм-аута здесь.

Реализация общего тайм-аута C #

1 голос
/ 02 апреля 2009

Вы пробовали использовать VBA? У вас есть больше возможностей для настройки соединений, и я уверен, что в прошлом я использовал настройку тайм-аута в этом контексте.

Кроме того, я обычно считаю, что проще всего просто запросить представление напрямую (если вы можете либо соединиться с nolock, либо терпеть, сколько времени потребуется для передачи); это может быть хорошей причиной для создания промежуточной временной таблицы.

Для этого материала также может быть полезно открывать Acces явно в однопользовательском режиме.

0 голосов
/ 06 апреля 2009

Я рад, что у вас есть решение, которое работает для вас. В интересах других, читающих это, я упомяну, что SSIS был бы возможным решением этой проблемы. Обратите внимание, что разница между службами SSIS и DTS довольно велика, днем ​​и ночью.

Нетрудно параметризовать процесс экспорта, так что для каждого клиента вы можете экспортировать свой набор представлений. Вы можете зациклить строки текстового файла с именами представлений в нем или использовать запрос к базе данных конфигурации, чтобы получить список представлений. Другие параметры могут поступать из той же базы данных конфигурации, для каждого клиента и / или для каждого просмотра.

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

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