【发布时间】:2014-12-17 04:39:00
【问题描述】:
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 的参数。
...
没有看到问题,当我在每次迭代开始时清除参数集合时,但我无法提出导致问题的理论,有什么想法吗?
【问题讨论】:
-
你的意思是,你尝试将相同的参数传递给一个过程两次,你想知道为什么它不允许?
-
@MikeJM OracleCommand 参数集合接受具有相同名称的参数对象,我试图推断这是否导致我在尝试运行执行 ExecuteNonQuery 函数时访问冲突异常
标签: c# .net oracle oraclecommand