【问题标题】:Issue with OleDbConnection.Open when Running as a Service作为服务运行时 OleDbConnection.Open 出现问题
【发布时间】: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


    【解决方案1】:

    我还有“.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 下。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我已经添加了

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

      在 /etc/profile 文件中。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 1970-01-01
        • 2012-09-15
        • 2011-09-25
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多