oronsultan Ответов: 1

Не удалось получить фабрику COM-класса для компонента с CLSID {00024500-0000-0000-C000-000000000046}. Ошибка: класс 80040154 не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).


Эй ребята,
Я постарался максимально обобщить это, заранее прошу прощения за объем текста.
Мне нужна ваша помощь в решении проблемы, которую мы пытались решить в течение последних нескольких дней.
Итак, история такова:
мы написали консольное приложение, которое извлекает большой объем данных из базы данных sql server и возвращает их в виде таблицы данных.
Exe-файл генерирует файл Excel с помощью библиотеки dll microsoft под названием Microsoft.Офис.Взаимодействие.Excel.dll и вставляет все данные из базы данных.
Этот Excel сохраняется в определенном пути в файловой системе и в конечном итоге отправляется в список получателей.
Мои игроки являются следующие:
- Сервер IIS, на котором установлено консольное приложение (назовем его просто thziis)
- Sql-сервер, на котором находится база данных (dahhh) (давайте просто назовем сервер "thzSql")
Теперь самое главное - exe включен следующим образом:
По деловым соображениям мы запускаем этот процесс только тогда, когда запись входит в определенную таблицу в базе данных.
Поэтому мы создали триггер insert, который прослушивает ту же таблицу. Когда вводится новая запись,
он запускает задание в sql (которое не запланировано), и задание вызывает exe (CmdExec).
Так в чем же именно заключается проблема?
Когда процесс выполняется так, как я описал сейчас, мы получаем следующую ошибку:
Получение фабрики COM-класса для компонента с CLSID {00024500-0000-0000-C000-000000000046}
сбой произошел из-за следующей ошибки:
80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Согласно трассировке стека, процесс потерпел неудачу при попытке создать экземпляр файла excel:
Трассировка стека:
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at ViolationsExcelMail.BL.ExcelGenerator.CreateExcel()
Однако, когда мы отключаем триггер и вручную запускаем exe (дважды щелкните на самом exe), процесс работает правильно и без проблем.
После того, как мы тщательно изучили вопрос, поняли, что в настройки DCOM (Dcomcnfg.exe &ГТ; корень консоли > в сервисной составляющей и GT; компьютеры &ГТ; Мой компьютер &ГТ; настройка DCOM)
Там должна быть следующая строка: приложение Microsoft Excel.
На этом этапе мы начали проверять настройки одной и той же строки и теперь знаем, что есть определение, которое говорит об этом:
"Какую учетную запись пользователя вы хотите использовать для запуска этого приложения?"
мы выбрали запускающего пользователя (и только после этого процесс прошел вручную. До этого он всегда терпел неудачу).
Нам нужно знать, как решить эту проблему, чтобы процесс мог работать оригинальным способом и автоматически, в соответствии с вызовом триггера.
Кроме того, мы подчиняемся правилам, которые ограничивают нас от выполнения установок на sql server, так что microsoft office не может быть установлен на этом сервере,
у нас есть офис только на сервере iis.
Любое предложение или идея приветствуются, мы будем вам очень признательны. Большое вам спасибо за чтение.

Что я уже пробовал:

Мы попытались regsvr32 DLL через CMD без успеха, даже с правами администратора.

Мы попытались установить приложение conole на sql server, чтобы оно работало оттуда, и мы столкнулись бы с той же ошибкой (как и ожидалось)

Мы попытались запустить задание, которое вызывает exe - файл со всеми возможными разрешениями (включая самые высокие) - безуспешно.

F-ES Sitecore

Excel-это настольное приложение, оно не предназначено для автоматизации из служб, которые не имеют доступа к рабочему столу (что вы и делаете).

Вам нужно забыть об использовании Excel по слишком многим причинам, чтобы перечислять, это настольное приложение, а не сервис. Используйте что-то еще для управления файлами Excel, подходящими для автоматизации, например драйвер ODBC\OleDb или одно из различных сторонних приложений, которые делают это.

1 Ответов

Рейтинг:
10

Richard Deeming

Цитата:
microsoft office не может быть установлен на этом сервере
Вы не можете автоматизировать Microsoft Office, если он не установлен.

Кроме того, вы не можете использовать Office Interop из неинтерактивного приложения, включая SQL Server и ASP.NET:
В настоящее время корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого автоматического, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и/или взаимоблокировку при запуске Office в этой среде.

Существуют различные способы создания электронных таблиц Excel и управления ими на сервере без использования Office. Например:

Хорошая новость заключается в том, что ни одно из этих решений не потребует от вас установки и лицензирования Office ни на одном из серверов.


oronsultan

Дорогой Ричард, большое вам спасибо за быстрый ответ (и извините за мой поздний ответ). Мы решили пойти с вашим первым решением, Эпплус. Удивительное решение. Не было никакой необходимости в какой-либо установке на каком-либо сервере, и Отличники выглядят просто замечательно (дизайн, графики и т.д.). Еще раз большое вам спасибо!