运行即服务时OleDbConnection.Open问题

时间:2010-09-17 13:55:15

标签: database ssh nant oledb ado

我们有一个Nant构建脚本,我们通过SSH (Cygwin& Open SSH)运行,以远程升级我们的数据库。通过SSH会话启动Nant脚本时,尝试建立数据库连接时会引发以下错误。但是,如果我直接登录服务器(使用与服务相同的帐户)并手动运行Nant脚本,脚本将成功执行。

错误消息:

  

System.InvalidOperationException:The   .Net框架数据提供商要求   Microsoft数据访问   组件(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中的User Profile Service的一部分)有关。我无法确认这实际上是问题所在。我在事件查看器中查找了事件ID 1530并且发生了一些事件,但它们与构建脚本的每次执行都没有关联。
  • 我为SQL Server 2008安装了native OleDb providers,并发生了同样的错误。

有没有人就如何找出这个问题的根本原因提出任何建议?它似乎与代码在服务上下文中运行的事实有关。我用Procmon试图追查执行情况,但我没有找到任何运气找到罪魁祸首。提前谢谢!

3 个答案:

答案 0 :(得分:2)

我还有“.Net Framework数据提供程序需要Microsoft数据访问组件(MDAC)。请安装Microsoft数据访问组件(MDAC)2.6或更高版本。”尝试通过ssh调用我的Windows程序时出错,但是在服务器上的cygwin终端(Windows Server 2008 R2 Enterprise)中直接运行相同的程序时却没有错误。我确信这可以在cygwin中使用openssh工作。最后,我发现如果你在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 :(得分:1)

这个问题肯定与Cygwin + OpenSSH有关。我最终安装了WinSSHD,我的问题得到了解决。因此,为了将来参考,请注意在Windows Server 2008上运行的Cygwin + OpenSSH。我希望这有帮助!

答案 2 :(得分:0)

在运行连接Access数据库的C#程序时,Windows 7 + OpenSSH(OpenSSH_6.5p1,OpenSSL 1.0.1f 2014年1月6日)上的相同问题。

我添加了

export CommonProgramFiles="C:\Program Files\Common Files"
在/ etc / profile文件中

希望得到这个帮助。