我们有一个从Oracle数据库中提取数据的代码。从数据库返回的数据是XML格式的,它作为ref游标返回,因为它可能包含多个XML。每个xml文件大小大约为5-7MB,但当文件大小超过25MB时,我们会从读取器抛出异常。
抛出的异常是-";System.AccessViolationException:试图读取或写入受保护的内存">
C#端的代码很简单——我们从数据库中提取数据作为ref游标,并使用OracleReader读取ref游标。当我们尝试使用get reader将xml提取到xmldocument中时,这是我们在尝试读取大量数据时获得System.AccessViolationException的地方。
using (var cur= (OracleRefCursor)cmd.Parameters["cur_xml"].Value)
{
if (!cur.IsNull)
{
OracleDataReader rdr= cur.GetDataReader();
while (rdr.Read())
{
XmlDocument x = new XmlDocument();
x.LoadXml(rdr.GetString(0));//this line above throws the System.AccessViolationException
}
}
}
任何针对大数据修复此问题的建议。
感谢所有回复建议以解决问题的人。
然而,通过在这里和那里的一些研究,我能够自己解决这个问题。由于我们使用的是Oracle数据库,所以我们在DAL层中引用了Oracle.DataAccess。
我将引用从Oracle.DataAccess切换到Oracle.ManagedDataAccess,这样我就能够解决这个问题,并且无论我们从DB中检索到多大的XML(提取了大约35-40MB的XML文件(;System.AccessViolationException:试图读取或写入受保护的内存"问题(目前(。
我不知道这个解决方案是否适用于每个人,因为他们需要首先找出错误的根本原因并采取相应的行动。对我来说,每当我试图从使用阅读器的读者那里提取细节时。GetString(0(,它引发了异常。
希望这对像我这样面临类似问题的人有帮助
谢谢!