Проблема с OleDbConnection.Open при запуске в качестве службы - PullRequest
3 голосов
/ 17 сентября 2010

У нас есть скрипт сборки Nant, который мы запускаем через SSH (Cygwin & Open SSH) для удаленного обновления наших баз данных. Когда сценарий Nant запускается через сеанс SSH, при попытке подключения к базе данных выдается следующая ошибка. Тем не менее, если я войду на сервер напрямую (используя ту же учетную запись, что и служба) и вручную выполню сценарии Nant, сценарий будет успешно выполнен.

Сообщение об ошибке:

System.InvalidOperationException: Поставщики данных .Net Framework требуют Microsoft Data Access Компоненты (MDAC). Пожалуйста, установите Компоненты доступа к данным Microsoft (MDAC) версия 2.6 или новее. ---> System.IO.FileNotFoundException: получение фабрики класса COM для компонент с CLSID {} 2206CDB2-19C1-11D1-89E0-00C04FD7A829 не удалось из-за следующей ошибки: 8007007e.

Трассировка стека:

System.InvalidOperationException: The .Net Framework Data Providers require Microsoft Data Access Components(MDAC). Please install Microsoft Data Access Components(MDAC) version 2.6 or later.
---> System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {2206CDB2-19C1-11D1-89E0-00C04FD7A829} failed due to the following error: 8007007e.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Data.OleDb.OleDbConnectionInternal.CreateInstanceDataLinks()
at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
--- End of inner exception stack trace ---
at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at UpgradeDatabases.UpgradeDatabase.Execute()

Потратив много времени на поиски причины, я застрял. Вот некоторые наблюдения, которые я сделал:

  • Скрипт отлично работает, когда я запускаю его вручную на той же машине (без SSH). Я даже могу запустить скрипт вручную с тем же пользователем, под которым работает служба SSH.
  • Поскольку скрипт Nant выполняется в контексте службы, проблема, похоже, связана с профилем пользователя.
  • Сценарий выполняется на Windows 2008 Server с установленным .NET 3.5. Я не предполагаю, что MDAC будет проблемой здесь, поскольку исключение указывает
  • Один сайт заявляет , что он может быть связан с UPHClean (который является частью службы профилей пользователей в Windows Server 2008). Я не смог подтвердить, что это на самом деле проблема. Я посмотрел в Event Viewer для Event ID 1530 и есть несколько случаев, но они не коррелируют с каждым выполнением сценария сборки.
  • Я установил собственных поставщиков OleDb для SQL Server 2008, и возникает та же ошибка.

У кого-нибудь есть совет, как я могу отследить причину этой проблемы? Похоже, это действительно связано с тем, что код выполняется в контексте службы. Я использовал Procmon, чтобы попытаться отследить казнь, но мне не повезло найти виновника. Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 21 декабря 2012

У меня также было «Поставщикам данных .Net Framework требуются компоненты доступа к данным Microsoft (MDAC). Пожалуйста, установите компоненты доступа к данным Microsoft (MDAC) версии 2.6 или новее». ошибка при попытке вызвать мою программу Windows через ssh, но не при запуске той же программы непосредственно в терминале cygwin на сервере (Windows Server 2008 R2 Enterprise). Я был уверен, что это можно сделать, используя openssh в cygwin. В конце концов я обнаружил, что это можно заставить работать, если вы отправили следующую переменную окружения в вызове ssh:

CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files

Так что, если вы вошли в систему так:

$ ssh myuser@myserver -o SendEnv='CommonProgramFiles(x86)'

Тогда вы сможете успешно запустить вашу программу. Обратите внимание, что предполагается, что вы уже настроили sshd на сервере для принятия переменной среды. Вы можете сделать это, добавив следующую строку в / etc / sshd_config и затем перезапустив sshd (net stop sshd с последующим net start sshd):

AcceptEnv CommonProgramFiles(x86)

При установке AccessDatabaseEngine.exe (ядро базы данных Microsoft Office Access 2007) (загрузите его с http://www.microsoft.com/en-us/download/confirmation.aspx?id=23734)) некоторые файлы помещаются в C: \ Program Files (x86) \ Common Files.

1 голос
/ 21 сентября 2010

Проблема была определенно связана с Cygwin + OpenSSH. В итоге я установил WinSSHD , и моя проблема была решена. Поэтому для дальнейшего использования будьте осторожны с Cygwin + OpenSSH, работающим на Windows Server 2008. Надеюсь, это поможет!

0 голосов
/ 15 мая 2014

Та же проблема в Windows 7 + OpenSSH (OpenSSH_6.5p1, OpenSSL 1.0.1f 6 января 2014 г.) при запуске программы C #, соединяющей базу данных Access.

Я добавил

export CommonProgramFiles="C:\Program Files\Common Files"

в файле / etc / profile.

Надеюсь, это поможет.

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