ado联接数据库时, 多人用update table set filed='' where... 进行更新时,如何进行锁定,如何在查询(用select * from table where ...)时就进行锁定,不能让别人可以查询到!

解决方案 »

  1.   

    你说的是有更新操作时,用独占方式访问。
    这个应该是数据库dbms做的事!
    不过ADO的Recordset对象在打开时可以使用这样的参数=================================================================
    adLockReadOnly (默认值)只读 — 不能改变数据。 
    adLockPessimistic 保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录来完成。 
    adLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用 Update 方法时才锁定记录。 
    adLockBatchOptimistic 开放式批更新 — 用于批更新模式(与立即更新模式相对)。 
      

  2.   

    TO:s1ihome
    rs.open sql,conn,1,3
    这样子就可以在查询时锁定,别人不能查询到当前的数据吗?>??
      

  3.   

    可以在SQL中锁定!
    用户,选中用户,权限里面去掉update
      

  4.   

    用非观锁adLockPessimistic的方式来锁定记录集,结合事务处理!!看看以下几种记录集的锁定方式!!adLockReadOnly。指定你不能修改记录集中的记录。 
    adLockPessimistic。指定在编辑一个记录时,立即锁定它。 
    adLockOptimstic。指定只有调用记录集的Update方法时,才锁定记录。 
    adLockBatchOptimstic。指定记录只能成批地更新。
      

  5.   

    只能锁定记录的更新,不能锁定查询(除非你对用户权限作限制,比如使用sql server数据库。access怕是做不到)。楼主的要求忒怪了些!
      

  6.   

    是这样的,我在程序中有二个表,第一个表是存放一个编号,比如tablea(Pid) 第二个表tableb中有一些记录,这些记录有编号,当新加一条记录时,从tablea中取出编号加1为C,在第二个表的的记录的编号就是C,并且要更新tabela中的pid的编号记录为C以为下一条新加的记录使用,
    现在的这样设计,在多个人同时加入数据时,就会有一些加入的记录复盖原先已加入或是别人刚加入的记录!
      

  7.   

    我使用了事务和更新锁,但是还是不行!
    objConn.BeginTrans
                strB = Format(Now, "yyyymmdd")
                objRs.Open "select * from MaxV where Mname ='维修单' and DanJBH like '%" & strB & "%'", objConn, 1, 3
                If Not objRs.EOF Then '表示有
                   strB = strB & CStr(Format(CDbl(Right(Trim(objRs("DanJBH").value), 4)) + 1, "0000"))
                Else
                   strB = strB & "0001"
                End If
                objRs.Close
                strDanJBH = strB
                
                objRsO.Open "select * from MaxV where Mname ='维修单'", objConn, 1, 3
                If Not objRsO.EOF Then
                    objConn.Execute "update MaxV set DanJBH='" & strDanJBH & "'  where Mname ='维修单'"
                Else
                    objConn.Execute "insert into MaxV(Mname,DanJBH) values('维修单','" & strDanJBH & "')"
                End If
                
                '-------------------------
                objRs.Open "select * from fwd where danjFL='维修单' and DanJBH='" & strB & "'", objConn, 1, 1
                If objRs.EOF Then
                objConn.Execute "insert into Fwd(DanJBH,danjFL,RQ) values('" & strB & "','维修单','" & Now & "')"
                Else
                objRs.Close
                objRsO.Close
                GoTo aaaa
                End If
    objConn.CommitTrans
      

  8.   

    我用了如下的二个timer进行测试
    Private Sub Timer1_Timer()
    Dim objRs As New ADODB.Recordset
    Dim aobjRs.Open "select * from test", objConn, 1, 3
    a = CInt(Trim(objRs("test").Value)) + 1
    objRs.CloseobjRs.Open "update test set test='" & a & "'", objConn, 1, 3
    Label1.Caption = a & " 成功"
    End SubPrivate Sub Timer2_Timer()
    Dim objRs As New ADODB.Recordset
    Dim aobjConn.BeginTrans
    objRs.LockType = adLockPessimistic
    objRs.Open "select * from test with (tablockx)", objConn, 1, 3
    a = CInt(Trim(objRs("test").Value)) + 1
    Delay 5  '延迟5秒
    objConn.Execute "update test set test='" & a & "'"
    Label2.Caption = a & " 成功"
    objRs.Close
    objConn.CommitTrans
    'Timer2.Enabled = False
    'Timer1.Enabled = False
    End Sub这二个合起来进行测试,我让timer2用了事务,并延迟5秒更新,另一个timer1在不停的更新,要想办法,让二个timer能使数据同步目前不能同步的!