将 C# 连接到 Oracle 数据库所需的最小客户端占用空间是多少?
题
通过在笔记本电脑上下载并安装客户端管理工具和 Visual Studio 2008,我已成功从 C# (Visual Studio 2008) 连接到 Oracle 数据库 (10g)。
Oracle 客户端工具的安装占用空间超过 200Mb,而且相当冗长。
有谁知道最小可行占地面积是多少?我希望它是一个 DLL 和一个注册命令,但我感觉我需要安装一个 oracle home,并设置各种环境变量。
我在代码中使用 Oracle.DataAccess。
解决方案
您需要一个 Oracle 客户端来连接到 Oracle 数据库。最简单的方法是安装 Oracle 数据访问组件.
为了最大限度地减少足迹,我建议如下:
- 使用框架附带的 Microsoft Oracle 提供程序 (System.Data.OracleClient)。
- 下载 Oracle 即时客户端包 - 基本精简版:这是一个(几乎)包含最低限度内容的 zip 文件。我推荐版本10.2.0.4,它比版本11.1.0.6.0小得多。
- 将以下文件解压缩到特定文件夹中:
- v10:
- oci.dll
- orannzsbb10.dll
- oraociicus10.dll
- v11:
- oci.dll
- orannzsbb11.dll
- oraociei11.dll
- v10:
- 在 x86 平台上,将 Visual Studio 2003 的 CRT DLL (msvcr71.dll) 添加到此文件夹,因为 Oracle 人员忘记了 读这个...
- 将此文件夹添加到 PATH 环境变量中。
- 使用 轻松连接命名 方法在您的应用程序中删除臭名昭著的 TNSNAMES.ORA 配置文件。它看起来像这样:
sales-server:1521/sales.us.acme.com
.
这相当于约 19MB (v10)。
如果您不关心在多个应用程序之间共享此文件夹,另一种方法是将上述 DLL 与您的应用程序二进制文件一起发送,并跳过 PATH 设置步骤。
如果您绝对需要使用 Oracle 提供程序 (Oracle.DataAccess),您将需要:
- ODP .NET 11.1.0.6.20(据称与 Instant Client 配合使用的第一个版本)。
- 显然,即时客户端 11.1.0.6.0。
请注意,我还没有测试过这个最新配置......
其他提示
截至 2014 年,OPD.NET 托管驱动程序是占用空间最小的。
以下是与先前(过时)答案建议的非托管版本的代码使用比较:http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
您需要下载这些 dll 并参考 Oracle.ManagedDataAccess.dll
在你的项目中:下载 ODP.NET,仅限托管驱动程序 Xcopy 版本
以下是您需要与版本一起打包的典型足迹:
Oracle.ManagedDataAccess.dll
Oracle.ManagedDataAccessDTC.dll
全部加起来,一个 巨大的 .Net 4.0 为 6.4 MB。
我使用上面 Pandicus 建议的方法,在 Windows XP 上使用 ODAC 11.2.0.2.1。步骤如下:
- 从 oracle.com (53 MB) 下载“ODAC 11.2 Release 3 (11.2.0.2.1) with Xcopy Deployment”包,并解压 ZIP。
- 收集以下 DLL:oci.dll (1 MB)、oraociei11.dll (130 MB!)、OraOps11w.dll (0.4 MB)、Oracle.DataAccess.dll (1 MB)。剩下的东西可以删除,不需要安装任何东西。
- 添加对Oracle.DataAccess.dll的引用,添加
using Oracle.DataAccess.Client;
到您的代码,现在您可以使用类似的类型OracleConnection
,OracleCommand
和OracleDataReader
访问 Oracle 数据库。请参阅 类文档 了解详情。不需要使用tnsnames.ora配置文件,只需要使用 连接字符串 必须正确设置。 - 上述 4 个 DLL 必须与可执行文件一起部署。
这种方式允许您使用来自 oracle 的 5 个可再发行文件连接 ODP.net:
克里斯的博客条目:使用新的ODP.Net从C#访问Oracle,部署简单
编辑:万一博客失败了,这里有一个简短的总结......
- oci.dll
- Oracle.DataAccess.dll
- oraociicus11.dll
- OraOps11w.dll
- orannzsbb11.dll
- oraocci11.dll
- ociw32.dll
确保您从同一 ODP.Net / ODAC 发行版获取所有这些 DLL,以避免版本号冲突,并将它们全部放在与 EXE 相同的文件夹中
开发艺术 http://www.devart.com/, ,以前的 CoreLab (crlab.com) 提供纯 C# Oracle 客户端。这是一个单独的 dll,并且运行良好。
这是一个更新 甲骨文11.2.0.4.0. 。我通过以下过程取得了成功 Windows 7的 使用 System.Data.OracleClient
.
1. 下载 即时客户端包 - Basic Lite: Windows 32 位 或者 64 位.
2. 将以下文件复制到系统路径中的某个位置:
32位
1,036,288 2013-10-11 oci.dll
348,160 2013-10-11 ociw32.dll
1,290,240 2013-09-21 orannzsbb11.dll
562,688 2013-10-11 oraocci11.dll
36,286,464 2013-10-11 oraociicus11.dll
64 位
691,712 2013-10-09 oci.dll
482,304 2013-10-09 ociw32.dll
1,603,072 2013-09-10 orannzsbb11.dll
1,235,456 2013-10-09 oraocci11.dll
45,935,104 2013-10-09 oraociicus11.dll
3. 构造一个连接字符串 省略了需要 tnsnames.ora.
(请参阅下面测试程序中的示例。)
4. 运行这个最小的 C# 程序来测试您的安装:
using System;
using System.Data;
using System.Data.OracleClient;
class TestOracleInstantClient
{
static public void Main(string[] args)
{
const string host = "yourhost.yourdomain.com";
const string serviceName = "yourservice.yourdomain.com";
const string userId = "foo";
const string password = "bar";
var conn = new OracleConnection();
// Construct a connection string using Method 1 or 2.
conn.ConnectionString =
GetConnectionStringMethod1(host, serviceName, userId, password);
try
{
conn.Open();
Console.WriteLine("Connection succeeded.");
// Do something with the connection.
conn.Close();
}
catch (Exception e)
{
Console.WriteLine("Connection failed: " + e.Message);
}
}
static private string GetConnectionStringMethod1(
string host,
string serviceName,
string userId,
string password
)
{
string format =
"SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST={0})(PORT=1521))" +
"(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SERVICE_NAME={1})));" +
"uid={2};" +
"pwd={3};"; // assumes port is 1521 (the default)
return String.Format(format, host, serviceName, userId, password);
}
static private string GetConnectionStringMethod2(
string host,
string serviceName,
string userId,
string password
)
{
string format =
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST={0})(PORT=1521))" +
"(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SERVICE_NAME={1})));" +
"User Id={2};" +
"Password={3};"; // assumes port is 1521 (the default)
return String.Format(format, host, serviceName, userId, password);
}
}
最后提示: 如果您遇到错误 “System.Data.OracleClient 需要 Oracle 客户端软件版本 8.1.7”, , 看 这个问题.
ODAC xcopy 将为您带来大约 45MB 的空间。http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
我发现 Oracle 论坛上的这篇文章也非常有用:
如何使用 Visual Studio 设置 Oracle Instant Client
评论:ADO.NET 团队正在弃用 System.Data.OracleClient,因此对于未来的项目,您应该使用 ODP.NET
再生产:
设置以下环境变量:
- 确保您的 PATH 中没有其他 oracle 目录
- 设置你的 小路 指向您的即时客户
- 设置你的 TNS_管理员 指向您的tnsnames.ora文件的位置
- 设置你的 NLS_LANG
- 设置你的 ORACLE_HOME 给您的即时客户
对于我来说,我将 NLS_LANG 设置为
http://download-east.oracle.com/docs/html/A95493_01/gblsupp.htm#634282
我通过使用即时客户端的 sqlplus 插件来验证这是使用正确的客户端软件。
对于我来说,我设置:设置 NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
笔记:在进行任何更改之前,请备份 Oracle 注册表项(如果存在)并备份任何环境变量的字符串。