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是一个实例变量,因此参数集合不会被清除。
在迭代#1中:增加了参数a1,a2 在迭代#2中:前两个参数已经存在,我们再次添加名称为a1和a2的参数。 ...
我没有看到这个问题,当我在每次迭代开始时清除参数集合时,但我无法提出导致此问题的理论,任何想法?
答案 0 :(得分:1)
您正在使用ODP.Net,它的工作方式是.Net C#API只是用C公开其服务层的包装器,它与OCI(Oracle Call接口)进行通信,主要是来自其服务的访问冲突异常层或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
不正确,它也不是New
在C#
答案 1 :(得分:0)
@Mrinal Kamboj你是对的,代码在VB.NET中;尝试执行ExecuteNonQuery时抛出异常。我试过WinDbg,这就是它给出的: