我有一个MVC5项目,分为主XXXX.Site和XXXX.Data dll,EF6连接到MS-SQL 2014数据库。
当我在MVC控制器上并在XXXX.Data dll内运行的呼叫时按F10,一切顺利。如果我进入DLL代码并在实际的EF调用上放置一个断点... Visual Studio简直就是炸弹了。
我尝试了不同的东西,比如在DLL和MVC网站上重新添加EF6.1.1.1,但没有任何作用。我尝试删除然后添加完全EF。我尝试了一个新项目,只是把代码运行一个简单的存储过程,我甚至尝试将Data.dll组合到MVC站点代码中,将所有数据库访问移动到MVC站点(主要是删除了DLL本身)......但是什么都没有用!!
这是我到目前为止注意到的:
1)如果我在我编写的代码上设置一个断点来调用这个存储过程...... Visual Studio只是炸掉了。
try
{
using (MyDB db = new MyDB())
{
// IF BREAKPOINT IS ON LINE BELOW, EXECUTION STOPS ABRUPTLY
db.MyStoredProc(value1, value2);
}
}
catch (Exception ex)
{
string s = ex.Message;
return false;
}
没有引发异常,当它发生时,浏览器会闪烁几次。然后在“输出”窗口中显示此消息:
XXXX.Data.dll中出现'System.AccessViolationException'类型的第一次机会异常
2)如果我把断点放在实际自动生成的EF6代码中,程序会正常运行。
public virtual int MyStoredProc(string value1, string value2)
{
var value1Parameter = value1 != null ?
new ObjectParameter("Value1", value1) :
new ObjectParameter("Value1", typeof(string));
var value2Parameter = value2 != null ?
new ObjectParameter("Value2", value2) :
new ObjectParameter("Value2", typeof(string));
// IF BREAKPOINT IS ON LINE BELOW, EXECUTION RUNS NORMALLY
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoredProc", value1Parameter, value2Parameter);
}
请注意,我在两个bin文件夹(MVC和DLL)上都有EntityFramework和EntitySQLServer dll。
问题:
这是SQL2014的问题吗?连接到SQL2012时,我没有发生这种情况
是否有设置显示实际发生的异常?
为什么VS轰炸而不是显示实际错误?
答案 0 :(得分:0)
我得到了这个"尝试读取或写入受保护的内存异常"使用具有类型'日期'的输出参数的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);
}
我对这种妥协并不十分满意,但它确实让我向前迈进。