数据库UPDATE语句的问题

wfcancer 2010-05-01 08:08:31
在VC中,开始运行程序我第一次使用UPDATE语句修改数据库里的一条记录之后。数据库的数据不能立即更新,但是我第二次执行UPDATE语句之后数据库的数据就立即更新了。我的代码如下。我不懂为什么,请您指点
CDatabase db;
CString sql;
db.Open("ODBC;DSN=MS Access Database;DBQ=CarInfo.mdb");
sql.Format("update CarRecord set Other = '%s' where picNum = %d",m_OtherInfo,carNum);
db.ExecuteSQL(sql);
db.Close();
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfcancer 2010-05-16
  • 打赏
  • 举报
回复
顺便还想问一下,因为我现在改用MySQL实现,就不会出现我原来的问题,更新很及时。之前我用的是ACCESS,能稍微解释一下原因吗、?是不是MySQL的引擎机制?
wfcancer 2010-05-16
  • 打赏
  • 举报
回复
特别感谢icansaymyabc,回答的那么详细,真的很感动。我又上了一课。谢谢啦,愿你每天都有好心情。
你真是个高手哦!!!
icansaymyabc 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wfcancer 的回复:]
如果是延迟的话,为什么第一次执行之后,以后再执行UPDATE语句都能立即更新数据?
[/Quote]

第一次执行之前,数据库还没准备好,切换线程的开销较大,因此系统分配给该县城的优先级较低,不至于引发线程切换。

第一次执行之后,数据库就完全准备好了,所有的东西都在内存里,切换开销较小,因此系统分配给该线程的优先级较高,于是就容易发生线呈切换。
icansaymyabc 2010-05-05
  • 打赏
  • 举报
回复
原因是这样的,你要搞清楚,不要想不开。

由于数据库操作是在不同的线程中执行的。当前线程发出数据库操作指令之后,由于时间很短,未发生线程切换和任务切换,就立刻执行到了读取数据的指令,此时你先前发出的操作指令还没有机会被执行,那么读出来的就是旧内容。只有在你的当前线程执行完毕之后,或执行了较长时间之后,系统发生了任务切换,数据库的操作线程才得以执行,数据库的内容才被更新。

要解决这个问题有多个方法:

第一,最简单的办法就是你在UPDATE命令发出去之后 Sleep 一会儿,强行导致系统切换任务,让数据库更新得到执行的机会。
第二,最完美最高效的办法也就是开发商业软件的国际标准做法是充分使用各种事件进行同步处理,让你的线程明确知道数据库操作完成了才继续往下走。但是这样会把问题大大地复杂化,不适合新手。
第三,在 db.ExecuteSQL(sql);之后 不要 db.Close(); 待会儿继续使用 db.ExecuteSQL(“SELECT * FORM table”); 来查询,这样做因为使用了同一个对象,它会按顺序完成指令,所以你会查到更新后的数据。
第四,在 db.ExecuteSQL(“UPDATE ....”); 之后紧接着来一个 db.ExecuteSQL(“SELECT * FORM table”); 再 db.Close(); 因为 SELECT 是同步指令,线程一定要等到结果返回才会继续,而同一个 DB 对象的操作会顺序执行,可以借此保证 UPDATE 被执行。但是这样太浪费数据库资源了,大大降低了数据库访问效率,不推荐这种方法。
wfcancer 2010-05-01
  • 打赏
  • 举报
回复
如果是延迟的话,为什么第一次执行之后,以后再执行UPDATE语句都能立即更新数据?
ACMAIN_CHM 2010-05-01
  • 打赏
  • 举报
回复
ADO 更新时会有时延。
icansaymyabc 2010-05-01
  • 打赏
  • 举报
回复
似乎是计算机的磁盘缓存导致的更新内容未能实事写盘吧

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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