C/S结构的程序,服务器数据库用的Access,没办法,人家要求用。
怎么解决多个客户程序同时对服务器上的数据库进行修改操作的问题???

解决方案 »

  1.   

    这是我转载别人的,你看看吧,应该很有用
    为了把问题描述得更详细一些, 我做了一个测试,放一个adoquery (select * from table1); 三个字段.
    adoquery-->连接到adoconnection,
    datasource连接 adoquery1,放一个dbgrid,控件,再放一个增加,一个修改 ,一个删除按钮.dbgrid的datasorce连接到datasource1, 我在form1的create事件里 with adoquery1 do
    begin
      active:=false;
      sql.clear;
      sql.add('select * from table1');
      active:=True;
    end;显示正常,1。点击添加操作; procedure Tform1.button1click(sender:object); //添加;
    begin
      Form2:=Tform2.create(application);
      Form2.option:=0;  //表示添加;
      adoquery1.append;
      Form2.showmodal;
    end; procedure Tform1.button1click(sender:object); //添加;
    begin
      Form2:=Tform2.create(application);
      Form2.option:=1;  //表示修改;
      adoquery1.edit;
      Form2.showmodal;
    end;
    进入Form2后,(我在form2放了两个 dbedit用于显示数据.编辑数据);另外还有一个确定按钮, 一个取消按钮.Public
    option:integer;Procedure Tform2.button1click(sender:object); 确定
    begin
       Try
       Adoconnection.Beginstran;
       ADOQUERY1.POST;
       Adoconnection.commit;
       except                   
       showmessage('删除不成功');   1.//这里的数据库错误类型是怎样确定的。
       Adoconnection.rollback;
       end;
    end;问题:
    不知道我上面写的是否合理,请大家指教。 我在单用户环境操作是没有问题的。
    但当两个用户(我故意这么测试, A用户点击该模块的Form1增加按钮, B用户也点击该模块的增加按钮, 这样当其中一个用户A先点击Form2“确定”
    保存成功,
    但是当B用户点击“确定”按钮时, A用户其实已经修改了数据,B用户此时操作将不成功, 事务回滚。
    ?这个事务回滚的原因是什么。语句怎样写。大家是怎样控制的。
      

  2.   

    恩!这样的,你如果设计的数据库有一个自动编号的字段就好办了 那样可以尽量减少出错的几率!为什么会有你说的问题呢,因为ADO的执行原理是把数据库里的数据保存在本地缓存里,然后你修改数据后 他就按照这条数据的原始记录到数据库里去搜索 因为A把数据改变了 所以B会有一个错误 这个时ADOQUERY的ONPostError事件发生了 你可以在这里做一些处理 Action属性可以让你对当前的记录是否还继续更新做出判断 。如果是事务保护那就比较容易了 是在ADOQUERY里做的的
    在ADOQUERY的 ONBeforePost里写ADOConnection1.BeginTrans; 然后在OnAfterpost里写 ADOConnection1.CommitTrans; 最后在OnPostError里写ADOConnection1.Rollback;就可以了