不幸的是,我试图从.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部分中连接它们的部分。
这是配置文件部分。
<oracle.dataaccess.client>
<add key="DllPath" value="D:\Trunk\Dependencies\odp.net4\bin" />
</oracle.dataaccess.client>
configSection中有什么内容?我在这上面找到的几个主题就是一个例子然后说'#34;我不知道什么类型=应该是&#34;,这是主要的一点!
有人可以告诉我吗?有没有人知道从.NET查询Oracle视图的虚拟指南的链接?
我能否在1997年做些什么来阻止自己在2012年使用Oracle?
更新
快速更新。我已将OraOps11w.dll复制到我的输出bin文件夹中,并删除了之前添加的任何web.config文件更改。
我现在得到以下错误,我正在研究。
无法加载文件或程序集&#39; Oracle.DataAccess&#39;或其中一个 依赖。尝试加载程序不正确 格式。
其他一些论坛谈论在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托管的我的站点时,我收到此错误。
Handler&#34; ExtensionlessUrl-Integrated-4.0&#34;有一个糟糕的模块 &#34; ManagedPipelineHandler&#34;在其模块列表中
这个问题在这条问题上太过分了,所以我将尝试使用32位版本的ODP.NET。
更新4
我下载了32位版本的完整安装,但是在看到Oracle Universal Installer时我感到很害怕。与我珍贵的开发盒相信它看起来太过90年了。所以我使用的是32位&#39; XCopy&#39;客户端,这让我可以打开我网站的主页,所以推荐工作正常。感谢那些暗示架构不匹配32/64问题的人。
现在我在实例化一个新的OracleConnection时正在研究这个错误。
提供程序与Oracle客户端版本不兼容
更新5 我想我已经完成了。
所以我下载了32位最新的11g&#34; Instant Client&#34;并将其放在解决方案中继代码库的\ Dependencies文件夹中。我将此文件夹添加到%PATH%系统环境变量中,并将OraOps11w.dll文件放在那里。
最后,_oracleConnection = new OracleConnection(connectionString)不会抛出!现在我需要确保当我部署到prod时我在桌面上放了一瓶Laphroaig。
因此,回顾一下,对于Windows 7,64上的IIS Express 7.5(这是一个32位进程):
下载并解压缩32位11g&#34; Instant Client&#34;到某个文件夹并将此位置添加到您的PATH。 Oci.dll是主要的Oracle客户端非托管库。
将32位ODP.NET下载并解压缩到某个文件夹。
将OraOps11w.dll复制到Instant Client所在的主文件夹(上图)。
添加一个TNS_ADMIN环境变量,指向TNSNames.ora文本文件所在的文件夹。这类似于hosts文件,并将Oracle服务名称映射到服务器主机名。
关闭并重新打开Visual Studio以确保您获取新的环境变量,并在ODP.NET文件夹中添加对Oracle.DataAccess.dll托管程序集的引用。
那应该是它。当你知道如何时,听起来很简单。
更新5.1
调查下面的错误,我最初没有报告,因为我确定它是防火墙问题。我所在的公司在每个工作站上有两个,但我只是打开了一个原始套接字到Oracle服务器,所以它不可能。
ORA-12541:TNS:没有听众
答案 0 :(得分: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构建和维护,具有更强大的功能集。我希望它能早点到达。
答案 1 :(得分:3)
过去我花了天尝试在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安装的)。
(我正在逐字复制my blog post )
注意:这会强制Oracle 11.2.0.1仅在64位环境中使用32位。
我犯的第一个错误是在Windows 7上安装Oracle 10g客户端。这不起作用。如果你安装它,你将不得不在之后进行一些清理。
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"
当我这样做时,我有三个要删除的程序集:
同样,你可能需要重启(嘿,这是Windows)。
如果您需要进行任何清理,我还blogged about that
供参考
如果指向“虚拟注册表项”步骤的链接死亡,这里是Gadi发布的文章:
“” 嗨本,
在设计时,使用SQL Server Business Intelligence Development Studio时,Oracle Connector以32位模式运行,因此它会加载32位Oracle客户端。
最有可能的是,您收到错误是因为连接器正在加载错误的Oracle客户端(oci.dll),其中未定义TNS服务。
要解决此问题,您有两种选择:
指定Oracle连接字符串,而不是Oracle Connection Manager编辑器中的TNS服务名称,例如,采用以下格式:host:port/service_name
定义虚拟注册表项(Z_SSIS
),如下所示:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE
。Z_SSIS
(以确保它是最后一个条目)。Z_SSIS
节点,然后点击新建 - &gt;字符串。ORACLE_HOME
。ORACLE_HOME
并将其设置为您要使用的Oracle 32Bit安装主目录的位置。此致
迦底 “”
答案 2 :(得分:1)
首先,为您对Oracle的纯粹热爱+1,并意识到他们是拥有最佳产品的最佳公司! ;)
是的,下载和安装过程非常荒谬。我通常甚至无法在他们的网站上找到合适的客户端下载,而且Oracle Universal Product Installer的功能非常糟糕。
有时您需要OraOps11w.dll
目录中的\bin
副本。有时不是。我从来没有弄清楚它何时需要,什么时候不需要,但我认为如果你引用的Oracle.DataAccess.dll
与完全与已安装的Oracle客户端完全相同,那么你需要OraOps11w.dll
。
您可以使用DllPath
解释您在配置文件中尝试执行的操作吗? Oracle安装应该已经在.NET运行时的machine.config
中注册了所需的全部内容。自从我设置ODP.NET以来已经有一段时间了,但是我不记得除了连接字符串之外还有很多东西放在app.config中。
答案 3 :(得分:1)
我不相信这是一个路径问题。 “尝试加载格式不正确的程序。”是一个错误,几乎总是意味着您在.NET中混合使用32位和64位程序集和DLL。
我注意到你安装了64位Oracle客户端,我假设自DSN创建工作以来你在64位版本的操作系统上?您的问题可能来自许多相关场景:
我相信如果您的应用专门针对x86,您必须安装32位Oracle客户端软件包,无论底层操作系统平台如何(例如,即使您是32位应用程序,您仍然需要32位Oracle客户端)使用64位版本的Windows)
要检查的几件事情:
最后,您是否尝试过为Oracle内置的.NET数据提供程序(System.Data.OracleClient命名空间?)
这是我能做的最好的事情,因为我对你的应用程序的项目设置了解不多。
答案 4 :(得分:-1)
我遇到了同样的问题,发现在Oracle.DataAccess.dll 11.x软件安装的副本版本中运行取消配置并配置bat文件可能会解决或帮助解决问题。
E.G。 configure.bat xxx.netx xxx \ product \ 11.2.0 \ client_1