这是我的 Xcopy 解决方案。
我把它贴在
(https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181)
也是。
但我想我可以在这里发布我的 xml 而不会出现格式问题。
Nuget“packages.config”
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonServiceLocator" version="1.0" targetFramework="net35" />
<package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net35" />
<package id="EnterpriseLibrary.Data" version="5.0.505.0" targetFramework="net35" />
<package id="EntLibContrib.Data.OdpNet" version="5.0.505.0" targetFramework="net35" />
<package id="Unity" version="2.1.505.2" targetFramework="net35" />
<package id="Unity.Interception" version="2.1.505.2" targetFramework="net35" />
</packages>
应用程序配置
(注意<clear />
下面的标签。这可能需要也可能不需要,但我认为最好清除它们,因为您不知道 machine.config 文件中可能包含什么)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<dataConfiguration defaultDatabase="OracleMainConnectionString">
</dataConfiguration>
<connectionStrings>
<add name="OracleMainConnectionString"
connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyOracleServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyServiceName)));User ID=MyUserName;Password=MyPassword;"
providerName="Oracle.DataAccess.Client" />
</connectionStrings>
<appSettings>
<add key="ExampleKey" value="ExampleValue" />
</appSettings>
<system.data>
<DbProviderFactories>
<clear />
<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add name="EntLibContrib.Data.OdpNet" invariant="EntLibContrib.Data.OdpNet" description="EntLibContrib Data OdpNet Provider" type="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" />
</DbProviderFactories>
</system.data>
</configuration>
我正在 x64 Windows 7 机器上开发。
我下载了:ODAC1120320Xcopy_32bit.zip(来自 oracle.com)
哪一个是:
ODAC 11.2 Release 5 (11.2.0.3.20) 下载 XCopy 版本 [2012 年 9 月 11 日发布]
我解压了这个 zip 文件。
我搜索并找出了这些文件:
oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll
请注意,当有 2 个同名文件时,我选择了“bin\2.x\”或“odp.net20\bin”版本来满足我的 3.5 框架需要(我还没有使用 4.0)。
我把这些文件放在我的 .sln 文件所在的子文件夹中。
.\MySolution.sln
.\MyConsoleApplicationFolder\MyConsoleApp.csproj
.\ThirdPartyReferences\
.\ThirdPartyReferences\Oracle\
我把上面的所有文件都放在
.\ThirdPartyReferences\Oracle\
文件夹
我使用“添加引用”将 Oracle.DataAccess.dll 的引用添加到“MyConsoleApp.csproj”csharp 项目中。(这意味着浏览到“..\ThirdPartyReferences\Oracle\”当然)
我使用“构建后事件”来复制“额外”(又名“附件)”文件
我在后期构建活动中的台词是:
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)*.*
请注意,我的后期构建事件替换了上面 URL 说明中的“如果更新则复制”。
当我运行我的项目时............我得到了一些缺少的 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 之后,要下载所有文件)我去添加了一个参考:
\packages\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-aspx
编辑:(更新链接)
http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os
因此,当我将所有配置和代码以及其他东西放入一个真实项目(在 x64 位机器上设置为“任何 CPU”)时……我所做的一切都停止了工作。:<
稍作调整后......我在 oracle.com ODAC1120320Xcopy_x64.zip 上找到了这个文件,然后我重复了上面所做的一切,但搜索了这个 x64 zip 文件的解压缩文件。
一切正常。
但是控制台应用程序的“x86”默认设置让我陷入了循环。