大概是这样的:
do 
    查询某表某字段,得到一个字符串
    
    处理改字符串,得到更新语句
    
    call conn.execute(更新语句)
loop问题是,某次更新的数据会是之后某次要查询的,这种情况下,查到的却只是更新前的值。。~ 这样的结果是,循环之后,只有对该数据的最后一次更新有效。请问,如何查询得到刚更新的数据?

解决方案 »

  1.   

    For i = xx To xx
                                 rs.AddNew                             rs.Fields("xx") = yy         
                                 rs.Fields("xx") = yy
                                 rs.Fields("xx") = yy                             
                                 rs.Fields("xx") = yy
                                 rs.Fields("xx") = yy                             rs.Update
    Next
      

  2.   

    do 
    查询某表某字段,得到一个字符串

    处理改字符串,得到更新语句

    call conn.execute(更新语句)
           rs.Requery
    loop
      

  3.   

    我改了许多种结果集打开参数。仍然只是看到更改前的数据。
    '连接串 = "Provider=SQLOLEDB.1;" & _
              "Persist Security Info=False;" & _
              "Initial Catalog=mainDB;" & _
              "Data Source=" & CmbServer.Text & ";" & _
              "User ID=" & TxtUserName.Text & ";" & _
              "Password=" & TxtPassword.Text & ";"
    Do
        ColName = tmpArray(0)
        
        Set tmpRs = New ADODB.Recordset
        tmpRs.Source = 一个拼接得到的 SELECT 语句
        
        tmpRs.CursorLocation = adUseClient '此处也尝试了服务端的游标。
        
        tmpRs.Open , Conn, adOpenDynamic, adLockOptimistic, adCmdText 
                '此处尝试了所有的 CursorType ,分别尝试了权限最为开放的两个 LockType 。
        
        If tmpRs.State = adStateClosed Then Exit Do
        If tmpRs.RecordCount = 0 Then tmpRs.Close: Exit Do
        If Not tmpRs.BOF Then tmpRs.MoveFirst
        
        StrWorkOn = tmpRs(0) '目的就是为了取得目标字段的字符串放进这个变量。
        
        tmpRs.Close
        Set tmpRs = Nothing
        
        
        '---------------------
        '此处处理 StrWorkOn 。
        '---------------------
        
        
        Conn.Execute 一个拼接得到的 UPDATE 语句
        
        '进行循环增量处理,也因此得到新的用于拼接的片断
    Loop效果依旧。。我该怎么办呢??
      

  4.   

    Option Explicit
            '处理 StrWorkOn:
            '简化了字符串的处理,只是简单地加个前置标记。
            '此处实际使用的代码完全是对字符串进行处理的过程,结果失败。
            '却在这个简缩的版本中(当然,换了数据库表)能够正常工作。#Const DebugHalt = 0
    #Const DebugViewTraceInfo = 1Private Sub Main()
        
        
        Dim Conn As New ADODB.Connection
        Dim Rs As New ADODB.Recordset, tmpRs As ADODB.Recordset
        Dim I As Long, CurLangID As Long, YWID As Long
        Dim ColName As String, StrWorkOn As String, SQLStr As String
        
        Const RecCount = 5
        
        Conn.ConnectionString = "Provider=SQLOLEDB.1;" & _
                                "Persist Security Info=False;" & _
                                "Initial Catalog=aa;" & _
                                "Data Source=abc;" & _
                                "User ID=;" & _
                                "Password=;" & _
                                "Prompt=Complete"
        Conn.Open
        
        '这两个是运行时的参数。
        CurLangID = 1033
        YWID = 864
        
        '建对象
        SQLStr = "create table LocateTable (" & vbCrLf _
               & "  Idx         int          not null identity(1, 1)" & vbCrLf _
               & " ,TblID       int          not null" & vbCrLf _
               & " ,WhereClause varchar(200) not null" & vbCrLf _
               & ")" & vbCrLf
        Conn.Execute SQLStr
        
        SQLStr = "create table TargetTable (" & vbCrLf _
               & "  Idx     int          not null identity(1, 1)" & vbCrLf _
               & " ,Content varchar(100) null" & vbCrLf _
               & ")" & vbCrLf
        Conn.Execute SQLStr
        
        '初始化数据
        For I = 1 To RecCount
            Conn.Execute "insert into TargetTable (Content) values('[Beginning]')"
        Next
        For I = 1 To 4 * RecCount
            Conn.Execute "insert into LocateTable (TblID, WhereClause) " & vbCrLf _
                         & "values(object_id('TargetTable'), 'WHERE Idx = " & CStr(I Mod RecCount + 1) & "') "
        Next
        
        '读取定位信息
        Rs.Source = "SELECT WhereClause, object_name(TblID) AS TblName FROM LocateTable a "
        
        Rs.CursorLocation = adUseClient
        
        Rs.Open , Conn, adOpenForwardOnly, adLockReadOnly, adCmdText
        If Rs.State = adStateClosed Then GoTo EndOfSubMain
        If Rs.RecordCount = 0 Then Rs.Close: GoTo EndOfSubMain
        If Not Rs.BOF Then Rs.MoveFirst
        
        I = 0
        
        
        '分析并写入
        
        Do While Not Rs.EOF
            
            '查:
            '这里和我实际使用的代码没有任何操作上的区别
            
            ColName = "Content"
            
            Set tmpRs = New ADODB.Recordset
            tmpRs.Source = "SELECT " & ColName & " " & vbCrLf _
                         & "FROM " & Rs("TblName") & " " & vbCrLf _
                         & Rs("WhereClause") & " "
            
            tmpRs.CursorLocation = adUseClient
            
            tmpRs.Open , Conn, adOpenDynamic, adLockOptimistic, adCmdText
            If tmpRs.State = adStateClosed Then Exit Do
            If tmpRs.RecordCount = 0 Then tmpRs.Close: Exit Do
            If Not tmpRs.BOF Then tmpRs.MoveFirst
            
            StrWorkOn = tmpRs(0)
            
            tmpRs.Close
            Set tmpRs = Nothing
            
            
            
            '处理 StrWorkOn:
            '简化了字符串的处理,只是简单地加个前置标记。
            '此处实际使用的代码完全是对字符串进行处理的过程,结果失败。
            '却在这个简缩的版本中(当然,换了数据库表)能够正常工作。
            StrWorkOn = "(" & I & ");" & StrWorkOn
            
            
            
            '回写:
            '这里和我实际使用的代码没有任何操作上的区别
            SQLStr = "UPDATE " & Rs("TblName") & " " & vbCrLf _
                   & "SET [" & ColName & "] = '" _
                          & Replace(StrWorkOn, "'", "''") _
                          & "'" & vbCrLf _
                   & Rs("WhereClause")
            
            #If DebugViewTraceInfo Then
                Debug.Print String(40, "-")
                Debug.Print "[Update Source:]"
                Debug.Print SQLStr
                #If DebugHalt Then
                    Debug.Assert False
                #End If
            #End If
            'Call Conn.BeginTrans
            Call Conn.Execute(SQLStr)
            'Call Conn.CommitTrans
            
            I = I + 1
            Rs.MoveNext
        Loop
        
        Rs.Close
        
        
        '查看结果
        Debug.Print String(60, "=")
        Debug.Print "[Result]"
        Debug.Print "Idx", "Content"
        
        Rs.Source = "select * from TargetTable"
        Rs.Open , Conn, adOpenForwardOnly, adLockReadOnly, adCmdText
        If Not Rs.BOF Then Rs.MoveFirst
        Do While Not Rs.EOF
            Debug.Print Rs("Idx"), Rs("Content")
            Rs.MoveNext
        Loop
        
    EndOfSubMain:
        
        '回收
        Conn.Execute "drop table LocateTable"
        
        Conn.Execute "drop table TargetTable"
        
        Rs.Close
        
        Conn.Close
        
    End Sub
      

  5.   

    现在实际问题已经解决,方法是查询字段的结果集也用于更新操作。就是打开 tmpRs 后不立即关闭,并用它进行更新操作。
    但具体造成这种更新不即时可见的原因还不清楚。
    另外。虽然对字符串的处理操作中不需要访问数据库,但在此处,数据库字段可见是比较危险的。或许后续工作会推出这个分析处理字符串的部分为独立的方法。
      

  6.   

    利用sql里面的inserted就可以获得最新插入或更新的数据,何必大费周章的用vb去
    获取那个更新值?
      

  7.   

    一个原因是 inserted 只在触发器里可用。
    另一个原因是我需要对该值进行一个指定的处理过程。这个处理的方法实现,在数据库层次比较辛苦。不易调试。