我正在尝试使用dbdeploy来管理 Oracle 架构更改。我可以从命令行成功运行它以生成我的更改脚本,但是当我尝试通过通过 TeamCity 运行的 dbdeploy NAnt 任务执行它时,我收到一个错误:
System.Data.OracleClient 需要 Oracle 客户端软件 版本 8.1.7 或更高版本。
我确实安装了 Oracle 10.2.0.2 客户端软件。它是系统路径中的第一个条目,dbdeploy.exe 应用程序能够成功协商 Oracle 连接。dbdeploy 代码动态加载 System.Data.OracleClient 程序集,该程序集又尝试使用 Oracle 客户端位与数据库通信。这就是我的 NAnt 环境中失败的原因。
我已经验证了以下几点:
- 在这两种情况下,相同的用户身份正在运行该进程
- 两种情况都使用相同的工作目录
- 在这两种情况下运行相同的 dbdeploy 代码并使用相同的提供参数
- 在这两种情况下都使用相同的数据库连接字符串
- 在两种情况下都动态加载相同的 ADO.NET 程序集(System.Data.OracleClient,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089)
这是错误期间堆栈跟踪的顶部:
在 System.Data.OracleClient.OCI.DetermineClientVersion() 在 System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction (字符串用户名,字符串密码,字符串服务器名, Boolean IntegratedSecurity、Boolean unicode、Boolean omitOracleConnectionName) 在 System.Data.OracleClient.OracleInternalConnection..ctor( OracleConnectionString 连接选项) 在 System.Data.OracleClient.OracleConnectionFactory.CreateConnection( DbConnectionOptions 选项,对象 poolGroupProviderInfo, DbConnectionPool 池,DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection( DbConnection owningConnection、DbConnectionPool 池、 DbConnectionOptions 选项) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject( DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest( DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionPool.GetConnection( DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection( DbConnection 拥有连接) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection( DbConnection externalConnection, DbConnectionFactory connectionFactory) 在 System.Data.OracleClient.OracleConnection.Open() 在 Net.Sf.Dbdeploy.Database.DatabaseSchemaVersionManager。 GetCurrentVersionFromDb()
我的主要问题是:我如何才能发现这些运行环境的不同之处,以了解为什么我的 Oracle 客户端软件无法加载?