设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1439|回复: 7
打印 上一主题 下一主题

请问:updatebatch和update

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2003-4-1 00:30:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,只知道updatebatch是批更新,但具体区别,可否举一个例子。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2003-4-1 00:48:00 | 只看该作者
与打开的记录集锁定方式有关.

rs.Open "select * from tblProd", CurrentProject.Connection, adOpenKeyset, adLockOptimistic

在上例,其数据库的锁定方式使用的是乐观锁(adLockOptimistic),对应的记录更新方法应为 Update

rs.Open "select * from tblProd", CurrentProject.Connection, adOpenKeyset, adLockBatchOptimistic

而在这一例中,其数据库的锁定方式使用的批量乐观锁(adLockBatchOptimistic),对应的记录更新方法应为 UpdateBatch

对批量乐观锁,可以一次更新多条记录,而乐观锁不行。

不过使用批量乐观锁,最好同时使用ADO事务。

点击这里给我发消息

3#
 楼主| 发表于 2003-4-1 01:06:00 | 只看该作者
多谢!
还有一事请教,使用事务,它的范围可以跨几个过程或函数吗?比如我要同时更新十个记录集(这些是要么全部更新要么全部不更新),我可能要写在五个函数(或过程)内,因为如果写在一个函数内要同时打开十个记录集太难管理(可有好的办法?),然后我再另一个过程中统一调用这五个函数,在这里可以使用事务控制吗?

点击这里给我发消息

4#
 楼主| 发表于 2003-4-1 01:37:00 | 只看该作者
我看了帮助,好像不行,这种对多个记录集更新只能在SQL中用触发器来做,事务只能保证一个记录要么全部更新,要么全部不更新。不知理解是否有误?

点击这里给我发消息

5#
发表于 2003-4-1 17:58:00 | 只看该作者
在 MS 的 ADO 帮助提到:

Recordset 对象支持两种类型的更新:立即更新和批更新。使用立即更新时,一旦调用 Update 方法,对数据所作的所有更改便被立即写入基本数据源。也可以用 AddNew 和 Update 方法将值的数组作为参数传递,同时更新记录中的多个字段。

如果提供者支持批更新,可以让提供者把对多个记录所作的更改存入缓存,然后用 UpdateBatch 方法在单个调用中将它们传送到数据库。这种情况适用于用 AddNew、Update 和 Delete 方法进行的更改。调用 UpdateBatch 方法之后,可以用 Status 属性检查数据冲突并加以解决。

点击这里给我发消息

6#
发表于 2003-4-1 18:05:00 | 只看该作者
下面是MS ADO帮助中示例

' 本范例演示 UpdateBatch 和 CancelBatch 方法。

Public Sub UpdateBatchX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Assign connection string to variable.
        strCnn = "rovider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=saassword=; "

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable
   
    rstTitles.MoveFirst

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
                "Change type to self help?"

            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
            End If
        End If

        rstTitles.MoveNext
    Loop

    ' Ask the user if she wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        rstTitles.UpdateBatch
    Else
        rstTitles.CancelBatch
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original values because this is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
        End If
        rstTitles.MoveNext
    Loop
    rstTitles.UpdateBatch

    rstTitles.Close

End Sub

点击这里给我发消息

7#
发表于 2003-4-1 18:14:00 | 只看该作者
下面是MS ADO帮助中示例:

BeginTrans、CommitTrans 和 RollbackTrans 方法范例 (VB)


本范例更改数据库的 Titles 表中所有心理学书籍的类型。首先,BeginTrans 方法启动一个事务,将所有对 Titles 表做出的更改隔离,然后,CommitTrans 方法将保存更改。可使用 RollbackTrans 方法撤消用 Update 方法保存的更改。

Public Sub BeginTransX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Open connection.
        strCnn = "rovider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=saassword=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Open Titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "titles", cnn1, , , adCmdTable
   
    rstTitles.MoveFirst
    cnn1.BeginTrans

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

            ' Change the title for the specified
            ' employee.
            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
                rstTitles.Update
            End If
        End If

            rstTitles.MoveNext
    Loop

    ' Ask if the user wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        cnn1.CommitTrans
    Else
        cnn1.RollbackTrans
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data because this
    ' is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    rstTitles.Close
    cnn1.Close

End Sub

点击这里给我发消息

8#
发表于 2003-4-1 18:19:00 | 只看该作者
以下是 MS 帮助原文

BeginTrans、CommitTrans 和 RollbackTrans 方法
      

这些事务方法按如下方法管理 Connection 对象中的事务进程:

BeginTrans — 开始新事务。


CommitTrans — 保存更改并结束当前事务。它也可能启动新事务。


RollbackTrans — 取消当前事务中所做的更改并结束事务。它也可能启动新事务。
语法

level = object.BeginTrans()

object.BeginTrans

object.CommitTrans

object.RollbackTrans

返回值

BeginTrans 可以作为函数调用,用于返回指示事务嵌套层次的 Long 变量。

参数

object   Connection 对象。

Connection

如果想要以独立单元保存或取消对源数据所做的一系列更改,请对 Connection 对象使用这些方法。例如,要进行转帐,从一个帐户中减去某个数额并将对等数额添加到另一个帐户中。如果任何一个更新失败,都将导致帐户收支不平衡。在打开的事务中进行这些更改可确保只能选择进行全部更改或不作任何更改。

注意   并非所有的提供者都支持事务。验证提供者定义的属性“Transaction DDL”显示在 Connection 对象的 Properties 集合中,指示提供者支持事务。如果提供者不支持事务,调用这些方法之一将返回错误。

在调用 BeginTrans 方法后,提供者将不再立即提交所作的更改,直到调用 CommitTrans 或 RollbackTrans 结束事务。

对于支持嵌套事务的提供者,在打开的事务中调用 BeginTrans 方法将启动新的嵌套事务。返回值将指示嵌套层次:返回值为“1”指示打开了顶层事务(即此事务未嵌套在其他事务中),返回值为“2”指示打开了第二层事务(嵌套在顶层事务中的事务),依此类推。调用 CommitTrans 或 RollbackTrans 只影响最新打开的事务;在处理任何更高层事务之前必须关闭或回卷当前事务。

调用 CommitTrans 方法将保存连接上打开的事务中所做的更改并结束事务。调用 RollbackTrans 方法还原打开事务中所做的更改并结束事务。在无打开的事务时调用任何一种方法都会产生错误。

根据 Connection 对象的 Attributes 属性,调用 CommitTrans 或 RollbackTrans 方法都可以自动启动新事务。如果 Attributes 属性设置为 adXactCommitRetaining,在调用 CommitTrans 后提供者将自动启动新事务。如果 Attributes 属性设置为 adXactAbortRetaining,在调用 RollbackTrans 后提供者将自动启动新事务。

远程数据服务

BeginTrans、CommitTrans 和 RollbackTrans 方法在客户端 Connection 对象上无效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-21 08:27 , Processed in 0.099368 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表