最近霉运,有个巨烂的项目要我维护。
发现一个奇怪的问题:
比如在程序中有这么一段代码
id:=100
with query1 do
begin
  close;
  sql.clear;
  sql.Add('delete from ININFO where INID='+''''+Id+'''');
  execsql;
end;
在Delphi中程序Run运行,
  a.假设在数据库ininfo表中有这么条Id=100的数据,那么该条数据应该被删除。
但是很奇怪的是在Run没有退出时,在后查询数据时,该条数据还是存在的。
直到程序退出,数据库才变化。
  b.单步调试时,该语句段已经执行后,我如果在Delphi中Run->program reset,
数据库中不会有任何变化。
  这是为什么?
  后台数据库是Oracle,以前是Sql server是好像没这种情况?
  或者是Database中是不是要设置什么?(程序不是我编写的)

解决方案 »

  1.   

    你的这段程序怎么编译过的?
    sql.Add('delete from ININFO where INID='+''''+Id+'''');
    你的id是integer,怎么与string相加?
      

  2.   

    程序里可能使用了事务。
    在程序正常中止时,执行类似于:
    DataBase1.StartTransaction(开始事务) 的语句,在程序正常中止时,执行类似于DataBase1.Commit(提交事务)的语句。若事务打开,只有在Commit后数据才真正更新,否则数据库会RollBack(回滚)。
    使用Run->program reset菜单程序为异常结束,所以数据没有被更新,你看看是不是这么回事。拿分来:)
      

  3.   

    to netwolfds(晓竹) :
       这是我举的一个小例子,写错了,不好意思。不过这不是主要的。
    to 008009(竹杖芒鞋轻胜马,一蓑烟雨任平生):
       应该不用的。
    to  rabbit1125(兔子):
      对于b可能可以这样理解。(事实我以前在后台是Sql server时,好像没这种情况,执行Sql语句,数据库就有变化。)
     对于b我想不能这样理解,我是在Delphi在Run应用程序,明明已经有提示信息‘删除成功’,但数据库没有变化,直到应用程序正常退出。
     请指教。多谢。