我如何在.NET中使用Oracle?

Luk*_*ett 26 .net c# oracle

不幸的是,我正在尝试使用.NET中的Oracle,这就像回到1997年.正确解释事情是一个弱点的迹象,注册表和环境变量似乎具有特色.

所以这是我有多远.

我在Oracle.com上填写了一份关于我生活的大表,然后下载了

ODBC Windows 64位实例客户端,11.2.0.3.0并将其压缩到一个文件夹中. 基本的Windows 64位Instant Client,11.2.0.3.0并将其解压缩到与上面相同的文件夹中.

我运行了安装.exe(没有MSI,记得这是1997).

我添加了一个TNS_NAMES环境变量,指向网络共享上的公司TNSNames.ora文件,并在控制面板中设置一个快速DSN并运行测试 - 它工作正常!

然后我下载了最新的ODP.NET for .NET 4.0的XCOPY版本,并将其复制到我的源代码控制工作区下的Dependencies文件夹中.

我从我的项目添加了一个引用到Dependencies\odp.net4\odp.net\bin\4\Oracle.DataAccess.dll

我读过,我需要让管理ODP.NET东西,知道在哪里可以找到其非托管Oracle库,我猜是依赖\ 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>
Run Code Online (Sandbox Code Playgroud)

configSection中有什么内容?我在这上面找到的几个线程给出了一个例子,然后说"我不知道应该是什么类型",这是主要的一点!

任何人都可以建议我吗?有没有人知道从.NET查询Oracle视图的傻瓜指南的链接?

我能在1997年做些什么来阻止自己在2012年使用Oracle吗?

UPDATE

只是一个快速更新.我已将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客户端版本不兼容

更新5我想我已经做到了.

所以我下载了32位最新的11g"Instant Client",并将它放在我的\ Dependencies文件夹中,用于解决方案中继代码库.我将此文件夹添加到%PATH%系统环境变量中,并将OraOps11w.dll文件放入其中.

最后,_oracleConnection = new OracleConnection(connectionString)不会抛出!现在我需要确保在我部署生产时我在桌子上放了一瓶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:没有倾听者

one*_*mer 5

解释该问题的最简单方法是指出Oracle客户端和ODAC客户端库之间的区别.

在64位计算机(Windows 7+)上,您需要安装64位Oracle客户端.这是您的计算机将用于连接到计算机本地部署的Oracle数据库的客户端.对于托管在Web服务器或其他终端服务器上的应用程序,规则是相同的.

诀窍是......作为开发人员,我们的机器也必须具有.Net IDE工具.Oracle有一个糟糕的命名约定,但基本上有2个部分:ODT(工具)和ODAC(数据访问).ODP.Net数据提供程序是ODAC库的一部分.

所以...回到IDE ... Visual Studio是32位,因此我们必须以32位安装上面的工具.

在开发,调试等时,VS.Net正在使用32位客户端库和数据访问库来与Oracle协同工作.

只要将此应用程序部署到计算机,它就会使用计算机上加载的任何客户端,除非针对特定平台.

这意味着如果你的目标是32并部署到64,它将会中断......反之亦然.最好的办法就是把它放在任何平台部分,简单地记住你到底在做什么:)

另外要注意的是确保您的客户端和ODAC软件包具有相同的版本...您不希望拥有11g R2客户端和11g R5 ODAC,因为一旦部署,废话就会再次中断.


需要注意的是,如果您希望在应用程序中"嵌入"oracle客户端,在这种情况下,OraOps与其他几个库一起部署在应用程序中 - 这称为Oracle的Instant Client,也是ODAC包的一部分,包括在内在他们完整的客户端包中也是如此.


好消息...

Oracle很快(2013年第1季度)发布了他们的下一个ODP.Net软件包......这将是一个完全托管代码库......这意味着没有更多单独的客户端或ODAC软件包可以匹配,平台将不知道32和64位的区别......它的功能与旧的微软库一样,只有它将由oracle构建和维护,具有更强大的功能集.我只希望它能早点到达.


Cod*_*ike 1

首先,为您对 Oracle 纯粹的热爱+1,并认识到他们是拥有最好产品的最好公司!;)


是的,下载和安装过程很荒谬。我通常甚至无法在他们的网站上找到合适的客户端下载,而且 Oracle Universal Product Installer 的情况很糟糕。


OraOps11w.dll有时您的目录中需要一份 的副本\bin。有时不是。我从来没有弄清楚什么时候需要它,什么时候不需要它,但我认为如果您引用的版本与安装的 Oracle 客户端Oracle.DataAccess.dll完全相同,那么您需要OraOps11w.dll.


你能解释一下你想在你的配置文件中做什么吗DllPath?Oracle 安装应该已经注册了 .NET 运行时所需的几乎所有内容machine.config。自从我设置 ODP.NET 以来已经有一段时间了,但我不记得除了连接字符串之外,app.config 中还没有添加太多内容。