Взаимодействие с MS Access — импорт данных

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

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

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

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

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

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

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

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

Редактировать:

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

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

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

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

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


person Jake Ginnivan    schedule 02.04.2009    source источник


Ответы (4)


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

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

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

person dkretz    schedule 02.04.2009
comment
Я только что отредактировал свой вопрос, процесс должен быть автоматизирован из хранимой процедуры. Кроме того, VBA использует взаимодействие доступа, которое, по-видимому, очень ограничено по сравнению с Outlook/Excel, поэтому все, что делает VBA, я должен иметь возможность делать через взаимодействие Com. Промежуточная таблица, которую я могу выполнить с помощью nolock, я думаю? - person Jake Ginnivan; 02.04.2009
comment
Если под взаимодействием вы имеете в виду то, что я думаю, вы имеете в виду, а именно DoCmd, в основном вызывающий Access Querydefs, макросы и элементы меню, тогда Access VBA делает гораздо больше - я никогда не находил DoCmd полезным. Еще одно сомнительное предложение — использовать Cursor в SQL для выполнения экземпляров Access. Я правильно это понимаю? - person dkretz; 02.04.2009
comment
Я помогу вам сделать это так, как вам нужно, но мне нужно понимать контекст и причины вещей. - person dkretz; 02.04.2009
comment
Кроме того, вы упоминаете DTS. Какая версия SQL Server? Я полагаю, что нет SSIS? - person dkretz; 02.04.2009
comment
Это один SP для каждого клиента или один SP в целом с записью конфигурации для каждого клиента или что? - person dkretz; 02.04.2009
comment
Спасибо за вашу помощь, я написал более подробное объяснение, почему я делаю это именно так. - person Jake Ginnivan; 03.04.2009

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

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

person user86257    schedule 03.04.2009
comment
Ах да, я тоже запустил это, но некоторые таблицы, которые мы экспортируем, возвращают более 1 миллиона строк (есть одна, которая возвращает около 6 миллионов), поэтому этот метод слишком медленный. - person Jake Ginnivan; 06.04.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#

person Jake Ginnivan    schedule 06.04.2009

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

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

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

person John Saunders    schedule 06.04.2009