使用实体框架时,试图读取或写入受保护的内存
本文关键字:受保护 内存 读取 实体 框架 | 更新日期: 2023-09-27 18:05:43
类型为'System '的未处理异常。AccessViolationException'发生在StatCentric.Tracker.Worker.dll
附加信息:试图读写受保护的内存。这通常表明其他内存已损坏。
我读了很多关于Stack Overflow和各种博客的文章,似乎找不到解决这个问题的方法。
我在做一些非常基本的事情:
public void Execute(ITrackerRequestModel model)
{
PageviewRequest p = (PageviewRequest)model;
using (var db = new StatCentricEntities())
{
db.SetTimeout(60);
db.sp_Log_PageView2(p.SiteId, p.DateTimeUtc, p.vid, p.QueryString, p.p, p.t);
}
}
但是这个错误弹出每次我试图调用db.sp_Log_PageView2。这似乎只发生在我的工作者角色(我使用Windows Azure)。
同样值得注意的是,我正在使用Windows Azure模拟器,我是在Windows 8.1。
我试过以下方法:
- 正在进行winsocket重置
- 禁用JIT调试(本机、脚本、托管)
- 在模块加载时禁用JIT调试
- 跟进了一些老帖子,修复了一些似乎是。net特有的热点问题
- 做内存诊断,没有问题,以确保它不是我的硬件。
我以管理员身份运行Visual Studio并连接到Azure中托管的远程SQL Server数据库。
如果您对如何解决或进一步诊断此问题有任何想法,我将不胜感激。
这不是真正的修复,但在等待微软修复时,您可以使用此解决方案。
我有同样的问题。我也尝试了各种方法来解决这个问题。几天后,我放弃了,使用手动"变通"。复制和转换现有的进程调用到新的调用只需要几分钟。
忽略自动生成的函数,手动调用存储过程。您可以为返回的数据使用自动生成的类。复制和修改现有的函数,你将很容易得到正确的参数名称和类型。
将部分类实现到不同的文件:
public partial class StatCentricEntities
{
public virtual List<sp_Log_PageView2_Result> my_sp_Log_PageView2(
Guid? siteId,
DateTime time,
string param3,
string param4 )
{
return Database.SqlQuery<sp_Log_PageView2_Result>(
"sp_Log_PageView2 @siteId @time @param3 @param4",
new SqlParameter("siteId", siteId),
new SqlParameter("time", time),
new SqlParameter("param3", param3),
new SqlParameter("param4", param4)).ToList();
}
}
我得到这个"试图读取或写入受保护的内存异常"错误,而使用SQL Server存储过程的输出参数类型为'日期'。我尝试了各种方法都没有成功,为了节省时间,我决定采用下面的解决办法。
1)删除date类型的输出参数
2)通过select语句返回字符串
SELECT CONVERT(char(10), @AsOfDate, 20) AS AsOfDate
3)将存储过程返回的字符串转换为c#中的DateTime值
DateTime asOfDate = DateTime.Now;
using (var context = new DA.MyEntities())
{
var procResult = context.myStoredProcedure(myParameter).FirstOrDefault();
DateTime.TryParse(procResult, out asOfDate);
}
我对这种妥协不是很满意,但它确实让我向前迈进了。