这是我的 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>
app.config
(注意下面的<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”默认设置让我陷入了循环。