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()我的应用程序崩溃了,出现了这个异常。上下文是:我们正在尝试执行一个接受两个参数的存储过程,我们对命令文本中的参数使用名称绑定。
示例:
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的参数。..。
我没有看到问题,当我在每次迭代开始时清除参数收集时,但我无法提出导致问题的理论,有什么想法吗?
发布于 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
OraCommand.Parameters.Add(New OracleParameter("a1", OracleDbType.Varchar2, 1000))
OraCommand.Parameters.Add(New OracleParameter("a2", OracleDbType.Varchar2, 1000))由于只有在创建新参数之后才会在索引0和1处设置值和方向,每次迭代都是相同的,所以在每次迭代中,您最终会将两个新参数添加到OracleCommand对象中,并在某个地方扰乱内部结构,因为您所做的是不正确的。正确的方法应该是在循环中遵循代码:
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;实际上,代码中的另一个奇怪之处是使用以下代码访问类似于集合的数组:
OraCommand.Parameters(0).Value = params(2)这在C#中是不可能的,您必须使用方括号[],在我看来您必须使用VB.Net,因为即使您的new不正确,它在C#中也不是New
发布于 2014-12-17 23:28:05
@ it你是对的,代码是用VB.NET编写的;当它试图执行ExecuteNonQuery时抛出了异常。我尝试过WinDbg,它提供了以下功能:

https://stackoverflow.com/questions/27518442
复制相似问题