【问题标题】:OracleConnection.Open() AccessViolationException when try to connect to oracle databaseOracleConnection.Open() 尝试连接到 oracle 数据库时出现 AccessViolationException
【发布时间】:2019-05-29 02:48:47
【问题描述】:

我正在尝试使用我的 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);

【问题讨论】:

  • 请贴出你用来连接的代码——你用的是什么oracle连接库——你试过什么?
  • 我正在使用 Oracle.DataAccess 版本 4.112.2.0 运行时 v4.0.30319;代码从配置文件中获取连接字符串,然后执行:oracleconnection = new OracleConnection(oracleconnectionstring); oracleconncetion.Open();
  • 当我在调试中分析连接字符串时,似乎从配置中获取了正确的元素;

标签: c# .net database oracle exception


【解决方案1】:

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

检查版本兼容性的符号描述为here - 例如,Oracle 客户端版本 11.2.0.2 对应于版本 4.112.2.0 的 Oracle.DataAccess.dll。 您可以检查客户端的版本,例如通过运行 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]
确实如此。
因此,我使用了这个旧版本的客户端。

【讨论】:

    【解决方案2】:

    最后,我通过全新安装 Oracle 客户端和适用于 VisualStudio 的 ODT 进行了管理,并且它工作正常,我现在永远不会,这正是问题所在。

    【讨论】:

      【解决方案3】:

      如果您在线程环境中使用连接,则将单独的连接分配给不同的线程可能会有所帮助。 OracleConnection 对象似乎不是线程保存对象。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 2013-04-19
        相关资源
        最近更新 更多