我最近在开发中使用ADO.net实体框架访问数据库,一个程序写入一个程序读取,然后发现其中一个读取的程序始终访问不到最新的数据,比如A字段是int 100,然后我的一个写入程序把他改成了90,然后我的读取程序始终读取的是100;如果是更新再次读取的话,或者删除添加可以访问到正常的数据。
搞了半天我以为底层实现是加载到内存表,好比datatable;后来记起.net的GC机制,发现数据访问是属于非托管资源。所以我找到了问题根源是因为没有释放数据访问上下文。于是就重写了代码如下:
/// <summary>
/// 返回工单主数据,异常位空,无数据位空,falg位FALSE时执行全部查询
/// </summary>
/// <param name="dt"></param>
/// <param name="flag">falg位FALSE时执行全部查询</param>
/// <returns></returns>
public IList<T_DisplayMain> GetDisplayDB(DateTime dt, bool flag)
{
try
{
if (flag)
{
//释放资源,避免在同一窗体中取到垃圾数据!!!
using (MideaDisplayDBEntities md = new MideaDisplayDBEntities())
{
//指定日期查询,精确到天
var a = from s in md.T_DisplayMain where s.Time.Value.Year == dt.Year && s.Time.Value.Month == dt.Month && s.Time.Value.Day == dt.Day select s;
return a.ToList();
}
}
else
{
var a = from s in md.T_DisplayMain select s;
return a.ToList();
}
}
catch (Exception ex)
{
LogExecute.WriteDBExceptionLog(ex);
List<T_DisplayMain> a = null;
return a.ToList();
}
}
于是可以访问到最新的数据。虽说不是什么大问题,但却有可以说明之处。以后大家注意下非托管资源的释放问题,可能有些莫名其妙的问题就是由他们引起的。