我如何在.NET中使用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库,我猜测它是Dependencies \ odp.net4 \ bin \ OraOps11w.dll但它可能是其他一些Oracle二进制文件某处?
现在我正在设置一个名为DllPath的配置文件参数。 遗憾的是,Oracle文档似乎没有意识到.NET配置文件需要在configSections部分中连接它们的部分。
这是配置文件部分。
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 =新的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:没有倾听者
解释该问题的最简单方法是指出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位的区别……它的function就像旧的微软库一样,只有它将由oracle构建和维护,具有更强大的function集。 我只希望它能早点到达。
我过去花了几天时间尝试在Windows 7中连接Oracle。
我遇到的问题是我有一个安装了32位Oracle ODP.NET驱动程序的32位ASP.NET应用程序。 我不知道,即使ASP.NET应用程序作为32位进程运行并需要32位ODP.NET,IIS也是一个64位进程并导致ODP.NET访问64位注册表键。 您没有提到是否尝试为ASP.NET设置Oracle,但我将分享我的修复程序(尽管它是针对Oracle 10.2安装的) 。
( 我正在从我的博客文章中逐字复制 )
注意:这会强制Oracle 11.2.0.1仅在64位环境中使用32位。
我犯的第一个错误是在Windows 7上安装Oracle 10g客户端。这不起作用。 如果你安装它,你将不得不执行一些清理。
- 转到Oracle的站点并下载/安装11g 32位和64位客户端。
- 转到此处并按照“虚拟注册表项”步骤操作。
- 打开regedit并validation
HKLM\SOFTWARE\Wow6432Node\ORACLE\inst_loc
指向正确的位置(可能是C:\ oracle \ Inventory) - 将
HKLM\SOFTWARE\Wow6432Node\ORACLE\VOBHOME2.0
的注册表项指向32位Oracle文件夹 - 创建
ORACLE_HOME
环境变量并将其指向32位文件夹。
现在你应该在重启后全部设置好。
如果您尝试安装Oracle 10g客户端,则必须执行一些清理。 首先,确保完全卸载Oracle 10g,从PATH变量中取消引用,并删除目录。 然后,找到GAC中引用的程序集:
gacutil /l | find /i "Oracle" > c:\[some directory]\oracle.txt
找到引用Oracle.DataAccess版本10.2的行并将其从GAC中删除。 作为示例(除非您安装了相同的版本,否则这将无效):
gacutil /u "Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342"
当我这样做时,我有三个程序集要删除:
- Oracle.DataAccess
- Policy.10.1.Oracle.DataAccess
- Policy.9.2.Oracle.DataAccess
再次,您可能需要重新启动(嘿,它是Windows)。
如果你需要进行任何清理,我也会在博客上发表这个问题
以供参考
如果指向“虚拟注册表项”步骤的链接死亡,这里是Gadi发布的文章:
“嗨本,
在设计时,使用SQL Server Business Intelligence Development Studio时,Oracle Connector以32位模式运行,因此它会加载32位Oracle客户端。
最可能的是,您收到错误是因为连接器正在加载错误的Oracle客户端(oci.dll),其中未定义TNS服务。
要解决此问题,您有两种选择:
-
在Oracle Connection Manager编辑器中指定Oracle连接字符串,而不是TNS服务名称,例如,格式如下:
host:port/service_name
-
定义虚拟注册表项(
Z_SSIS
),如下所示:- 打开regedit实用程序。
- 找到以下项:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE
。 - 右键单击ORACLE节点,然后单击New – > Key。
- 调用新密钥
Z_SSIS
(以确保它是最后一个条目)。 - 右键单击
Z_SSIS
节点,然后单击New – > String。 - 将属性命名为
ORACLE_HOME
。 - 双击
ORACLE_HOME
并将其设置为您要使用的Oracle 32Bit安装主目录的位置。
问候,
加迪“”
首先,为您对Oracle的纯粹热爱+1,并意识到他们是拥有最佳产品的最佳公司! ;)
是的下载和安装过程是荒谬的。 我通常甚至无法在他们的网站上找到合适的客户端下载,并且Oracle Universal Product Installer的事情很糟糕。
有时您需要在\bin
目录中提供OraOps11w.dll
的副本。 有时不是。 我从来没有弄清楚它何时需要,什么时候不需要,但我认为如果您引用的Oracle.DataAccess.dll
与安装的Oracle客户端的版本不完全相同 ,那么您需要OraOps11w.dll
。
你能用DllPath
解释你在配置文件中想要做什么吗? Oracle安装应该已经在.NET Runtime的machine.config
注册了它所需的一切。 自从我设置ODP.NET以来已经有一段时间了,但是我不记得除了连接字符串之外还有很多东西放在app.config中。
我不相信这是一个路径问题。 “试图加载格式不正确的程序。” 是一个错误,几乎总是意味着你在.NET中混合32位和64位程序集和DLL。
我注意到您安装了64位Oracle客户端,我假设自DSN创建工作以来您使用的是64位版本的操作系统? 您的问题可能来自许多相关场景:
- 您的OraOps11w.dll副本可能是32位程序集,您在64位应用程序中使用它
- 你的OraOps11w.dll副本可能是一个64位程序集,你试图从32位应用程序使用它
- Oracle Data Provider for .NET的非托管依赖项之一是32位,无法加载到32位应用程序中(反之亦然)
我相信如果您的应用程序专门针对x86,则无论底层操作系统平台如何,您都必须安装32位Oracle客户端软件包(例如,即使您使用64位应用程序,您仍需要32位Oracle客户端才能使用32位应用程序-bit版Windows)
要检查的几件事:
- 检查调用Oracle提供程序的程序集中的“Platform Target”设置:x64将始终尝试以64位运行,x86将始终尝试以32位运行,并且“Any Platform”将JIT编译为目标OS体系结构在运行时(x86系统上为32位,x64系统上为64位)
- 通过corflags.exe运行OraOps11w.dll(请参阅此SOpost中的详细信息)以查看它是32位,64位还是“任何CPU”
最后,您是否尝试过为Oracle内置的.NET数据提供程序(System.Data.OracleClient命名空间?)
这是我能做的最好的事情,因为我不太了解你的应用程序的项目设置。
我遇到了同样的问题,发现在Oracle.DataAccess.dll 11.x软件安装的副本版本中运行取消配置和配置bat文件可以解决或帮助解决问题。
EG configure.bat xxx.netx xxx \ product \ 11.2.0 \ client_1