数据库中的数据发生了变化,如何更新DataSet中的值呢?

Python 2012-08-12 10:22:46
假设有2个程序均可以修改数据库中的数据。那么在A程序更新数据库之后,B程序如何刷新可以获得当前数据库中的值呢?

1.使用dataAdapter.Fill(m_DS.Table[0]),发现每次调用后,数据是被重复追加进表中的。

2.使用主键的方法:
dataAdapter = new MySqlDataAdapter(sSql, m_Conn);
dataAdapter.Fill(m_DS.Tables[0]);
DataColumn[] keys = new DataColumn[1];
keys[0] = m_DS.Tables[1].Columns[0];
m_DS.Tables[1].PrimaryKey = keys;

之后调用dataAdapter.Fill(m_DS.Table[0]),发现数据更新了,没有再追加重复数据。

可是,当数据库中某一条记录被删除,如A程序删除了某条记录,B程序调用Fill后,被删除的数据仍旧存在,没有从DataSet中去掉。

3.使用如下方法:
dataAdapter= new MySqlDataAdapter(sSql, m_Conn);
m_DS.Tables[0].Clear();
dataAdapter.Fill(m_DS.Tables[0]);

此时数据确实完全更新,但是我觉得这种方法会导致每次都是更新全部数据,与数据库通讯量太大,很多是浪费的。尤其是当数据库中存在blob大数据量的数据时,每次更新UI时,获取数据的速度会很慢,其中绝大部分blob的数据是不需要更新的。

请教有没有最佳的办法呢?
...全文
536 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Python 2012-08-15
  • 打赏
  • 举报
回复
谢谢,谢谢,受益匪浅
  • 打赏
  • 举报
回复
你这种缓存,我认为是糟糕的,不是真正的缓存。

不要简单地以为在内存中建一个大表就算是缓存了。缓存管理的核心就是知道如何控制及时刷新缓存数据,避免缓存数据成为脏数据。那么你随便地、不需要的时候就读取过多的数据到内存,只是画蛇添足的做法。

这不是应该有的缓存机制。
  • 打赏
  • 举报
回复
没事你把不需要访问的数据都放到内存中干什么呢?

假设放到内存中访问是很必要的,那么你有怎么会在乎重新加载数据的时间呢?

对于数据缓存不是搞一个大表,而是根据业务查询条件搞各自的缓存单元。例如用户查询“三天内打折的商品信息”,这被缓存在一个Cache缓存单元中;另外又有一个用户查询“当天不打折的商品信息”,这被还存在另外一个Cache缓存单元中。而这两个查询条件(例如就是它们的sql查询语句的md5散列值)就分别是这两个缓存单元的索引key。这样就能分别在不同的业务中多次复用。

尽管这两个缓存单元中有冗余重复的商品信息,也没有关系。而且当后台的“打折商品信息”被修改的时候,这两个缓存单元它们全都自动清除掉了。

而你将所有的未来一个月的打折商品信息弄到一个大表中,它绝大部分是不需要访问到的。弄这么多数据进到内存,貌似好像是没有什么冗余、貌似缓存了数据,其实你的缓存根本没有针对具体业务查询(具体的sql)来复用,你的整个数据集的命中率其实的等于那个最低级的数据的命中率。那么你读取的数据越多,它的价值就越低。
  • 打赏
  • 举报
回复
你要保证每一次访问数据库后填充的DataSet或者DataTable都是新建的,新实例化出来的

因为你现在已经是每次都会访问数据库,那么你要做的就是将查询出来的数据Fill到新的DataSet或者DataTable,再者说之前保存的未更新的数据应该没有太大的意义

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧