尝试在.NET应用程序中读取或写入受保护的内存

Har*_*ela 6 c# asp.net iis-6 oracle10g access-violation

我在IIS 6服务器中实现和ASP .Net应用程序时遇到了麻烦.

当用户尝试打开访问数据库的网页时,iis服务器会抛出"尝试读取或写入受保护的内存"这是StackTrace:

System.AccessViolationException:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.at Oracle.DataAccess.Client.OpsPrm.ResetValCtx(OpoPrmValCtx*pOpoPrmValCtx,Int32 ctxSize),位于Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn,IntPtr errCtx,Int32)的Oracle.DataAccess.Client.OracleParameter.ResetCtx(Int32 arraySize)在Tenaris.FSA的Oracle.DataAccess.Client.OracleCommand.ExecuteScalar()上的Oracle.DataAccess.Client.OracleCommand.ExecuteReader()处的Oracle.DataAccess.Client.OracleCommand.ExecuteReader(布尔请求,布尔fillRequest,CommandBehavior行为)中的arraySize) .OracleProvider.OracleProvider.ExecuteScalar(String commandToExecute,CommandType commandType,DbParameter []参数)在C:\ Congelados FSA\FSA 1er中可入侵05052013\Tenaris.FSA.OracleProvider\OracleProvider.cs:第223行在Tenaris.FSA.DAC.Providers C:\ Congelados FSA\FSA 1er中的.DataAccessManager.ExecuteScalar(String commandToExecute,CommandType commandType,DbParameter []参数)Entvable 05052013\Tenaris.FSA.DataAccessComponent\Providers\DataAccessManager.cs:第59行a t Tenaris.FSA.DAC.Repository.AppointmentWayClientDAL.GetCountRegisters(Boolean onlyEnabled)位于C:\ Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.DataAccessComponent\Repository\AppointmentWayClientDAL.cs:第39行:Tenaris.FSA.BusinessComponents.BusinessProcess .AppointmentWayClientManager.GetCountRegisters(Boolean onlyEnabled)在C:\ Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.BusinessComponents\BusinessProcess\AppointmentWayClientManager.cs:第28行

什么是罕见的,因为该错误不应该出现在托管代码中,并且该站点的先前版本工作正常.我做了几个测试,比如在x86平台电脑上编译应用程序,从功能版本复制web.config,从功能版本复制Oracle.DataAccess dll,但错误仍然显示.

您应该知道的另一件事是,有一个页面实际上已经成功填写了一个下拉列表,但是页面必须填充gridview并且出现上述异常.

Har*_*ela 1

我终于可以解决这个问题了,另一个开发人员在创建 OracleParameters 时使用了“using”子句,就像:

using(OracleParameter prm = SomeMethodThatCreatesIt(value,paramName))
{
 //extracode
 myCommand.Parameters.Add(prm);
}
Run Code Online (Sandbox Code Playgroud)

所以代码必须改为:

OracleParameter prm = SomeMethodThatCreatesIt(value,paramName);
//extracode
myCommand.Parameters.Add(prm);
Run Code Online (Sandbox Code Playgroud)

正如您在堆栈跟踪中看到的,问题出在参数的某些进程上。

所以,代码是在使用对象之前处理该对象。我不明白的是为什么这甚至可以在我的测试之一的控制台应用程序中工作,但现在它可以工作了,谢谢大家