代码之家  ›  专栏  ›  技术社区  ›  Page

OleDbConnection.Open作为服务运行时出现问题

  •  3
  • Page  · 技术社区  · 16 年前

    我们有一个通过ssh运行的nant构建脚本 (cygwin和open ssh) 远程升级我们的数据库。当通过ssh会话启动nant脚本时,当它尝试进行数据库连接时会引发以下错误。但是,如果我直接登录到服务器 (使用与服务相同的帐户) 手工运行南特脚本,成功执行。

    错误消息:

    System.InvalidOperationException: .NET Framework数据提供程序要求 微软数据库访问 组件(mdac)。请安装 Microsoft数据访问组件(MDAC) 2.6或更高版本。 --->system.io.fileNotFoundException:检索的COM类工厂 具有clsid的组件 2206CB2-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服务器上执行。我不认为mdac会是这里的一个问题,因为异常表明
    • One site states 这可能与uphclean有关(它是WindowsServer2008中用户配置文件服务的一部分)。我还没能确认这确实是问题所在。我在事件查看器中查找了事件ID 1530,有一些事件发生,但它们与构建脚本的每个执行都不相关。
    • 我安装了 native OleDb providers 对于SQL Server 2008,会发生相同的错误。

    有人对我如何追踪这个问题的根本原因有什么建议吗?它实际上似乎与代码在服务上下文中运行这一事实有关。我用procmon来追踪执行过程,但我没找到罪犯。事先谢谢!

    3 回复  |  直到 16 年前
        1
  •  2
  •   snark    13 年前

    我还拥有“.NET框架数据提供程序需要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下。

        2
  •  1
  •   Page    16 年前

    这个问题肯定与cygwin+openssh有关。我最后安装了 WinSSHD 我的问题解决了。因此,为了将来参考,请注意在WindowsServer2008上运行的cygwin+openssh。希望这有帮助!

        3
  •  0
  •   BartmanDilaw    12 年前

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

    我已经添加了

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

    在/etc/profile文件中。

    希望能帮上忙。