尝试连接到oracle数据库时,OracleConnection.Open()AccessViolationException

时间:2016-04-15 13:29:52

标签: c# .net database oracle exception

我正在尝试使用我的c#应用程序连接到远程oracle数据库,但是当涉及到oracleconnection.open()时它会退出

  

AccessViolationException未处理 - 尝试读取或写入受保护的内存。这通常表明其他内存已损坏

我的连接字符串是app.config文件中的key="oracleconnectionstring" value="Data Source=XYZ; password=mypassword; User ID=myuserid"

tnsnames.ora是

XYZ = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = HostName)(PORT = 1521))
    ) 
    (CONNECT_DATA = 
      (SERVICE_NAME = XYZ)
    )
  )

如果我尝试通过Sql Developer连接它连接没有任何问题,如果我尝试SqlPlus它只是崩溃(Sql * Plus已经停止工作),如果我尝试使用VS它会给我带来奇怪的错误。

它能成为什么?

编辑:如果我尝试tnsping xyz,则返回OK(100ms);

3 个答案:

答案 0 :(得分:0)

最后,我通过干净安装的Oracle Client和ODT for VisualStudio来管理它,并且它工作正常,我现在永远不会出现这个问题。

答案 1 :(得分:0)

如果您在线程环境中使用Connection,则可能有助于为不同的线程分配单独的Connections。 OracleConnection对象似乎不是线程。

我遇到了完全相同的问题,我可以追溯到这个原因。

答案 2 :(得分:0)

似乎有很多导致此错误的原因。要检查的另一件事是运行应用程序的计算机上Oracle.DataAccess.dll和Oracle客户端的兼容性。

here描述了检查版本兼容性的符号-例如,Oracle客户端版本11.2.0.2对应于Oracle.DataAccess.dll的版本4.112.2.0。 您可以检查客户端的版本,例如通过运行sqlplus -v和DLL的版本,方法是右键单击它,然后转到“详细信息”选项卡。


旁注:

在我的特定情况下,它甚至更陌生-即使在纸上,我的客户端与Oracle.DataAccess.dll兼容,但仍然不起作用。
我将问题追溯到ORACLE_HOME / bin / OraOps12.dll,结果发现如果我使用文件的版本
[2.121.2.0 ODAC版本4;修改日期2017/09/25]
它不起作用,但是如果我使用版本
[2.121.2.0;修改日期2014/09/08]
会的。
因此,我使用了较旧版本的客户端。