delphi中的adoquery是将数据库中的数据先取到本地再进行操作,如果两个客户端对同一条记录进行更新操作,则第一个客户端post后,第二个客户端再进行post操作,这样会出错!
由于adoquery是先将数据取到本地来再进行操作,一个客户端在不重新读库的情况下就看不到其它客户端进行的操作(只能看到取到本地的数据),如果读库则会影响速度(数据量大的情况下).如:一个客户端做完了1销售号单,另一个客户端做完了2号销售单,则第一个客户端看不到2号销售单,怎样才能看得到呢,有什么合理的处理方法,急!急!急!

解决方案 »

  1.   

    to Geranium
      是用adoquery.refresh吗?这样不就是重新读库了吗?
      

  2.   

    LOCK TABLE [TableName] IN [LockType] MODE
      

  3.   

    由于adoquery是先将数据取到本地来再进行操作,一个客户端在不重新读库的情况下就看不到其它客户端进行的操作(只能看到取到本地的数据),如果读库则会影响速度(数据量大的情况下).如:一个客户端做完了1销售号单,另一个客户端做完了2号销售单,则第一个客户端看不到2号销售单,怎样才能看得到呢,有什么合理的处理方法,急!急!急!
    这个问题怎么处理呢?
      

  4.   

    数据库并发访问控制中的加锁应该是冲突的情况下(比如写写操作)才用的吧;而且一个写一个读的情况下,只要不是同一行应该没问题吧(ACCESS这种不能加行级锁的除外),我的理解是这样的。不知道对不对。
        LOCK TABLE [TableName] IN [LockType] MODE 这样加锁别人还能访问么?
        关注......
      

  5.   

    LockType:SHARE:阻止多个并发应用事务对指定表进行除只读操作以外的操作,即其他并发事务只能执行读操作。EXCLUSIVE:阻止多个并发应用事务对指定表同时执行任何方式的操作,包括读操作。即使其他并发事务不能执行任何操作。
      

  6.   

    LockType:SHARE:阻止多个并发应用事务对指定表进行除只读操作以外的操作,即其他并发事务只能执行读操作。EXCLUSIVE:阻止多个并发应用事务对指定表同时执行任何方式的操作,包括读操作。即使其他并发事务不能执行任何操作。
      

  7.   

    在对表进行修改操作前使用LOCK TABLE [TableName] IN SHARE MODE
      

  8.   

    由于adoquery是先将数据取到本地来再进行操作,一个客户端在不重新读库的情况下就看不到其它客户端进行的操作(只能看到取到本地的数据),如果读库则会影响速度(数据量大的情况下).如:一个客户端做完了1销售号单,另一个客户端做完了2号销售单,则第一个客户端看不到2号销售单,怎样才能看得到呢,有什么合理的处理方法,急!急!急!
    这个问题怎么处理呢?
      

  9.   

    我提个建议,你试下看吧:
    1。动态刷新,这样会要求你的表的数据量,大的话可能速度较慢,小的话应该没问题。
    2。将adoquery有记录数设为1,或与数据库保持同步。你试下2吧。祝你好运!!!
      

  10.   

    《Deelphi7高校数据库开发》有详细介绍
      

  11.   

    to dext
      那本书是李维写的吗?李维的新书?
      

  12.   

    我的只是两层的c/s呀!
    数据库是用sql server2000,用adoquery去连的!!
    而adoquery是先将数据取到本地再进行操作的,不是实时地和库连的!!这种做法是正确,不然经常读库可能会影响速度,但这样两个客户端的数据不就不统一了吗?
    如:在一号客户端销售的单子,客户到二号客户端去销退,二号客户端根本没有一号客户端的数据(在没有重新连库的情况下),这样就会有问题,总不可能让客户在几号台买的东西去几号台销退吧?
    你们说呢?唉,好急呀!!!!!!
      

  13.   

    写标志,beforepost中先检查,如果发现修改了,请求确认
      

  14.   

    可以有两种办法
    1 ado的事务处理,事务不结束,别人不能修改
    2 SQL Server的加锁功能
      例如:SELECT au_lname FROM authors WITH (TABLOCKX)
      

  15.   

    我不知道你是否试了我给你的建议:
     2。将adoquery有记录数设为1,或与数据库保持同步。我查了下我做的处理,是这样的:
      将adoquery的CacheSize设为1,CursorLocation设为clUseServer,CursorType设为ctDynamic。  不过,我没有用DBGRID,而是自己一次处理一条记录,这样,当记录指针移动时,显示的值就都是数据库中当前的实际内容。  不知你的数据库有多大,记录数有多少,网络环境如何,实际应用效果会怎么样,我的目前还没觉得有什么问题。
      

  16.   

    忘了说一句,每个客户端只要移动了记录指针,就能获取最新的数据。这应该和你的要求应该相差不远,你也可以将你的数据发给我一份,我测下实际应用效果。
     [email protected]
      

  17.   

    無需用Post,直接用SQL語句Update tablename set fieldname=value where ......
    這樣就不會出錯了.
      

  18.   

    try
      adoconnection.begintrans;
      adoquery.post;
      adoconnection.committrans;
    except
      on EDatabaseError do                                //捕获事务提交错误异常
      begin
        Form_DM_Connection.ADOConnection1.RollbackTrans;              //回滚事务
        Form_accident_vehicle.DBGrid.SetFocus;
      end;
    end;
    捕获事务提交错误异常时可以给出提示
      

  19.   

    adoquery属性中的cursortype是数据库游标的位置,也可以理解为ADOQ在什么地方建立数据缓冲区,共有几个值:
    ctUnspecified : 不指定游标类型.
    ctOpenForwardOnly:仅向前移动的游标,对于仅顺序向前读的记录集巨好.
    ctKeyset: 键值游标. 不允许其他用户添加记录,而且其他用户删除的记录也不能访问.
    ctDynamic       :动态游标,其他用户的修改,添加,删除都允许,也可以移动记录指针
    ctStatic       静态游标看不到其他人的修改常用于报表处理.游标位置在客户端时,只有这一种有效.
    不知道说的是否对,我对英文的理解和平时用的做法是这样.
    因些,你的问题中是游标在服务器,而且cursortype用ctDynamic.关于你的第二个问题,你可以在OnWillMove和OnEndOfRecordset事件添加控制代码.火神六号兄给我的答复!!!大家不懂的可以参考!!
      

  20.   

    还有一个问题就是:用dbnavigator来浏览数据表时,明明到了数据表的最后一条,但是dbnavigator的向下键还是能按下,按下后才会变灰,但是记录不会走,因为已经是数据表的最后一条,但是采用了游标在服务器,而且cursortype用ctDynamic.时,到最后一条时,再按向下键时,还能向后走,这时是空的记录,这样会造成我的赋值有问题(根本就不会有空记录呀)!!
    要解决的问题:能否控制dbnavigator在到了最后一条记录后next键就变灰,而不用再按一下再灰。
    不处理的话,在游标是在client时只是多按一下,而游标在server时就会走向一条空记录(会出问题),请问有什么解决办法没?
      

  21.   

    关注.
    我也同样的问题在:
    http://expert.csdn.net/Expert/topic/2113/2113565.xml?temp=.8411371还没有解决!!
    望各位大虾关注
      

  22.   

    要解决的问题:能否控制dbnavigator在到了最后一条记录后next键就变灰,而不用再按一下再灰。回复:
    dbgrid.readonly:=true;
      

  23.   

    如:一个客户端做完了1销售号单,另一个客户端做完了2号销售单,则第一个客户端看不到2号销售单,怎样才能看得到呢,有什么合理的处理方法,急!急!急!回复:dbgrid中显示最后10条或者当天的记录。
    同步。
    删除、递交、修改前刷新dbgrid。
    不要用dbnavigator,放几个按钮,分别执行edit post delete。------简单就好。子弹可以解决的问题,就不要用刀、用剑来解决。 ^_^
      

  24.   

    cursorlocation 一定要设置为cluserserver.才可以设置CursorType:=ctDynamic但在网络里执行效率太慢
    只有这种方法才能保证客户端的数据一致性吗?
      

  25.   

    是的,只有这种方法。关于记录指针移动的问题,由于你用的导航条它就是检测数据集的EOF属性,所以也只能是这个处理过程,而且你自己去控制的话会很麻烦,所以我的建议是不用这个玩意,自己做吧,代码不会很多。