1

我从数据库中获取我的实体列表,更改一些属性并尝试在数据库中更新。

using (var cn = new SqlConnection(ConnectionString))
{
cn.Open();
var dataPredicate = Predicates.Field<Data>(f => f.Id, Operator.Eq, new [] {1, 2, 3}); // of course it's for an example 
var data = cn.GetList<Data>(dataPredicate);

foreach (var element in data)
{
     element.Status = StatusEnum.Pending;
     element.LastChange = DateTime.Now;
}

foreach (var activeRequest in data)
{
     cn.Update(activeRequest);
}
cn.Close();
}

我也试过:

var updated = data.Select(s => new Data
{
     Id = s.Id,
     CreateDate = s.CreateDate,
     ForeignId = s.ForeignId,
     LastChange = DateTime.Now,
     Status = RequestStatus.Pending
 });

我得到InvalidOperationException:已经有一个与此命令关联的打开的 DataReader 必须先关闭。

我对其他操作没有任何问题。

我怎样才能正确更新它?

4

1 回答 1

1

cn.GetList<Data>(dataPredicate)返回IEnumerable并且每次您将它与foreach实际的 sql 查询一起使用时都会执行并DataReader用于提供IEnumerable数据。

因此,在您的情况下,您执行DataReader了两次,第二次尝试在仍然打开Update的同一连接上进行查询。DataReader

如果这是可取的行为(数据太多并且您确实想用 来一一加载DataReader),则应使用单独的连接进行Update查询。

另一种选择是将所有数据加载到列表中,然后对其进行迭代,如下所示:

var data = cn.GetList<Data>(dataPredicate).ToList();
于 2014-02-26T08:41:02.967 回答