【发布时间】:2010-09-17 13:55:15
【问题描述】:
我们有一个 Nant 构建脚本,我们通过 SSH (Cygwin & Open SSH) 运行它来远程升级我们的数据库。通过 SSH 会话启动 Nant 脚本时,在尝试建立数据库连接时会引发以下错误。但是,如果我直接登录到服务器(使用与服务相同的帐户)并手动运行 Nant 脚本,脚本将成功执行。
错误信息:
System.InvalidOperationException: .Net Framework 数据提供者需要 微软数据访问 组件(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 脚本在服务上下文中运行,因此问题似乎与用户配置文件有关。
- 脚本在安装了 .NET 3.5 的 Windows 2008 Server 上执行。我不认为 MDAC 在这里会成为问题,因为异常表明
- One site states 它可能与 UPHClean(它是 Windows Server 2008 中用户配置文件服务的一部分)有关。我无法确认这实际上是问题所在。我在事件查看器中查看了事件 ID 1530,并且出现了一些情况,但它们与构建脚本的每次执行无关。
- 我为 SQL Server 2008 安装了native OleDb providers,但出现了同样的错误。
对于我如何追查此问题的根本原因,是否有人有任何建议?这似乎与代码在服务上下文下运行的事实有关。我已经使用 Procmon 试图追踪执行过程,但我没有找到罪魁祸首。提前致谢!
【问题讨论】:
标签: database ssh nant oledb ado