使用Entity Framework时尝试读取或写入受保护的内存

时间:2014-05-29 19:07:41

标签: c# entity-framework azure access-violation

StatCentric.Tracker.Worker.dll中出现未处理的“System.AccessViolationException”类型异常

附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我已经在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。

我尝试了以下内容:

  1. 进行winsocket重置
  2. 禁用JIT调试(本机,脚本,托管)
  3. 禁用模块加载时的JIT调试
  4. 在一些旧的帖子中找到了似乎特定于.NET的热门修补程序 2.0并停止使用。
  5. 没有问题进行内存诊断以确保它不是我的硬件。
  6. 我以管理员身份运行Visual Studio并连接到Azure中托管的远程SQL Server数据库。

    有关如何解决或进一步诊断此问题的任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

这不是真正的修复,但在等待Microsoft的修复时,您可以使用此解决方法。

我有同样的问题。我也尝试了解决这个问题的一切。几天后,我放弃并使用手动“解决方法”。只需几分钟就可以将现有的sproc调用复制并转换为新的调用。

只需忽略自动生成的函数并手动调用存储过程。您可以将自动生成的类用于返回的数据。复制和修改现有功能,您将轻松获得正确的参数名称和类型。

只需将部分类实现到不同的文件:

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();
    }
}

答案 1 :(得分:0)

我得到了这个&#34;尝试读取或写入受保护的内存异常&#34;使用具有类型&#39;日期&#39;的输出参数的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);
}

我对这种妥协并不十分满意,但它确实让我向前迈进。