form1:Tform
query1:d:\date.mdb(ODBC)
datasource1:query1
date.mdb每次都是从一个模板目录中(c:\data.mdb)拷贝过来的,也就是说对data.mdb进行操作的时候,data.mdb都是空数据库.对data.mdb操作完之后拷贝到另外一个目录(e:\date.mdb).
流程大概如下(节省了许多判断以及interface中的一些调用).
************
formshow代码:
//将模板目录的空白数据库拷贝到当前目录
copyfile('c:\data.mdb','d:\data.mdb',false);
************
主代码button1.click:
//对t_user进行插入
with query1 do
begin
  close;
  sql.clear;
  sql.add('insert into t_user (id,name,password) values (:id,:name,:password)');
  parambyname('id').asinteger:=1;
  ....(省略)
  execsql;
end;
//对day_balance进行插入
with query1 do
begin
  close;
  sql.clear;
  sql.add('insert into day_balance(cur_day,status) values(:cur_day,:status)');
  parambyname('cur_day').asstring:='20050725';
  parambyname('status').asstring:='0';
  execsql;
end;
shellexcute();//调用加密算法
while not fileexists('e:\data.mdb') do
begin
  copyfile('d:\data.mdb','e:\data.mdb',false);
end;
//将空白模板数据库拷贝到ODBC链接的数据库,以便下次操作.
copyfile('c:\data.mdb','d:\data.mdb',false);
**************
问题出现了,当第一次运行程序的时候,插入t_user和day_balance的数据都正常,但是不退出程序,继续打开form1运行的时候,t_user的数据正常,但是day_balance的数据就是空的.(但程序始终都没有报错)
设定了断点,step运行时却发现,
//对day_balance进行插入
with query1 do
begin
  close;
  sql.clear;
  sql.add('insert into day_balance(cur_day,status) values(:cur_day,:status)');
  parambyname('cur_day').asstring:='20050725';
  parambyname('status').asstring:='0';
  execsql;
end; 
这段程序返回的结果都是空的.
我就郁闷了,既然delphi能让这段程序正常运行下去,为什么会对day_balance不能插入数据呢.****************
个人想法:
只要delphi开始运行,ODBC链接的数据库d:\data.mdb就会产生一个data文件,文件类型是access.lockfile.9  ,此时delphi程序是不是应该在每次对数据库进行操作完之后进行释放???
如何释放???
请各位大侠指教.以前都是对固定的数据库进行操作,现在碰到这样的问题,真的脑壳痛啊55555555555

解决方案 »

  1.   

    第二行应改为query1:d:\data.mdb(ODBC),这只是笔误.不好意思
      

  2.   

    mdb每次打开时都会生成一个临时文件,所谓的“Microsoft Office Access 记录锁定信息”,关闭文件的时候就会自动删除,如果是数据库访问的方式,则最后一个数据库连接关闭的时候才会自动删除。如果文件打开的情况下拷贝文件,有可能会有信息丢失。
      

  3.   

    兄弟们,请给点解决问题的办法吧.楼上的说法很正确,但是现在火烧眉毛了,只要能解决问题,什么事情都好多.其实大家都说ADO怎么好用,但是万丈高楼平地起,总得从基本的开始吧!
      

  4.   

    一般来说,ODBC链接的数据库是固定的,一成不变的.所有的操作都是同一个数据库文件.
    而现在每次对数据库操作之前,都要从一个模板目录中将空白的数据库文件拷贝过来.
    大侠们帮忙啊!
      

  5.   

    实际上你可以不用ODBC的,而是直接连接MDB文件,因为你知道存放位置的,我曾经帮一个朋友重写它的一个软件(不能换数据库和操作流程),就用过这个方法,
      

  6.   

    你的MDB数据库文件是一直在变的,但是文件名称是不变的,是吧。可以打开form1时(或其他你开始进行数据库操作的地方)连上数据库,然后在操作完了就把连接断掉(所有连接都断掉)。这时再拷贝啊什么的。下次再重新连上数据库操作,不知道是不是这个意思
      

  7.   

    我试了一下,没发现问题,ODBC的也一样的。
    搂主检查一下表 day_balance 中的 cur_day 和 status 的数据类型是不是和程序中定义的不一样?
    应该不是query的问题。
      

  8.   

    谢谢各位在百忙之中来帮我解决问题.特别要感谢 tjianliang(乡关何处).问题解决了,忘记告诉大家了,我在登陆窗口form_login设置database.
    在主代码button1开始部分加入:
    form_login.database.connection:=true;
    在shellexcute();//调用加密算法语句前面加入:
    form_login.database.connection:=false;这样每次copyfile之前都断开了数据库data.mdb
    程序这样修改之后,一切正常了.结帖了.晚上喝了2杯啤酒庆祝了一下.