【发布时间】:2012-07-07 04:15:52
【问题描述】:
不幸的是,我正在尝试使用 .NET 中的 Oracle,这就像回到 1997 年。正确解释事情是弱点的标志,而且注册表和环境变量似乎很重要。
这就是我已经走了多远。
我填写了一份关于我在 Oracle.com 生活的巨大表格并下载了
ODBC Windows 64 位实例客户端,11.2.0.3.0 并将其解压缩到一个文件夹中。 Basic Windows 64-bit Instant Client, 11.2.0.3.0 并将其解压缩到与上述相同的文件夹中。
我运行了 install .exe(没有 MSI,记住这是 1997 年)。
我在网络共享上添加了一个指向公司 TNSNames.ora 文件的 TNS_NAMES 环境变量,并在控制面板中设置了一个快速 DSN 并运行了测试 - 它成功了!
然后我下载了最新的 ODP.NET for .NET 4.0 的 XCOPY 版本,并将其复制到我的源代码控制工作区下的 Dependencies 文件夹中。
我从我的项目中添加了对 Dependencies\odp.net4\odp.net\bin\4\Oracle.DataAccess.dll
的引用我读到我需要让托管 ODP.NET 的东西知道它可以在哪里找到它的非托管 Oracle 库,我猜是 Dependencies\odp.net4\bin\OraOps11w.dll 但它可能是其他一些 Oracle 二进制文件?
现在我正在设置一个名为 DllPath 的配置文件参数。遗憾的是,Oracle 文档似乎没有意识到 .NET 配置文件需要将其部分连接到 configSections 部分。
这是配置文件部分。
<oracle.dataaccess.client>
<add key="DllPath" value="D:\Trunk\Dependencies\odp.net4\bin" />
</oracle.dataaccess.client>
configSection 中有什么内容?我找到的几个线程给出了一个例子,然后说“我不知道 type= 应该是什么”,这是主要的一点!
谁能给我建议?有谁知道从 .NET 查询 Oracle 视图的傻瓜指南的链接?
我可以在 1997 年做些什么来避免自己在 2012 年不得不使用 Oracle 吗?
更新
只是一个快速更新。我已将 OraOps11w.dll 复制到我的输出 bin 文件夹中,并删除了我之前添加的所有 web.config 文件更改。
我现在收到以下错误,我正在研究。
无法加载文件或程序集“Oracle.DataAccess”或其其中之一 依赖关系。试图加载一个不正确的程序 格式。
其他一些论坛谈论在 GAC 中注册 Oracle.DataAccess.dll,我很想避免这种情况 - 反正我看不出有什么不同,但我会试一试。
更新 2
在 GAC 中注册 Oracle.DataAccess.dll 库没有任何区别,我已取消注册。
一周工作即将结束,我必须赶火车,但我已经给这里的另一个开发团队发了电子邮件,希望他们之前已经打过这场仗(而不是像其他人一样使用夜间提取物)。
更新 3
今天早上我下载并安装了 64 位版本的 IIS Express 8.0 RC。 VS2010 不支持 64 位版本,因此需要从命令行运行。这很简单,通过查看任务管理器,我可以看到 VS 使用 iisexpress.exe *32 的命令行。
很遗憾,我在浏览由 64 位 IIS Express 托管的网站时收到此错误。
处理程序“ExtensionlessUrl-Integrated-4.0”有一个坏模块 其模块列表中的“ManagedPipelineHandler”
这个问题太远了,所以我将尝试使用 32 位版本的 ODP.NET。
更新 4
我下载了 32 位版本的完整安装,但是当我看到 Oracle Universal Installer 时我很害怕。它看起来太 90 年代了,无法信任我珍贵的开发盒。所以我使用的是 32 位的“XCopy”客户端,这让我可以打开我网站的主页,所以参考是有效的。感谢那些提出架构不匹配 32/64 问题的人。
现在我在实例化一个新的 OracleConnection 时正在调查这个错误。
提供者与Oracle客户端版本不兼容
UPDATE 5我想我已经做到了。
所以我下载了 32 位最新的 11g “即时客户端”,然后将它放在我的 \Dependencies 文件夹中作为解决方案主干代码库。我将此文件夹添加到 %PATH% 系统环境变量中,并将 OraOps11w.dll 文件放入其中。
最后,_oracleConnection = new OracleConnection(connectionString) 没有抛出!现在,当我开始部署到 prod 时,我需要确保桌子上有一瓶 Laphroaig。
所以,回顾一下,对于 Windows 7、64 上的 IIS Express 7.5(这是一个 32 位进程):
下载 32 位 11g “Instant Client”并将其解压缩到某个文件夹,然后将此位置添加到您的 PATH。 Oci.dll 是主要的 Oracle 客户端非托管库。
下载 32 位 ODP.NET 并将其解压缩到某个文件夹。
将 OraOps11w.dll 复制到 Instant Client 所在的主文件夹(上图)。
添加指向 TNSNames.ora 文本文件所在文件夹的 TNS_ADMIN 环境变量。这就像一个 hosts 文件,将 Oracle 服务名映射到服务器主机名。
-
关闭并重新打开 Visual Studio 以确保选择新的环境变量,并在 ODP.NET 文件夹中添加对 Oracle.DataAccess.dll 托管程序集的引用。
李>
应该是这样的。当您知道如何操作时,这听起来相当简单。
更新 5.1
调查下面的错误,我最初没有报告,因为我确定这是防火墙问题。我所在的公司在每个工作站上都有两个,但我只是为 Oracle 服务器打开了一个原始套接字,所以它不可能。
ORA-12541:TNS:没有监听器
【问题讨论】:
-
虽然您的标题很有市场,但它不适合搜索。请考虑更改它。
-
据我所知,有几个供应商可以与 Oracle 合作。您不会只使用 OleDbProvider 并将其视为任何其他 OleDb 数据库吗?我知道这是 Microsoft 使用 .lNET 的目标 - 提供访问数据的标准方法,但可能是 Oracle(如 System i 上的 DB2)有自己的怪癖......但 ConnectionStrings.com 上的信息似乎表明你可以这样做...connectionstrings.com/oracle
-
请等到稍后再更改它。否则我以后再搜索发给前段时间遇到同样问题的朋友时,我就找不到了。他的解决方案是放弃并使用其他东西。
-
“收藏”,因为坦率地说,让 Oracle 驱动程序连接到 Oracle 数据库是一个巨大的 PITA。
-
@LukePuplett 仅供参考,从 11.2.0.2.5 开始,适用于 VS 的 Oracle 数据访问组件附带一个实体框架提供程序。此外,您可以使用一些愚蠢的语法在您的应用配置中而不是在 TNS_NAMES 中指定连接字符串。它仍然是一个 PITA,但没有那么糟糕。另外,我只是在运行程序的机器上安装了 230 MB 驱动程序,该程序需要与 Oracle 对话以解决 DLL 问题。