日期:2014-05-16  浏览次数:20983 次

数据库UPDATE语句的问题
在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();

------解决方案--------------------
原因是这样的,你要搞清楚,不要想不开。

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

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

第一,最简单的办法就是你在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 被执行。但是这样太浪费数据库资源了,大大降低了数据库访问效率,不推荐这种方法。