我使用ADO编写的一个软件,单用户操作时,不存在问题。涉及的操作是一个流水表,两个明细表。但是启动两个程序同时录入操作时,后录入的数据无法POST到数据库表里,我使用的ADOConnection,ADOTable都使用的标准属性设置,请教如何设置以便实现多用户操作,互相不冲突!

解决方案 »

  1.   

    不到万不得一的时候不用ADOTable
      

  2.   

    这样好像不行了,用adoquery不行吗?
      

  3.   

    ADOConnection.beginTrans;
    try
    //TODO your code
    ADOConnection.commitTrans;
    Except
    ADOConnection.rollbacktrans;
    end;建议不使用ADOTable
      

  4.   

    哦!大家还不了解,我使用的是ADOQuery,实际上是与ADOTable连接的同一个表
    对ADOQuery的维护实际上影射到了ADOTable里,我想实现ADOQuery的缓存更新,可是ADOQuery没有缓存更新好象。(*开启事务*)
    ADOconnection.BeginTrans;with AdoQuery do
    begin
      Close;
      sql.clear;
      sql.add(' select * from 表名 where 1=2 ');
      Open;  (*维护表数据*)
      Apend;
      FieldByName('字段名').AsString:='字符串';
      try
        Post;  (*特别注意:当第1个用户未提交或回滚,第2个用户在此无限等待*)
      except
      end;
    end;(*提交事务*)
    try
      ADOconnection.CommitTrans;
    except
    end;当然我的代码只是个模型,请大家关注我特别提示的地方,如何避免这种错误
      

  5.   

    你干嘛不直接INSERT INTO 语句呢?
      

  6.   

    ADOConnection里面有个时间设定,默认好像是30秒你试试改小一点,反应会快。
    另外建议在语句中加上去鼠标的外观改变,以提示用户。
      

  7.   

    TO:longtusoft(开泰)
      哎呀 我如果使用INSERT INTO,则事务会自动提交,如果其他表的更改出错,怎么回滚事务呀~  我想过用TABLE,但是需要过滤数据,很麻烦  例如:有一处方编号表,存放当前最新处方编号
      A用户登陆系统,得到处方编号,然后开始事务,录入费用明细,最后写一条流水记录,然后更新处方编号表以便下次使用,最后是提交事务。
      问题是:A用户开启事务后,未提交,未撤消,B用户又启动同一程序进入该模块,开始事务,然后录入数据时,POST时,处于无限等待状态,除非A用户提交或撤消,B的明细数据才能入库。
      大家不妨试试,真心求教!
      

  8.   

    建义用SQL 语句来完成。
    最后不要用APPEND这样的东西
    用SQL SERVER的 INSERT INTO
    如果不带返回值的时候保存就用ExecSQL保存
      

  9.   

    你把ADOQUERY里的LOCKTYPE属性改为ltBatchOptimistic
    只有在OPEN或者EXECSQL后你输入的结果才会保存到表中去的。。
    相当于一个缓存功能
      

  10.   

    说实话,我觉得 loon1981(懒家伙) 说的才有点道理,其他人的提议都不解决实际问题,因为用SQL语句直接更新数据库就无法控制多表事务,其实就应该和ADOConnection ADOTable AdoQuery的属性设置有关系,比如ADOConnection的事务级别、ADOTable AdoQuery的LOCKTYPE等等,但是我不知道应该设置为什么样才好
      

  11.   

    问题已经解决,基本上用的是LOCKTYPE属性为ltBatchOptimistic进行缓存更新的,谢谢大家