我已经在这个问题上工作了几个星期了,而且我非常沮丧。因此,我会尽我所能提供所有信息并希望最好。
我的团队正致力于构建新的应用程序。这是字母汤:
我正在将应用程序编译为32位应用程序,并且我已确认已安装32位版本的Oracle。
我们为NHibernate映射编写了一些测试,我们通过MSTest运行。当我们通过Visual Studio的测试资源管理器运行它们时,它们都正常运行并通过。应用程序本身也可以正确编译和部署。我们通过在步骤之间检查数据库来验证测试是否正常运行,因此我们非常确定测试本身并不是问题所在。
当我们通过命令行运行MSTest时,我们收到以下错误:
初始化方法MyTests.Setup抛出异常。 NHibernate.HibernateException:NHibernate.HibernateException:无法从NHibernate.Driver.OracleDataClientDriver创建驱动程序。 ---> System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.ArgumentException:无法找到请求的.Net Framework数据提供程序。它可能没有安装..
我尝试重新安装Oracle无效。我已经尝试检查machine.config文件是否有错误(正如SO上的其他帖子所示)并且没有找到。
我们的Fluent配置如下:
OracleDataClientConfiguration.Oracle10
.ConnectionString(connectionString)
.Driver("NHibernate.Driver.OracleDataClientDriver")
.ShowSql()
.FormatSql();
我在命令行上运行的代码如下:
(cd to the directory where the test .dll is)
>"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest.exe" /testcontainer:MyTests.dll /test:UnitTests
我觉得我在这里遗漏了一些东西。有什么想法吗?
更新:找到解决方案
所以这是一个奇怪的。我按照下面的Fran的解决方案安装了Oracle.ManagedDataAccess包,并将上面配置中的NHibernate驱动程序更改为NHibernate.Driver.OracleManagedDataClientDriver。根据我们的快速评论讨论,这会导致新的错误:
初始化方法MyTests.Setup抛出异常。 NHibernate.HibernateException:NHibernate.HibernateException:无法从NHibernate.Driver.OracleManagedDataClientDriver创建驱动程序。 ---> System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Configuration.ConfigurationErrorsException:无法找到或加载已注册的.Net Framework数据提供程序
Fran然后引导我another SO question,鼓励我逐个检查Oracle配置。有什么比创建测试更好的方法?
var x = new OracleConnection(connectionString);
x.Open();
Assert.IsTrue(x.State == System.Data.ConnectionState.Open);
x.Close();
Assert.IsFalse(x.State == System.Data.ConnectionState.Open);
在我快速尝试运行此测试时,我使用上面提到的脚本运行了整个UnitTests集合。低,看,每次测试都通过! 尽职尽责,尝试以下
出于某种原因,新驱动程序的组合以及在测试中明确引用它似乎已经解决了这个问题。我对任何理论都持开放态度,但我敢打赌这可以作为一个新问题。
答案 0 :(得分:2)
我将停止使用oracle驱动程序的位特定版本并转移到托管驱动程序(https://www.nuget.org/packages/Oracle.ManagedDataAccess/)。它有点不可知,并且根本不需要您安装Oracle客户端。
答案 1 :(得分:1)
我实际上找到了问题的解决方案,这一切都与Oracle.DataAccess.dll
文件在运行时加载的方式有关(披露:我在同一个项目中使用wadeb)。
似乎正在服务器上的每个位置搜索Oracle.DataAccess.dll,除了 Jenkins工作区中的构建输出文件夹,因此从GAC中提取DLL文件。
用于查找DLL文件的文件路径之一是"当前可执行文件"位于。在我们的例子中,"当前可执行文件"是mstest.exe
。将Oracle.DataAccess.dll文件复制到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
就可以了。
它有效吗?是。
是黑客吗?绝对 - 但现在无需升级到托管Oracle驱动程序即可运行。
我们的服务器没有使用与托管驱动程序一起使用的Oracle客户端,在服务器升级之前,连续集成构建中断是不可接受的。
答案 2 :(得分:0)