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

6
我在IIS 6服务器上实现ASP .Net应用程序时遇到了麻烦。当用户尝试打开访问数据库的网页时,IIS服务器会抛出“尝试读取或写入受保护的内存”错误,以下是StackTrace:
System.AccessViolationException: 尝试读取或写入受保护的内存。这经常表明其他内存已损坏。 at Oracle.DataAccess.Client.OpsPrm.ResetValCtx(OpoPrmValCtx* pOpoPrmValCtx, Int32 ctxSize) at Oracle.DataAccess.Client.OracleParameter.ResetCtx(Int32 arraySize) at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader() at Oracle.DataAccess.Client.OracleCommand.ExecuteScalar() at Tenaris.FSA.OracleProvider.OracleProvider.ExecuteScalar(String commandToExecute, CommandType commandType, DbParameter[] parameters) in C:\Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.OracleProvider\OracleProvider.cs:line 223 at Tenaris.FSA.DAC.Providers.DataAccessManager.ExecuteScalar(String commandToExecute, CommandType commandType, DbParameter[] parameters) in C:\Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.DataAccessComponent\Providers\DataAccessManager.cs:line 59 at Tenaris.FSA.DAC.Repository.AppointmentWayClientDAL.GetCountRegisters(Boolean onlyEnabled) in C:\Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.DataAccessComponent\Repository\AppointmentWayClientDAL.cs:line 39 at Tenaris.FSA.BusinessComponents.BusinessProcess.AppointmentWayClientManager.GetCountRegisters(Boolean onlyEnabled) in C:\Congelados FSA\FSA 1er Entregable 05052013\Tenaris.FSA.BusinessComponents\BusinessProcess\AppointmentWayClientManager.cs:line 28
这很奇怪,因为该错误不应出现在托管代码中,并且先前版本的站点运行良好。我进行了几次测试,例如在x86平台PC上编译应用程序,从功能版本复制web.config,从功能版本复制Oracle.DataAccess dll,但错误仍然显示。
另外,您应该知道有一个页面实际上成功填充了下拉列表,但是然后页面必须填充网格视图,上面出现了异常。

检查重启服务器应用程序(IIS 6服务器上的应用程序)是否会消除错误......我遇到了同样的问题......有时会发生,通过重新启动服务器,错误就消失了。 - Mohsen Heydari
2个回答

1

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

using(OracleParameter prm = SomeMethodThatCreatesIt(value,paramName))
{
 //extracode
 myCommand.Parameters.Add(prm);
}

So the code had to change to:

OracleParameter prm = SomeMethodThatCreatesIt(value,paramName);
//extracode
myCommand.Parameters.Add(prm);

正如您在堆栈跟踪中看到的那样,问题出现在某些参数的处理过程中。

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


-1

系统已经耗尽了RAM以加载它,因此当它尝试从其他受保护的内存中获取更多时,需要更多的RAM。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接