是否可以仅更新SQLite数据库中那些已更改的属性?

时间:2010-12-23 15:43:58

标签: c# sqlite

这样我正在更新Pupil实体的所有属性。我怎样才能只更新真正改变/弄脏的那些属性......

我知道有一种模式在模型/ viewModel中添加了一个IsDirty标志,但是为每个属性添加了这样的标志吗?然后进行整个检查并动态构建SQLiteParameter Collection是不是有点过多的开销?

只更新ALL会不会更好?

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction())
{
  using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager))
  {
     com.Parameters.Add(new SQLiteParameter("@pupilId", pupil.Id));
     com.Parameters.Add(new SQLiteParameter("@firstname", pupil.FirstName));
     com.Parameters.Add(new SQLiteParameter("@lastname", pupil.LastName));
     com.Parameters.Add(new SQLiteParameter("@gender", pupil.Gender));
     com.Parameters.Add(new SQLiteParameter("@street", pupil.Street));
     com.Parameters.Add(new SQLiteParameter("@city", pupil.City));
     com.Parameters.Add(new SQLiteParameter("@postal", pupil.Postal));
     com.Parameters.Add(new SQLiteParameter("@phone", pupil.Phone));
     com.Parameters.Add(new SQLiteParameter("@email", pupil.Email));
     com.Parameters.Add(new SQLiteParameter("@extrainformation",pupil.ExtraInformation));

     com.CommandText = "UPDATE pupil SET firstname = @firstname, lastname = @lastname, gender = @gender, street = @street," + " city = @city, postal = @postal, phone = @phone, email = @email, extrainformation = @extrainformation WHERE pupilId = @pupilId";
     com.ExecuteNonQuery();
    }
     trans.Commit();
} 

2 个答案:

答案 0 :(得分:0)

对于给定的数据模型,您可以放置​​您提到的IsDirty标志。在大多数情况下,这已经足够了。但是如果由于某种原因你想要每个属性级别,那么你可以使用IsDirty标志(例如一个标志而不是一个bool标志)。无论如何,开销都会在你的数据模型(基础)的某个地方完成......所以一个普通的逻辑会为你处理所有这些开销(写一次并自动在任何地方使用)。

另一种方法是为您创建的每个数据模型创建第二个副本(包含原始值的备份副本)。那么你可以检查它。

如果数据库的i / o时间比你看到的更快,我真的只会考虑这个问题。如果数据模型有很多属性,那么它可能是个好主意。否则,它可能不值得花时间去做。

答案 1 :(得分:0)

是的,您可以跟踪每个已更改的属性,但这不会很有趣,而且代码可能会很快变得非常难看,所以我不会建议它。

在这种情况下,看一下你正在更新的数据类型,我认为增加的开销可能会使你的应用程序变慢,而单个数据库更新就会这样做。

请注意,从数据库中获取单个记录将花费更多时间,然后更新该记录,因此更新一个或11个属性将不会产生太大的差异。 跟踪单个对象/实体可能会有所作为,但这在很大程度上取决于应用程序及其使用情况以及您愿意投入多少时间。