设置LOCK的类型即可  在VB中实现吧  
DIM DATA1 AS RECOARDSET
SET DATA1=NEW RECOARDSET
WITH DATA1
    .OPEN(........
    .LOCKTYPE=.....  //一共有四种值  记不清了 
这样就可以了                 

解决方案 »

  1.   

    谢谢anninghasaiyo(韩古料理-疯了),
    但我说的不是这个意思
    你说的是recordset打开的时候如何确定了访问类型
    我想问的是:
    例:
    用户A打开单据001在修改
    那么,用户B想要打开单据001修改时,就应该得到一条信息,告知用户A在修改单据,不能同时修改,同时,sqlserver也阻止其他用于修改相应的记录。
      

  2.   

    在单据记录中加一个字段锁,用户A修改前将该锁置为False,修改完成后释放,用户B要进行操作前,对该记录锁进行检查.不知此法可行否,我也正在思考该问题.
      

  3.   

    night_cai(菜烟虫):能否讲详细一点,基本思路我也有,问题是如何检测?szdafavb():题目中已经讲过,不希望采取这种方法,用友软件就是采取类似这种方法除开性能问题不讲,假如用户A登陆程序后没有正常退出,那么如何释放该字段?
    在用友里采取了循环检测的方法,客户端不断的刷新服务器端的数据库,五分钟内不能刷新数据,服务器端的应用程序就认为连接中断,需要手工在服务器上清除异常连接,
    也就是说,当某一个工作站在执行程序时死机,那么至少需要等待5分钟,然后在服务器端用管理员密码登陆后才能清除锁定,然后继续执行同样的任务,
    然而,往往问题还在,经常又碰到同样的问题死机,然后再等5分钟,其操作过程真是异常痛苦!
    而且,这种方法,必须要求应用程序时3层结构,普通的C/S结构是无法做到的,
    这种方法也在Sql端也不是强制性的数据保护,需要应用程序来实现其逻辑,可靠性也不是很高。
      

  4.   

    recordset的cursorlocation=aduseclient 时候locktype不能被设定为adLockPessimistic 
    (锁定模式)。但是cursorlocation=aduseserver 时recordset的很多方法又用不了。哪位老大给俺讲一下cursorlocation等于aduseserver时recordset的用法???
      

  5.   

    你提的这个问题我也很想知道,如果有结果也让我自己一下,好吗?[email protected]
      

  6.   

    A在进行数据修改的时候不要用共享锁,就OK了!
      

  7.   

    bafenghan():
    能否再深入探讨一下?你指的共享锁是sqlserver里的吗?
    我想知道,在vb中如何利用sqlserver的锁定功能,最好有源码,
    盼复!!
      

  8.   

    朋友,我向你推荐“Visual Basic 数据库开发大全”这本书
    它具体的见解了锁定数据的方法及各项开发的事项
    你去书店找一下!
    我的Email:[email protected]
      

  9.   

    谢谢zongbing(总兵),
    书我去找,可否告知出版社及作者?
    但是还是希望你能给点提示,
    大家用vb都不是一天两天了,高手点一下,可能胜过看一个星期的书
    希望大家继续讨论,今天又得了点专家分,我再加分,能加多少加多少!
      

  10.   

    一般的锁定,并不能告诉系统是谁锁定的.
    所以用有的方法是解决的一种.
    还有一种,就是再加一个字段,表示用户.
    在SELECT时insert人进去,改好后撤消
      

  11.   

    Read: adLockOptimistic
    Update: adLockPessimistic
    记录有效性:
    使用字段有效性规则限定。
    并使用事务。表锁定,
    只有在系统使用。
    通常不可使用!我个人应您要求仅作以上回答。
    实际就是这样处理的,
      

  12.   

    没人回答?
    这样,我举个实际的例子:
    比如我在做库存系统时,产品入库单需要选择生产包装模块的已包装桶数据,
    每个桶纪录有一个字段标示是否入库
    假如我是单用户,那不会有问题,
    但是加入用户A打开产品入库单,正在操作,尚未存盘时,用户B也打开了产品入库单,这时我希望用户B得到一个消息,告知已有用户在操作产品入库单,让他等一会儿再操作,否则的话可能会造成同一桶号重复入库。
    当然,我可以在桶号表里加一字段,标识是否有用户在编辑,但sqlserver本身有记录、表锁定功能,这样做似乎有点浪费,而且浪费资源,而且假如说用户A没有锁定了纪录后没有正常退出的话怎么办?如何释放记录?希望大家继续讨论,我再加分
    大家有什么好的建议,或者能够推荐一些高手,,我去请,我也给分。看看今天最多能加几分,我再加分!
      

  13.   

    好像没有什么特别好的办法。我的做法是
    server a, client b,client c
    b 在处理时不断刷新 a 中一个锁记录,写下属于 b 的时间纪录(假定1分钟一次)
    b 若非法退出,再启动时自己可以简单的判断出 前b是否存在,并决定是否可以修改产品入库单。
    c 发现有b在处理,且时间间隔小于1分钟,则不能处理,否则刷新 a 中锁记录,写下属于 c 的时间纪录(假定1分钟一次)
    自己写代码处理好累啊,希望有人提出简单方便的办法。
      

  14.   

    苯﹐來個Transactions就行了﹐這么麻煩
      

  15.   

    如果只是需要信息的返回,我建议你去看一下adodb的事件的中的一些错误信息,好好研究一下adodb的error对象!
    在锁定的记录上进行操作ado是有返回信息的,ms还没有懒到这种程度不提供这些信息!
    在msdn中有的!
      

  16.   

    建议使用事务和回退,找本SQL的书看看锁的机制,搞数据库多年不应该问这个问题.
      

  17.   

    事务和回滚我一直在用,sql的锁定机制在存储过程里也用,但我需要的不是在程序update的一刹那判断是否有其他用户锁定,我希望在vb里手动控制锁定动作。
    一个例子:
    目前做的一个项目中,包装线用桶来装线卷,桶有一个状态标志,
    其中:2:表示尚未封口,3:表示已经封口,4:表示已经入库,
    逻辑关系中:
    状态2:桶数据可以调整(加入、取出线卷、封桶),
    状态3:必须有相应的开桶处理后状态回到2,入库处理状态置为4
    状态4:数据不得修改。当我要进行入库处理时,需要挑选符合条件的桶 select 桶号,净重,毛重.... where 状态 = 3
    入库处理过程中,会把选中的桶号状态置为4,入库单保存时将桶号数据存入数据库。可是编辑一张入库单可能很长时间,这期间,假如生产线更改桶数据,要做开桶处理,或者其他站点的使用者也调用入库功能,如果不加处理的话,数据就出错了(生产线更改了桶数据,但是库存取的却是更改以前的数据,或者入库存盘时状态置为4,生产线存盘时又改为2,或者同一桶号重复入库....)类似的情况还很多,目前我用临时表来控制记录锁定,这样非常麻烦,而且效率低,容易出错(上面都讨论过),既然SqlServer提供了锁定的功能,不知能否在vb中用起来。泰山还望指点迷津!
      

  18.   

    如你所说,既然你“希望在vb里手动控制锁定动作”,那么还是用自己加状态标志字段的
    办法来控制操作好。我所写的所有涉及到大用户量操作的系统中,都通过状态标志来记录当前编辑用户。至于清除无效状态(用户死机,或非法退出后,应清除其对应的编辑标志),我的
    办法是在服务器上放了一个定时执行的JOB(SQLSERVER支持每分钟执行),执行一
    个存储过程来清除无效标志。这个存储过程也很简单,通过sp_who取得当前仍然在线的用户,然后与所有需要控制
    编辑的表中记录比较,清除不匹配的,就完了。执行效率很高。
      

  19.   

    如果有好的解决办法,请问可以发给我一下吗?拜托了:[email protected]