首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle - System.AccessViolationException客户端工具

Oracle - System.AccessViolationException客户端工具
EN

Stack Overflow用户
提问于 2014-12-17 12:39:01
回答 2查看 1.6K关注 0票数 0
代码语言:javascript
复制
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
  at Oracle.DataAccess.Client.OracleParameter.SetStatus(Int32)
  at Oracle.DataAccess.Client.OracleParameter.PreBind(Oracle.DataAccess.Client.OracleConnection, IntPtr, Int32, Boolean)
  at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()

我的应用程序崩溃了,出现了这个异常。上下文是:我们正在尝试执行一个接受两个参数的存储过程,我们对命令文本中的参数使用名称绑定。

示例:

代码语言:javascript
复制
OraCommand.CommandText = "begin LOAD_UTILS.TRUNCATE_TABLE(:a1,:a2); end;"
OraCommand.Parameters.Add(New OracleParameter("a1", OracleDbType.Varchar2, 1000))
OraCommand.Parameters(0).Direction = ParameterDirection.Input
OraCommand.Parameters(0).Value = params(2)
OraCommand.Parameters.Add(New OracleParameter("a2", OracleDbType.Varchar2, 1000))
OraCommand.Parameters(1).Direction = ParameterDirection.Input
OraCommand.Parameters(1).Value = params(3)

我观察到的奇怪之处在于,如果有任何错误,我们在for循环中运行这些语句进行一定次数的重试,OraCommand是一个实例变量,因此参数收集不会被清除。

在iteration#1中:添加了参数a1、a2

在iteration#2中:前两个参数已经存在,我们再次添加名为a1和a2的参数。..。

我没有看到问题,当我在每次迭代开始时清除参数收集时,但我无法提出导致问题的理论,有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-12-17 13:32:15

你正在使用ODP.Net,它的工作方式是,.Net C# API只是在C中暴露他们的服务层的包装器,它与OCI (Oracle Call Interface)通信,主要的访问冲突异常来自于他们的服务层或OCI,因为在托管代码(.Net C#)中有访问冲突(AV)是不可行的,CLR不允许这样做。调试问题的更简单的方法是使用Windbg,加载符号,它会指出导致问题的确切方法,这将是非托管代码,但挑战是您将具有大多数公共符号的发布版本,这不会有太大帮助,其他选择是将问题与代码一起发布到Oracle Technet,ODP.Net开发人员可以在那里提供变通和修复。然而,在此之前,在我看来,您的代码存在某些问题:

在循环中,每次以下几行都会添加一个新参数a1和a2

代码语言:javascript
复制
OraCommand.Parameters.Add(New OracleParameter("a1", OracleDbType.Varchar2, 1000))
OraCommand.Parameters.Add(New OracleParameter("a2", OracleDbType.Varchar2, 1000))

由于只有在创建新参数之后才会在索引0和1处设置值和方向,每次迭代都是相同的,所以在每次迭代中,您最终会将两个新参数添加到OracleCommand对象中,并在某个地方扰乱内部结构,因为您所做的是不正确的。正确的方法应该是在循环中遵循代码:

代码语言:javascript
复制
OracleParameter A1 = OracleParameter("a1", OracleDbType.Varchar2, 1000)
A1.Direction = ParameterDirection.Input
A1.Value = params[2]
OracleCommand.Parameters[0] = A1;

OracleParameter A2 = OracleParameter("a2", OracleDbType.Varchar2, 1000)
A1.Direction = ParameterDirection.Input
A1.Value = params[3]
OracleCommand.Parameters[1] = A2;

实际上,代码中的另一个奇怪之处是使用以下代码访问类似于集合的数组:

代码语言:javascript
复制
OraCommand.Parameters(0).Value = params(2)

这在C#中是不可能的,您必须使用方括号[],在我看来您必须使用VB.Net,因为即使您的new不正确,它在C#中也不是New

票数 1
EN

Stack Overflow用户

发布于 2014-12-17 23:28:05

@ it你是对的,代码是用VB.NET编写的;当它试图执行ExecuteNonQuery时抛出了异常。我尝试过WinDbg,它提供了以下功能:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27518442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档