我们有一个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()
在花了很多时间试图追查原因之后,我被困住了。以下是我所做的一些观察:
有没有人就如何找出这个问题的根本原因提出任何建议?它似乎与代码在服务上下文中运行的事实有关。我用Procmon试图追查执行情况,但我没有找到任何运气找到罪魁祸首。提前谢谢!
答案 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文件中。
希望得到这个帮助。