Oracle Instant Client和Entity Framework在配置方面存在问题
我正在尝试学习并弄清楚是否可以将MVC,EF,ODAC 11.2.0.3应用程序部署到安装了先前版本的ODP.NET的服务器上。 我认为我可以使用Oracle Instant Client,而不是更新服务器ODP.NET(我不能)。
这可行吗?
1)我将这些dll添加到我的项目中以支持Instant Client
-Oracle.DataAccess.dll
-oci.dll
-ociw32.dll
-orannzsbb11.dll
-oraociei11.dll
-OraOps11w.dll
2)接下来我更新了dbProviderFactories的web.config
3)这个(afaik)是如何在bin rathre中使用Oracle dll而不是GAC
4)最后我的connectionString
这是我收到的错误无法找到请求的.Net Framework数据提供程序。 它可能没有安装。
我真的很感激这里的任何帮助。 我很新,有很多东西需要学习。 提前致谢。 干杯
在Web配置的
元素中添加
部分,以删除任何现有的Oracle提供程序。 (在
之前)
从您的问题看来,您需要仅使用xcopy部署权限将更新部署到您的应用程序和新版本的ODP.net。
由于您的应用程序正在更改,因此您不应该需要程序集绑定更改或DbProviderFactories。 只需使用edmx等更新类库的csproj,即可获得对新ODP.net版本的引用,例如
如果您的tnsnames.ora出现问题,则必须执行以下操作之一:a)添加系统环境变量TNS_ADMIN以指向tnsnames.ora的目录,或b)将连接字符串更改为某些内容基于:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
c)看看你是否可以在其他地方放置tnsnames.ora的副本。
这是我的Xcopy解决方案。
我发布了它
( https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181 )
同样。
但我想我可以在这里发布我的xml而没有格式化问题。
Nuget“packages.config”
的app.config
(注意下面的
标签。这可能需要也可能不需要,但我认为最好清除它们,因为你不知道machine.config文件中可能包含的内容)
我正在使用x64 Windows 7计算机进行开发。
我下载了:ODAC1120320Xcopy_32bit.zip(来自oracle.com)
哪一个是:
ODAC 11.2第5版(11.2.0.3.20)下载XCopy版本[2012年9月11日发布]
我解压缩了这个zip文件。
我搜索并找出这些文件:
oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll
注意,当有2个同名文件时,我为我的3.5 Framework需要“bin \ 2.x \”或“odp.net20 \ bin”版本(我还没有4.0)。
我接受了这些文件,并将它们放在我的.sln文件所在的子文件夹中。
.\MySolution.sln .\MyConsoleApplicationFolder\MyConsoleApp.csproj .\ThirdPartyReferences\ .\ThirdPartyReferences\Oracle\
我把上面的所有文件都放在了
.\ThirdPartyReferences\Oracle\
夹
我使用“添加引用”将对Oracle.DataAccess.dll的引用添加到“MyConsoleApp.csproj”csharp项目中。 (这意味着浏览到“.. \ ThirdPartyReferences \ Oracle \”当然)
我使用“Post Build Event”来复制“额外”(又名“附件”)文件
我的post构建活动中的行是:
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oci.dll $(TargetDir)*.* copy $(ProjectDir)..\ThirdPartyReferences\Oracle\orannzsbb11.dll $(TargetDir)*.* copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oraociei11.dll $(TargetDir)*.* copy $(ProjectDir)..\ThirdPartyReferences\Oracle\OraOps11w.dll $(TargetDir)*.*
请注意,我的post构建事件会从上面的URL说明中替换“Copy if Newer”。
当我运行我的项目……..我有一些丢失的DLL错误。
注意:在您调用EnterpriseLibrary.Data对象的程序集中……您将获得“无法找到Microsoft.Practices.SomethingSomething命名空间。 只需继续添加对这些dll的引用(上面的package.config将下拉),直到错误消失为止。
像这里是特定的一个:
"Could not load file or assembly 'Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified."
所以(在运行Nuget之后,当然要下载所有文件)我去了并添加了一个引用:
\包\ CommonServiceLocator.1.0 \ LIB \ NET35 \ Microsoft.Practices.ServiceLocation.dll
这解决了问题。
我的csharp代码:(注意“select *”仅用于演示目的)
/* using System; using System.Data; using System.Data.Common; using Microsoft.Practices.EnterpriseLibrary.Data; */ public IDataReader EmployeesGetAll() { IDataReader returnReader = null; try { Database db = DatabaseFactory.CreateDatabase(); DbCommand dbc = db.GetSqlStringCommand("SELECT * FROM ( SELECT * FROM TEMPLOYEE ) WHERE ROWNUM <= 25"); returnReader = db.ExecuteReader(dbc); return returnReader; } finally { } }
它奏效了。
谢谢:
https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181
我认为这使得ODP.NET成为“xcopy”部署。
我仍然需要在干净的机器上进行测试才能确定。
但它结束了一天..............
================
附加信息:
以上所有内容都是正确的。 但是,我发了一个警告。 我正在使用“控制台应用程序”来测试我的代码。
当您向Visual Studio添加新的控制台应用程序时,它默认为x86。
如下所示:
编辑:(更新链接)
http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os
因此,当我将所有配置和代码和内容放在一个真实的项目中(在x64位机器上设置为“Any CPU”)时......我所做的一切都停止了工作。 <
稍微调整一下........我在oracle.com上找到了这个文件ODAC1120320Xcopy_x64.zip然后我重复了上面所做的一切,但是搜索了这个x64 zip文件的解压缩文件。
一切正常。
但是,带有控制台应用程序的“x86”默认设置让我陷入了循环。
通过Instant Client部署ODP.NET时,我收到了同样的错误(未找到数据提供程序)。 我唯一需要做的就是将以下内容添加到我的exe.config文件中(在标记内)