database - 作为服务运行时 OleDbConnection.Open 的问题

标签 database ssh nant oledb ado

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

错误信息:

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.

堆栈跟踪:

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,发现有几起事件,但它们与构建脚本的每次执行都不相关。
  • 我安装了 native OleDb providers对于 SQL Server 2008,出现同样的错误。

有没有人对我如何追查此问题的根本原因有任何建议?这似乎真的与代码在服务的上下文中运行有关。我已经使用 Procmon 来尝试跟踪整个执行过程,但我没有找到罪魁祸首。提前致谢!

最佳答案

我还有“.Net Framework 数据提供程序需要 Microsoft 数据访问组件 (MDAC)。请安装 Microsoft 数据访问组件 (MDAC) 2.6 或更高版本。”尝试通过 ssh 调用我的 Windows 程序时出错,但在服务器 (Windows Server 2008 R2 Enterprise) 的 cygwin 终端中直接运行相同程序时出错。我确信这可以在 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 下。

关于database - 作为服务运行时 OleDbConnection.Open 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735922/

相关文章:

java - 如何从 Maven 调用 Nant 脚本?

.net - 安装 ASP.NET 2.0 SDK 后,NAnt 在 Windows Server 2008 上构建失败

.net - NuGet 应该用作构建自动化工具吗?

amazon-web-services - 使用 powershell 对 AWS EC2 的 ssh 登录失败进行故障排除

php - Magento 1.1.2 在数据库中哪里存储订单?

mysql - 将实时数据库复制到开发服务器

mysql - 如何根据某些条件将结果分组为串联结果

mysql - 插入这些数据最快的方法是什么

linux - 从多个 shell 命令的输出创建一行

通过 ssh 调用 write()